一、Topic和Message
1.两个节点通过话题的名称进行建立通讯连接
2.话题中通讯的数据叫做Message
二、Publisher和Subscriber
(一)Publisher
1.生成ros句柄
ros::NodeHandle nh;
2.创建一个发布者pub并确定消息类型和话题名
ros::Publisher pub = nh.advertise<消息类型>("话题名",队列长度)
//话题名只能是字母、数字、下划线,不能有空格
eg.ros::Publisher pub = nh.advertise<std_msgs::String>("topicname",10);
注意消息类型要在头文件声明,比如
#include <std_msgs/String.h>
3.声明一个消息包msg
<消息类型> msg;
eg.std_msgs::String msg;
4.将要发布的消息赋值
msg.data = "要发送的消息";
//一般为data
5.发布
pub.publish(msg);
发布者把消息msg发布到话题中
(二)Subscriber
1.生成ros句柄nh
2.建立publisher sub(名字可以自定义
ros::Subscriber sub = nh.subscribe<消息类型>("话题名", 缓存区长度 ,话题的回调函数);
eg. ros::Subscriber sub = nh.subscribe<消息类型>("topicname", 10 ,chao_callback);
注意消息类型要在头文件声明
3.在主函数前写一个回调函数(每接收到一次消息包就调用一次)
void 回调函数名(消息类型 消息名称)
{
}
eg.
void chao_callback(std_msgs::String msg)
{
printf(msg.data.c_str());
}
4.在主函数的while循环中加上ros::spinOnce();
ros::spinOnce();
这样程序在while循环中,执行到这里的时候就会检查一下有没有消息包,这样接收到的话才会去调用回调函数
三、其他工具
(一)rostopic
1.rostopic list
查看当前活跃着的话题
2.rostopic echo /话题名
查看当前正在运行的该话题发布的消息
3. echo -e 中文字符乱码(Unicode编码)
转换中文字符的Unicode编码
4.rostopic hz /话题名称
查看当前话题发送的频率
(二)控制循环频率的指令
ros::Rate <name>(频率);
eg.ros::Rate loop_rate(10); //一秒执行十次
while()
{
loop_rate.sleep(); //使循环休眠到符合我们要求的频率
}
可以控制消息发送的频率