利用ros节点将所需要的数据发送出去

  • 先创建publisher和subscriber

  • 在其中一个文件中创建对象为

1
2
ros::Publisher chatter_pub  = n.advertise<std_msgs::UInt8MultiArray>("chatter_mpu,1000);
ros::Subscriber sub = n.subscribe("chatter_pc", 1000, chatterCallback);
  • 在另一个文件中创建
1
2
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter_pc", 1000);
ros::Subscriber sub = n.subscribe("chatter_mpu", 1000, chatterMPUCallback);
  • 对于以上代码说明

一个publisher对应一个advertiser,其话题的名字应该一样

第二个参数是有关发送频率的,单位为赫兹

subscriber的最后一个参数表示接收回调函数的名字,类似于中断回调

可以利用std_msgs修改发送的相关数据格式,比如chatter_mpu话题下采用8位数组(字符数组)作为发送格式,chatter_pc话题则为字符串

  • chatter_mpu的接收回调,回收16进制数据的前两个
1
2
3
4
void chatterMPUCallback(const std_msgs::UInt8MultiArray::ConstPtr& msg)
{
ROS_INFO("I heard: [%x]", msg->data[0]);
}
  • chatter_pc的接收回调,回收字符串
1
2
3
4
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
  • 发送端数据格式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int count = 0;
while (ros::ok())
{
//use for message transporting
std_msgs::String msg;
std::stringstream ss;
//report
ss << "hello world " << count;
msg.data = ss.str();
//log
ROS_INFO("%s", msg.data.c_str());
//publish core
chatter_pub.publish(msg);
//spin for once
ros::spinOnce();
//sleep for a while
loop_rate.sleep();
++count;
}
  • 一个重要的函数是spinOnce(),类似于一种发送阻塞,它还有一个姊妹就是ros::spin(),只有调用了这个函数才可以发出来,两个函数的区别是,spin会直接卡在发送位置终止程序,而spinonce发送完会取消阻塞,继续进行程序。