ROS2에서는 런치파일이 python 로 되어 있는데 이에 대해서 알아보고
간단하게 튜토리얼 처럼 런치파일 만드는 법을 소개한다
ROS와 ROS2에서 (melodic과 foxy)의 런치파일 형태가 다른 점이 눈에 띄었다
ROS에서는 xml을 사용을 했는데 예를 들면 launch 파일이 아래처럼 구성이 되었다
<launch>
<node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan_node">
</node>
</launch>
그러나 ROS2에서는 파이썬 코드를 사용하는 것이 큰 차이점으로 보인다
먼저 ROS2에서 런치파일을 실행을 하는 방식은 크게 다르지 않고
ros2 launch {패키지이름} {런치파일명} 형태로 사용한다
런치파일을 만들려면 패키지안에 launch 디렉토리를 만들어 주고,
그 안에 런치파일명.launch.py로 파이썬 파일로 만들어 주게 된다
ROS2가 파이썬으로만 런치파일을 만들 수 있는 것은 아니고
XML과 YAML 파일로도 런치 파일을 만들 수 있다고 한다
먼저 자신의 workspace를 만들어 준다 (디렉토리), 그리고 이동해준다
cd
mkdir -p test_ws/src
cd test_ws/src
이제 패키지를 만들어 준다. test_launch 부분은 자신이 만들고 싶은 패키지명을 적으면 된다
ros2 pkg create --build-type ament_cmake test_launch --dependencies rclcpp
test_launch 패키지가 만들어졌고 이동을 해서 launch 디렉토리를 만든 후 이동해서 런치파일을 만들어보자
cd test_launch
mkdir launch
cd launch
gedit rviz_test.launch.py
gedit 또는 code (vscode) 를 입력한 후 파일명을 적어주면 바로 파일이 만들어지면서 에디터가 열린다
또는 touch rviz_test.launch.py 처럼 파일만 만들어 준 후 원하는 에디터로 열어서 편집을 하면 된다
이제 런치파일을 작성하자
#!/usr/bin/env python3
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
# this is the function launch system will look for
def generate_launch_description():
# create and return launch description object
return LaunchDescription(
[
ExecuteProcess(
cmd=["ros2", "run", "rviz2", "rviz2"], output="screen"
),
]
)
그리고 저장 후 나온다
이제 런치 파일의 디렉토리를 지정을 해주기 위해서 패키지의 CMakeLists.txt 파일에 추가를 해줘야한다
여기에 추가를 안해주면 ros2 launch 명령어로 열 때 런치파일의 위치를 못 찾는 것 같다
gedit ~/test_ws/test_launch/CMakeLists.txt
파일을 열어서 제일 아래로 이동 한 후 아래와 같이 추가해준다
#install the launch directory
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
)
위에 PROJECT_NAME은 말그대로 PROJECT_NAME이고 똑같이 복붙 하면된다
이제 자신의 workspace로 이동한 후 빌드를 해준다
cd ~/test_ws
colcon build --symlink-install
이런 결과와 함께 빌드가 완료 된다
Starting >>> test_launch
Finished <<< test_launch [1.19s]
이제는 workspace의 변경사항을 알 수 있게 setup.bash파일을 실행한다
cd ~/test_ws
source install/setup.bash
아무런 표시가 나지 않는다. 이제 런치파일을 실행할 차례
ros2 launch {패키지명} {런치파일명.py}
ros2 launch test_launch rviz_test.launch.py
rivz 프로그램이 실행이 되었다
이번에는 다른 노드를 추가해서 여러개의 노드가 실행될 수 있게 해보자 먼저 다시 launch파일을 수정해준다
cd ~/test_ws/test_launch/launch
gedit rviz_test.launch.py
파일이 열리면 ExecuteProcess() 부분을 추가해준다
ExecuteProcess(
cmd=["ros2", "run", "turtlesim", "turtlesim_node"], output="screen"
),
cmd 커맨드 그대로 넘겨주는 것을 알 수 있다, ros2 run 패키지명 노드명
추가가 된다면 아래와 같은 모습이 된다
return LaunchDescription(
[
ExecuteProcess(
cmd=["ros2", "run", "rviz2", "rviz2"], output="screen"
),
ExecuteProcess(
cmd=["ros2", "run", "turtlesim", "turtlesim_node"], output="screen"
),
]
)
저장 후 런치파일을 다시 실행해보자. 이번에는 source를 할 필요는 없다
ros2 launch test_launch rviz_test.launch.py
rviz2노드와 turtlesim노드가 실행이 된 것을 볼 수 있다
위에서 했던 런치파일의 내용을 살펴보자
ExecuteProcess 함수 부분을 보면
cmd 변수를 이용해서 (리스트로) 사용하는 것을 알 수 있다
생략
ExecuteProcess(
cmd=["ros2", "run", "rviz2", "rviz2", "-d", rviz],
output="screen"
)
cmd 부분에는 마치 터미널에 커맨드로 입력하는 것과 비슷하고
output을 screen으로 지정하면 터미널에 결과물이 나오게 된다
generate_launch_description() 함수는 launch파일을 실행했을 때 이 함수를 실행하게 된다
이 함수는 모든 런치파일에는 있어야하는 함수이다
return 부분에서 LaunchDescription() 에서 어떤 노드를 실행하게 된다. (반드시 있어야 함)
LaunchDescription()내에서 위의 ExecuteProcess()로 리턴해서 노드를 실행할 수 있게 된다
만약 여러개의 노드를 실행하려면 여러개의 ExecuteProcess()을 넣어주면 된다