여태까지 ros2 run으로만 c++ executable를 실행했었다. 커맨드를 일일이 다 치는 것도 너무 번거롭다. 더 쉬운 방법이 없을까?
오늘은 ros2 run보다 더 많은 기능을 제공하는 ros2 launch에 대해 배워보자.
<목표>
ROS2 package의 executable을 실행할 수 있는 launch파일을 작성해본다.
<예상 소요 시간>
약 10분
<영상 tutorial>
링크텍스트
launch파일은 한번에 단일 node만 실행할 수 있는 ros2 run과는 다르게 여러 node들을 실행 할 수 있게 해주며 node의 특징을 결정 짓는 parameter도 정의할 수 있다.
이 밖에도 더 여러 기능이 있지만 일단 node들을 구성하고 관리하는데 도움을 주는 파일정도라고 기억하고 있으면 된다.
먼저 launch파일을 위치시킬 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
일반적으로 ROS2의 launch파일은 패키지내 launch라는 경로에 위치한다.
우선 launch라는 폴더를 다음과 같이 패키지내 생성해주자.
cd ~/launch_ws/src/cpp_launch_example
mkdir launch
(결과 예시)
추가로 ROS2는 install폴더에 설치된 파일들에 접근해서 프로그램을 실행하는데, 이 작업을 CMakeLists.txt에서 다음과 같이 launch폴더를 추가함으로써 install경로에 launch 폴더를 설치할 수 있다.
# Install launch files.
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
)
(visual code editor에서 추가한 결과 예시)
이제 launch파일을 작성해야하는데 몇가지 참고해야하는 규칙이있다.
위의 규칙에 따라 my_script_launch.py라는 launch 파일을 만들자.
cd ~/launch_ws/src/cpp_launch_example/launch
gedit 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'),
])
new file을 클릭하여 my_script_launch.py를 생성
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'),
])
(결과 예시)
위와 같이 launch파일을 작성하기 위해서 필요로 하는 요소는 다음과 같다.
따라서 위의 launch파일을 정리해보면
'demo_nodes_cpp'라는 package에서 'talker'라는 executable를 'talker'라는 node 이름을 갖도록 실행한다고 작성한 것이다.
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 작성 방법 요약
import를 하고 generate_launch_description()같은 이름긴 함수들이 많아 복잡해보이지만 launch파일을 만들 때 반복 되는 부분이라 자기 나름의 예시 launch.py를 작성해서 잘 저장해놨다가 필요할 때 보고 새로운 launch.py를 작성하면된다.
그러니 함수나 객체 이름을 외울 걱정은 No! 대신 들어가야하는 구성들을 위의 요약처럼 흐름을 외워두도록 하자!
다음 시간에는 ROS2의 더 어려운 개념을 배워보거나 여태까지 배운 내용들에 대한 연습문제를 다뤄볼 예정이다.
오늘도 여기까지 온 스스로를 칭찬해주자!
질문하고 싶거나 인공지능 & 로봇 개발에 대해 다뤄줬으면 하는 주제를 댓글로 남겨주기 바란다~!
문의메일: irobou0915@gmail.com
https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Using-Parameters-In-A-Class-CPP.html 이 부분 공부 중인데요. launch 파일 만들고 실행하면 처음에만 earth가 실행되고 그 뒤부터는 cpp_parameters_node.cpp에서 파라미터를 정의할때 파라미터의 값으로 지정한 world가 실행되는데 이게 맞는건가요? 아니면 틀린건가요?