[ROS] Custom message 생성

ROS에서 message는 노드가 서로 주고받는 데이터를 말한다.

custom message는 기존 message type으로 표현하기 어려울 때, 직접 만들어 사용할 수 있다.

예를 들어, 로봇의 odometry는 이미 정해진 구조가 있다. 이 구조를 활용하는 편이 훨씬 좋다.


나 같은 경우, 물체에 대한 정보를 서로 주고 받고싶다.

마땅히 사용할 message type이 없다면, 이 때 물체에 대한 구조를 새로 정의할 수 있다.

이걸 custom message라고 한다.

만드는 방법


나는 Object라는 message type을 만들어보려고 한다.

프로젝트 내에 msg라는 폴더를 생성하고, 원하는 메시지를 정의한다.

  • 작성자는 Object.msg라는 이름으로 만들었다.
  • 내부에는 이것저것 많이 들어있다.
  • # 은 주석이다.

Cmakelists.txt 에서 추가할 것을 본다.

  • find_package에 message_generation를 추가한다. (중요)
  • Cmakelists에서 정의한 Object.msg 를 add_message_files에 추가한다.
  • message를 추가하기 위해서는 dependencies를 설정해줘야 한다.
  • 만약에 odometry_msgs를 element로 쓰고 싶다면, 넣으면 된다.

사용 방법

위와 같이 셋팅을 한 후, catkin_make로 빌드한다.

코드 상에서 어떻게 사용하는지 보자.

사실, 다른 메시지랑 똑같이 사용하면 된다. include만 잘 하면 된다.

  • C++에서  메시지를 사용하기 위해서 메시지를 include를 해야한다.
  • #include “프로젝트 명/message 이름.h”
  • 나 같은 경우는 #include “perception/Object.h”가 된다.

다음은 publish를 해보겠다.

publisher를 정의한다.

gFacePublisher = nh.advertise<perception::Object>(“face”,1);

그리고 메시지 객체를 정의한다.

정의한 메시지 객체에 데이터를 넣고 publish!

이렇게 publish를 하면 된다.

subscriber도 다른 메시지와 사용방법이 같다.

ros::Subscriber gFaceSubscriber = nh.subscribe(“face”, 1, faceCallback);

void faceCallback(const perception::Object& faceMsg);


Python에서도 비슷하게 사용하면 되는데

import할 때 아래처럼 하면 된다.

나머지 사용방법은 다른 메시지와 같다.

from perception.msg import Object


즉, msg 폴더와 Cmakelists.txt에 정의만 잘 해놓으면

다른 메시지들과 똑같이 사용하면 된다.

[ROS] What is ros-control




  • A set of packages that include controller interfaces, controller managers, transmissions and hardware_interfaces.
  • The ros_control packages are a rewrite of the pr2_mechanism packages to make controllers generic to all robots beyond just the PR2.
  • The ros_control packages takes as input the joint state data from your robot’s actuator’s encoders and an input set point. It uses a generic control loop feedback mechanism, typically a PID controller, to control the output, typically effort, sent to your actuators. ros_control gets more complicated for physical mechanisms that do not have one-to-one mappings of joint positions, efforts, etc but these scenarios are accounted for using transmissions.


There are some modules.

  • Controller manager
  • Controller
  • Hardware interface

ros control



Controller don’t care which module (simulation or hardware) provide data.

Controller needs joint state info and joint command info.



There are many controller on ros-control.

I used joint state_controller and joint_trajectory_controller for head control.

You need to set control parameter (PID gain, velocity_ff, etc.)

In control.yaml, head_controller has two joint (pan_joint and tilt_joint) and make trajectories.

Trajectories are specified as a set of waypoints to be reached at specific time instants, which the controller attempts to execute as well as the mechanism allows. Waypoints consist of positions, and optionally velocities and accelerations.



controller_manager manages some controllers

controller_manager needs to load controllers.

<!– Load joint controller configurations from YAML file to parameter server –>
<rosparam file=”$(find cam_pan_tilt)/config/control.yaml” command=”load”/>

<node name=”controller_spawner” pkg=”controller_manager” type=”spawner” respawn=”false”
output=”screen” ns=”/gretchen” args=”joint_state_controller




How to connect real robot

need to costruct hardware_inferface

It is hardware_interface example.

  • https://github.com/ros-controls/ros_control/wiki/hardware_interface

ROBOTICS made hardware_interface of dynamixel motor for ros-control.


1) Head Controller

Head controller control pan and tilt. input of the controller is tf, joint_states, head_controller/state

  • tf
    • tf is relationship between frames
    • tf is a package that lets the user keep track of multiple coordinate frames over time. tf maintains the relationship between coordinate frames in a tree structure buffered in time, and lets the user transform points, vectors, etc between any two coordinate frames at any desired point in time.

  • joint_states
    • it is raw data from motor controller

  • head_controller/state
    • desired, actual, error check for control
    • it is calculated by controller.


  • head_controller/command
    • set radian postion at each joint

2) Other robot

You can easily control the robot manipulator using ros-control and moveit.

3) Simple pan title model

1. User click a point

2. make target_line using the point

Target_line consist of those

  • geometry_msgs/PointStamped target
  • geometry_msgs/Vector3 pointing_axis
  • string pointing_frame
  • duration min_duration
  • float64 max_velocity

3. calculate inverse kinematics for getting joint angles

4. publish angle on each joint

5. move

Why it is need?

Once control part constructed using ros-package.

Perception part focus recognition and just publish u,v.


  • http://wiki.ros.org/ros_control
  • http://gazebosim.org/tutorials/?tut=ros_control
  • http://wiki.ros.org/joint_trajectory_controller
  • https://pinkwink.kr/1013
  • https://github.com/ros-controls/ros_control/wiki/hardware_interface