系列文章目录
ROS学习第二章 自定义数据话题
前言
本学期我们开展了ros的学习课程,我对ros学习有着很浓的兴趣,因此在此记录我对ros学习的一些感悟,我的学习主要参考了B站【Autolabor初级教程】ROS机器人入门的课程及其文档。在第二章内容中,我主要阐述自定义数据话题通信的基本原理和代码实现。
一、使用步骤
1 自定义数据类型(CPP)
在src目录底下创建一个msg文件夹,用于存放自定义数据类型,这里以自定义数据类型person为例
代码如下(示例):
string name
int32 age
float32 height
2 添加依赖
在package.xml中添加依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
在cmakelist中配置相关文件
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation //主要添加这一响
)
add_message_files(
FILES
person.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES plumbing_pub_sub
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
3.1 实现话题的发布(CPP)
代码如下(示例):
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
/*
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 发布者 对象
5.组织被发布的数据,并编写逻辑发布数据
*/
int main(int argc,char *argv[])
{
ros::init(argc,argv,"talker_person");
ros::NodeHandle nh;
ros::Publisher pub= nh.advertise<plumbing_pub_sub::person>("chat",10);
plumbing_pub_sub::person p;
p.name="dmh";
p.age=1;
p.height=1.65;
ros::Rate rate(1);
while (ros::ok())
{
/* code */
pub.publish(p);
p.age++;
ROS_INFO("My name: %s, age: %d, height: %2f",p.name.c_str(),p.age,p.height);
rate.sleep();
ros::spinOnce();
}
return 0;
}
3.2 实现话题的订阅(CPP)
代码如下(示例):
#include "ros/ros.h"
#include "plumbing_pub_sub/person.h"
/*
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 订阅者 对象
5.处理订阅的消息(回调函数)
6.设置循环调用回调函数
*/
void Person_Call_Back(const plumbing_pub_sub::person::ConstPtr p)
{
ROS_INFO("My name: %s, age: %d, height: %2f",p->name.c_str(),p->age,p->height);
}
int main(int argc,char *argv[])
{
ros::init(argc,argv,"listener_person");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chat",10,Person_Call_Back);
ros::spin();
return 0;
}
总结
自定义的数据类型的发布很简单,但值得注意的是,自定义数据必须对cmakelist和package进行修改,这点对于很多初学者来说不是很友好。