本节对应赵虚左ROS书籍的2.1.2
以10hz,发布消息和消息的订阅
1) 在功能包的src文件夹下,新建cpp文件,并且写入
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"talker");ros::NodeHandle nh;ros::Publisher pub =nh.advertise<std_msgs::String>("chatter",100);std_msgs::String msg;std::string msg_front ="hello,你好!";int count =0;ros::Rate r(10);while(ros::ok()){std::stringstream ss;ss << msg_front << count;msg.data=ss.str();pub.publish(msg);ROS_INFO("发送消息为%s",msg.data.c_str());r.sleep();count++;ros::spinOnce();}return 0;
}
代码解释
1.1)包含ros头文件
#include "ros/ros.h"
包含消息类型头文件
#include "std_msgs/String.h"
1.2) 在主函数中
加入语句,防止中文乱码
setlocale(LC_ALL,"");
初始化节点
ros::init(argc,argv,"talker");
"talker"为节点名
实例化句柄
ros::NodeHandle nh;
实例化发布对象
ros::Publisher pub =nh.advertise<std_msgs::String>("chatter",10);
“chatter”为话题名,10为队列长度
组织数据
std_msgs::String msg;
std::string msg_front ="hello,你好!";
int count=0;
ros::Rate r(10);
循环发布数据
while(ros::ok())//节点不死
{std::stringstream ss;//用于拼接数据ss << msg_front << count;//拼接数据msg.data=ss.str();pub.publish(msg);//发布数据ROS_INFO("发送数据为 %s",msg.data.c_str());rate.sleep();count++;ros::spinOnce();}
2)在功能包的src文件夹下,新建cpp文件,并且写入
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr& msg_p)
{ROS_INFO("我接受到:%s",msg_p->data.c_str());
}
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"listener");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",100,doMsg);ros::spin();return 0;
}
代码解释:
实例化订阅对象
ros::Subscribe sub=nh.subscribe<std_msgs::String>("chatter",100,doMsg);
话题‘‘chatter’’ 必须与发布方的话题相同
100 :队列长度
doMsg :回调函数
有回调函数必须有回调循环函数
ros::spin();//回调循环函数ros::spinOnce();//在循环体中用的回调循环函数
doMsg回调函数具体写入
void doMsg(const std_msgs::String::ConstPtr& msg_p)
{ROS_INFO("接受到消息:%s",msg_p->data.c_str());
}
3) 配置CMakeLists文件
136行,149行
4)运行rosrun
rosrun <包名> <节点名>