0 自定义msg引入背景
在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如: 激光雷达的信息… std_msgs 由于描述性较差而显得力不从心,这种场景下可以使用自定义的消息类型.
1 自定义msg类型
1> 定义msg文件
功能包下新建msg文件夹,添加文件person.msg
string name uint16 age float64 height
2> 修改配置文件
package.xml中添加依赖项与执行依赖
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
CMakeLists.txt添加msg相关配置
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ) # 需要加入 message_generation,必须有 std_msgs
## 配置 msg 源文件 add_message_files( FILES Person.msg )
# 生成消息时依赖于 std_msgs generate_messages( DEPENDENCIES std_msgs )
#执行时依赖 catkin_package( # INCLUDE_DIRS include # LIBRARIES demo02_talker_listener CATKIN_DEPENDS roscpp rospy std_msgs message_runtime # DEPENDS system_lib )
2 话题通信调用msg示例
topic_msg_pub.cpp
#include "ros/ros.h" #include "demo02_talker_listener/Person.h" int main(int argc, char *argv[]) { setlocale(LC_ALL,""); //1.初始化 ROS 节点 ros::init(argc,argv,"talker_person"); //2.创建 ROS 句柄 ros::NodeHandle nh; //3.创建发布者对象 ros::Publisher pub = nh.advertise<demo02_talker_listener::Person>("chatter_person",1000); //4.组织被发布的消息,编写发布逻辑并发布消息 demo02_talker_listener::Person p; p.name = "sunwukong"; p.age = 2000; p.height = 1.45; ros::Rate r(1); while (ros::ok()) { pub.publish(p); p.age += 1; ROS_INFO("我叫:%s,今年%d岁,高%.2f米", p.name.c_str(), p.age, p.height); r.sleep(); ros::spinOnce(); } return 0; }
topic_msg_sub.cpp
#include "ros/ros.h" #include "demo02_talker_listener/Person.h" void doPerson(const demo02_talker_listener::Person::ConstPtr& person_p){ ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height); } int main(int argc, char *argv[]) { setlocale(LC_ALL,""); //1.初始化 ROS 节点 ros::init(argc,argv,"listener_person"); //2.创建 ROS 句柄 ros::NodeHandle nh; //3.创建订阅对象 ros::Subscriber sub = nh.subscribe<demo02_talker_listener::Person>("chatter_person",10,doPerson); //4.回调函数中处理 person //5.ros::spin(); ros::spin(); return 0; }
3 配置CMakeLists.txt
需要添加 add_dependencies 用以设置所依赖的消息相关的中间文件。
add_executable(person_talker src/person_talker.cpp) add_executable(person_listener src/person_listener.cpp) add_dependencies(person_talker ${PROJECT_NAME}_generate_messages_cpp) add_dependencies(person_listener ${PROJECT_NAME}_generate_messages_cpp) target_link_libraries(person_talker ${catkin_LIBRARIES} ) target_link_libraries(person_listener ${catkin_LIBRARIES} )
4 执行
1.启动 roscore;
2.启动发布节点;
3.启动订阅节点。