작성자: 박준규

최초작성 2023.01.25(수) 수정 2023.01.27(금)

Prompt

Turtlesim에서 아래 조건을 만족하면서 입력 명령을 받아 거북이를 등속원운동하게하는 ROS2 패키지를 설계해보자:

  1. 원운동의 회전반경(radius), linear velocity(velocity), 회전방향(direction) 값을 포함하는 ROS Message type (Topic type)를 정의하고 이 Topic Message를 받아 Turtlesim에 속도명령(cmd_vel)을 주는 Node를 설계한다.
  2. turtlesim 실행 후, ros2 topic pub으로 새롭게 정의한 메시지 타입을 publish하여 등속 원운동을 명령한다.
  3. roslaunch로 turtlesim과 설계한 프로그램을 동시에 실행할 수 있는 launch 파일을 제작한다.
  4. C++ / Python 등의 언어는 자유롭게 선택하여 진행한다.

Logic

Our custom node should:

  1. Subscribe to custom message Topic
    1. Should include radius, velocity, and direction

    2. We could name the message as TurtlesimUcmMsg (Turtlesim Uniform Circular Motion Message)

      <aside> 💡 .msg files should be named in camel case. Snake case will give you an error.

      </aside>

    3. We could name the topic as turtlesim_ucm

  2. Process the data from custom Topic into cmd_vel topic type
    1. The cmd_vel topic type is geometry_msgs/Twist
      1. linear.x in cmd_vel = velocity from TurtlesimUcmMsg
      2. angular.z in cmd_vel = velocity/radius from TurtlesimUcmMsg
  3. Publish to turtlesim_node node using cmd_vel topic.

Implementation

<aside> ⚠️ Since calling rosidl_generate_interfaces and ament_python_install_package in the same CMake project does not work, we need to create a package for the message, and another package for the processing of data. See this Github issue for more info. It is best practice to instead separate out the message generation into a separate package. https://github.com/osrf/buoy_msgs/pull/20 https://github.com/ros2/ros2_documentation/pull/2882 https://github.com/ros2/rosidl_python/issues/141

</aside>

Creating a new package for the message

Let’s first make a new package called ts_circle_msg (turtlesim_circle_message):

cd ~/ros2_workspace/src

#since custom messages and services can only be made in a C++ package:
ros2 pkg create --build-type ament_cmake ts_circle_msg