ROS2 메시지 패키지 만들기, 메시지 정의하기
메시지 정의 패키지 만들기
패키지는 src 폴더에서 만들어야한다.
ros2 pkg create --build-type ament_cmake my_first_package_msgs
이전에 패키지를 만들 때에는 ament_python을 썼는데
c++ 문법을 쓰진 않지만 ament_python이 메시지 빌드가 안되기 때문
기존에 만든 <패키지 이름> 에서 사용할 메시지를 정의할 것이기에
<패키지 이름>_msgs 라는 이름의 패키지를 만듦
- 왜 데이터 타입이 있는 패키지를 따로 분리해서 만드냐?
- 메시지만 따로 빌드할 수 있다
- 로봇의 버전이 달라도 원격 pc에서 핸들링이 쉽다..?
새로운 패키지가 만들어졌음을 볼 수 있다.
setup.py 대신 CMakeLists.txt 파일이 있다.
메시지 정의 파일 만들기
만든 패키지 폴더에 들어가서 msg 폴더를 만든다.
그리고 CmdAndPoseVel.msg 파일을 만들어준다.
float32 cmd_vel_linear
float32 cmd_vel_linear
float32 pose_x
float32 pose_y
float32 linear_vel
float32 angular_vel
파일 인식시키기
이전에 만든 노드가 들어가는 패키지에서 새로운 파일을 만들어서 setup.py를 수정했다면
이번에는 CMakeLists.txt 파일을 수정하여 만든 파일이 있음을 인식시켜줄 것이다.
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/CmdAndPoseVel.msg"
)
그리고 package.xml 파일도 수정해야한다.
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
터미널로 돌아와서 워크스페이스 폴더에서 빌드하면 만든 메시지 타입을 인식할 수 있다.
참고로 xml 파일을 수정하지 않았더니 다음과 같은 오류가 발생했다.
--- stderr: my_first_package_msgs
CMake Error at /opt/ros/humble/share/rosidl_cmake/cmake/rosidl_generate_interfaces.cmake:229 (message):
Packages installing interfaces must include
'<member_of_group>rosidl_interface_packages</member_of_group>' in their
package.xml
Call Stack (most recent call first):
CMakeLists.txt:16 (rosidl_generate_interfaces)
그리고 왜인지 워크스페이스의 install 폴더에 local_setup.bash 파일이 없다고 나왔다.
-bash: /home/hyeop/ros2_ws/install/local_setup.bash: No such file or directory
알고보니 colcon build 명령으로 빌드를 하는 과정에서 터미널에
Summary: 2 packages finished [3.65s]
가 나왔지만 다음 명령 입력이 불가하길래 그냥 넘어갔는데
패키지 빌드가 완료되지 않은 것이었고
조금 더 기다리니 패키지 빌드가 완료되었다.
이후 아래 명령으로
ros2 interface show my_first_package_msgs/msg/CmdAndPoseVel
내가 만든 메시지의 구조를 볼 수 있다.
물론 tab을 이용해 입력 가능하며 안된다면 빌드가 제대로 되지 않은 것이다.