创建ros发布者
该篇为发布者Talker.cpp,后面文章会有Listener.cpp对应代码和CMakeLists.txt设置直接与该篇相连。
本人是理科生,做这文档也是为了以后生活中害怕忘记,而发布的,并且希望能帮到大家,发布的越多,入坑起来的快。入坑可难受了,天天抠头发。
注:有点详细,免得大家抠头发,阅读可以直接看代码。
我的代码可以不用订阅者Subscriber也可以使用,记得使用前要在终端打开roscore,还有代码的编译catkin_make
配套代码连接区:
配套订阅者Listener
配套CMakeLists.txt设置
详细解读版
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
//初始化节点,前面两个参数ros默认可以不管,直接背
//第三个参数是节点名字,建议和文件名一样,这样出现节点名相同时好排查
//因为在ros节点名字不能出现两个及以上的节点名相同
ros::init(argc, argv, "Talker");
//创建节点句柄,ros默认可以不管,直接背
ros::NodeHandle n;
//向Master注册一个Publisher(P为大写),并通过TalkMsg传播方式发布String类型的信息,在订阅端通过TalkMsg接收该文件发送的信息
//缓冲队列大小为1000
ros::Publisher TalkMsg_pub = n.advertise<std_msgs::String>("TalkMsg", 1000);
//设置一个调用时间时间,每调用一次( 1/5=0.2s )
ros::Rate work_rate(5);
//初始一个计数的单位,这个可以不要设置的,无影响
int count = 0;
//进入while判断,只要该ros节点无异常就是一直执行下去
while (ros::ok())
{
count+=1;
//将msg定义为String类型,方便打包发送
std_msgs::String msg;
//将AllMsgstringstream类型,方便数据组合
std::stringstream AllMsg;
//将我已成功发送第n信息装入AllMsg中
AllMsg << "to" << count <<"message"<<count*count;
//将AllMsg中的字符串数据存储在msg在
msg.data = AllMsg.str();
//这条代码可以不要,实现的功能是在该节点终端打印除发送消息
ROS_INFO("%s", msg.data.c_str());
//发布封装好的消息
TalkMsg_pub.publish(msg);
//回调函数ros默认背下来就好了
ros::spinOnce();
//睡眠等待函数,调用一次,休息0.2s
work_rate.sleep();
}
return 0;
}
精简版
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "Talker");
ros::NodeHandle n;
ros::Publisher TalkMsg_pub = n.advertise<std_msgs::String>("TalkMsg", 1000);
ros::Rate work_rate(5);
int count = 0;
while (ros::ok())
{
count+=1;
std_msgs::String msg;
std::stringstream AllMsg;
AllMsg << "to" << count <<"message"<<count*count;
msg.data = AllMsg.str();
ROS_INFO("%s", msg.data.c_str());
TalkMsg_pub.publish(msg);
ros::spinOnce();
work_rate.sleep();
}
return 0;
}
运行结果