더 쉽게 프로그램 실행하세요. ROS2 Launch 파일 공략하기

IROBOU·2024년 2월 12일
3

인공지능_로봇개발

목록 보기
14/17
post-thumbnail

여태까지 ros2 run으로만 c++ executable를 실행했었다. 커맨드를 일일이 다 치는 것도 너무 번거롭다. 더 쉬운 방법이 없을까?

오늘은 ros2 run보다 더 많은 기능을 제공하는 ros2 launch에 대해 배워보자.


<목표>
ROS2 package의 executable을 실행할 수 있는 launch파일을 작성해본다.

<예상 소요 시간>
약 10분

<영상 tutorial>
링크텍스트


준비물


배경지식

launch파일은 한번에 단일 node만 실행할 수 있는 ros2 run과는 다르게 여러 node들을 실행 할 수 있게 해주며 node의 특징을 결정 짓는 parameter도 정의할 수 있다.

이 밖에도 더 여러 기능이 있지만 일단 node들을 구성하고 관리하는데 도움을 주는 파일정도라고 기억하고 있으면 된다.


실습

실습 1. package 생성

먼저 launch파일을 위치시킬 package를 생성하자.

  • workspace와 package만들기
cd ~/
mkdir -p launch_ws/src
cd launch_ws/src
ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_launch_example

실습 2. lauch 파일를 위한 경로 구성

일반적으로 ROS2의 launch파일은 패키지내 launch라는 경로에 위치한다.
우선 launch라는 폴더를 다음과 같이 패키지내 생성해주자.

cd ~/launch_ws/src/cpp_launch_example
mkdir launch

(결과 예시)

추가로 ROS2는 install폴더에 설치된 파일들에 접근해서 프로그램을 실행하는데, 이 작업을 CMakeLists.txt에서 다음과 같이 launch폴더를 추가함으로써 install경로에 launch 폴더를 설치할 수 있다.

  • CMakelist.txt 하단에 추가할 내용. 단, ament_package()라는 함수 보단 위에 추가해야한다.
# Install launch files.
install(DIRECTORY
  launch
  DESTINATION share/${PROJECT_NAME}/
)

(visual code editor에서 추가한 결과 예시)

실습 3. launch파일 작성하기

이제 launch파일을 작성해야하는데 몇가지 참고해야하는 규칙이있다.

  • launch파일 이름은 마음대로 정해도된다.
  • 그렇지만 ros2 launch라는 명령어를 사용하기 위해서 launch 파일 이름에 launch.py를 넣어줘야한다.

위의 규칙에 따라 my_script_launch.py라는 launch 파일을 만들자.

  • gedit을 이용해서 launch파일 생성하는 법
  1. launch파일 생성
cd ~/launch_ws/src/cpp_launch_example/launch
gedit my_script_launch.py
  1. my_script_launch.py에 다음 내용을 추가
import launch
import launch_ros.actions

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package='demo_nodes_cpp',
            executable='talker',
            name='talker'),
  ])
  • visual code로 만드는 법
  1. new file을 클릭하여 my_script_launch.py를 생성

  2. my_script_launch.py에 다음 내용을 추가

import launch
import launch_ros.actions

def generate_launch_description():
    return launch.LaunchDescription([
        launch_ros.actions.Node(
            package='demo_nodes_cpp',
            executable='talker',
            name='talker'),
  ])

(결과 예시)

실습 3.1. 코드 분석

위와 같이 launch파일을 작성하기 위해서 필요로 하는 요소는 다음과 같다.

  • generate_launch_description()이라는 함수 정의하기
  • launch.LaucnDescription()이라는 객체를 return하기
  • launch.LaucnDescription()객체내에 launch_ros.actions.Node를 이용해 실행하고자 하는 Node 정보를 추가해주기
  • launch.LaucnDescription()객체 인자로 대괄호를 사용하고 있으므로 launch_ros.actions.Node형태의 여러 노드가 올 수 있는 것을 참고
    -이때 launch_ros.actions.Node에는 package 정보, executable 정보, node name정보 등이 포함되어 있어야한다.

따라서 위의 launch파일을 정리해보면
'demo_nodes_cpp'라는 package에서 'talker'라는 executable를 'talker'라는 node 이름을 갖도록 실행한다고 작성한 것이다.

실습 4. launch 파일 빌드하기

lauch파일을 작성했으면 workspace에서 colcon build해주자

cd ~/launch_ws
colcon build

성공적으로 빌드했으면 ros2 launch를 이용해 다음과 같이 launch파일을 실행해준다.

cd ~/launch_ws
source install/setup.bash
ros2 launch cpp_launch_example my_script_launch.py

정상적으로 실행되면 다음과 같이 terminal에 메세지가 뜨는 것을 관찰 할 수 있다.

참고사항

이번에 실행했던 프로그램은 굉장히 간단했기 때문에 launch.py 파일도 굉장히 단순했다. 그렇지만 좀 더 많은 node를 구성하고 관리하는 경우 더 복잡한 launch.py를 작성해야한다.

그렇지만 아직까지 우리들이 다루는 실습은 그렇게 복잡한 launch파일을 필요로 하지 않으므로 일단 한개의 node를 실행하는 lauch파일을 작성하는 배우는 법에 대해서만 배우도록 하고 나중에 더 고도화된 프로그램을 실행할 때 더 자세히 배워보도록 하자.


오늘은 간단한 node를 실행할 수 있는 launch.py 작성법에대해 알아봤다.

다시 한번 launch.py를 작성할 때 들어가야 하는 요소를 정리하면 다음과 같다.

launch.py 작성 방법 요약

  • launch파일 이름이 꼭 launch.py로 끝나야 ros2 launch에서 인식가능함.
  • packag이름
  • pakcag내 executable 이름
  • executable의 node이름
  • 더 복잡할 경우 다른 정보도 필요하지만 필요하면 배우는 걸로!

import를 하고 generate_launch_description()같은 이름긴 함수들이 많아 복잡해보이지만 launch파일을 만들 때 반복 되는 부분이라 자기 나름의 예시 launch.py를 작성해서 잘 저장해놨다가 필요할 때 보고 새로운 launch.py를 작성하면된다.

그러니 함수나 객체 이름을 외울 걱정은 No! 대신 들어가야하는 구성들을 위의 요약처럼 흐름을 외워두도록 하자!

다음 시간에는 ROS2의 더 어려운 개념을 배워보거나 여태까지 배운 내용들에 대한 연습문제를 다뤄볼 예정이다.


오늘도 여기까지 온 스스로를 칭찬해주자!

질문하고 싶거나 인공지능 & 로봇 개발에 대해 다뤄줬으면 하는 주제를 댓글로 남겨주기 바란다~!

문의메일: irobou0915@gmail.com

오픈톡 문의: https://open.kakao.com/o/sXMqcQAf

IRoboU 유튜브 채널

참고 문헌

profile
지식이 현실이 되는 공간

2개의 댓글

comment-user-thumbnail
2024년 2월 24일

https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Using-Parameters-In-A-Class-CPP.html 이 부분 공부 중인데요. launch 파일 만들고 실행하면 처음에만 earth가 실행되고 그 뒤부터는 cpp_parameters_node.cpp에서 파라미터를 정의할때 파라미터의 값으로 지정한 world가 실행되는데 이게 맞는건가요? 아니면 틀린건가요?

1개의 답글