[ROS2] launch 파일 작성법
먼저 ROS1에서 Launch 파일은 XML형식의 파일로 작성을 진행하였는데,
ROS2로 넘어와서는 Python파일로 작성하게 되었다. (Python만 가능한 것은 아님!!)
*먼저 이번 포스트에서 예시로 보여드리기 위해 아래 튜토리얼 코드를 예시로 사용할 예정입니다.
GitHub - Road-Balance/gcamp_ros2_basic
Contribute to Road-Balance/gcamp_ros2_basic development by creating an account on GitHub.
github.com
먼저 실행시키는 명령어는 다음과 같다.(이전 ROS1과 크게 달라지진 않았다.)
ros2 launch <패키지명> <실행시킬 launch 파일명>
먼저 Launch 파일 문법에는 크게 다음과 같다.
1. Generate_launch_description
- roslaunch를 실행시키면, 이 이름을 가지고 찾아들어가기 때문에 launch파일에서 가장 먼저 보이는 부분이다.
2. LaunchDescription
- 이 부분에서는 말 그대로, 어떤 Node들을 실행시킬지 기술해둔 Description을 작성합니다. 다만 특정한 규칙으로 실행시킨 Node에 대한 옵션을 지정해주어야 하며, 여러 Node들의 실행이 필요할 수 있기에, 기본적으로 list의 구조를 가짐을 파악할 수 있습니다.
3. ExecuteProcess
- 프로세스 하나를 실행시킨다는 구분의 개념으로 생각하시면 된다.
- cmd : 아래 커먼트로 해당 노드를 실행 시킬 때 사용한다. "," 나눠진 부분은 스페이스바로 구분하여 명령어 작성하면 된다.
- output : Error log 등의 output이 출력되는 수단을 입력한다.
ExecuteProcess 예시
rviz_start = ExecuteProcess(
cmd=["ros2", "run", "rviz2", "rviz2", "-d", rviz_config], output="screen"
)
4. Node
- package**:** 실행 시킬 노드가 포함 되어있는 패키지명
- executable: 실행 시킬 노드 파일명
- parameters: 실행 시킬 Node의 매개 변수 추가
Node 예시
spawn_entity = Node(
package='gazebo_ros',
executable='spawn_entity.py',
output='screen',
arguments=['-topic', 'robot_description', '-entity', 'skidbot'],
)
turtlebot_state_publisher = Node(
package="robot_state_publisher",
namespace=namespace,
executable="robot_state_publisher",
output="screen",
parameters=[{"use_sim_time": False,
"publish_frequency": 10.0}],
remappings=remappings,
arguments=[urdf],
)
5. IncludeLaunchDescription
- 해당 함수를 통해 다른 패키지의 노드 실행도 가능하여 유용하다.
직접 만든 것이 아닌 다른 패키지에서 가져온 것도 활용하여 실행 할 수 있다.
# Start Gazebo server
start_gazebo_server_cmd = IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(pkg_gazebo_ros, 'launch', 'gzserver.launch.py')),
launch_arguments={'world': world_path}.items()
)
#같은 패키지에 속한 런치 파일을 불러올 경우
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
[ThisLaunchFileDir(), '/xxxxx.launch.py']),
),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
[ThisLaunchFileDir(), '/yyyyy.launch.py']),
),
#다른 패키지에 속한 런치 파일을 불러올 경우
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
#bbbbb라는 다른 패키지의 이름을 입력해 준다
[get_package_share_directory('bbbbb'), '/launch/zzzzz.launch.py']),
),
# 직접 만든 Launch 파일일 경우)
해당 Launch파일이 사용자가 새로 직접만든 파일이라면 해당 파일이 속해있는 패키지에 CMakeList.txt 파일에 추가 해줘야한다.
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}
)
*향후 추가 작성 예정
# 참고)
1) https://velog.io/@hwang-chaewon/ROS-2040
2) https://puzzling-cashew-c4c.notion.site/ROS-2-Launch-launch-file-55c2125808ef4b64bade278852b37d6e