ROS

[ROS2] launch 파일 작성법

Magin 2024. 3. 8. 14:38
728x90

 먼저 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

 

728x90