[ROS] Custom message 생성

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

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

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

http://docs.ros.org/melodic/api/nav_msgs/html/msg/Odometry.html

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

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

이걸 custom message라고 한다.


만드는 방법

http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv

나는 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);

cout<<faceMsg.id<<endl;


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

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

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

from perception.msg import Object

 


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

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

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다