[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(“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에 정의만 잘 해놓으면


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


This page is synchronized from the post: ‘[ROS] custom message 생성’

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×