目录
1、建立工作目录
1.1建立文件
mkdir -p ZTest/src
cd ZTest
catkin_make
code.
1.2VScode内
打开VScode利用SSH连接主机到ZTest,对src目录执行:
建立工作包(自己命名),我这里命名的是plumbing_pub_sub
再弹出一个框输入:rospy roscpp std_msgs(依赖包)
1.3运行:
1.3、1.4是第二三部分撰写完毕后再执行的,第二部分建立的文件是demo01_pub.cpp(发送方文件),第三部分建立的是demo02_sub.cpp(接收方文件)
在文件撰写完毕后这样做
修改CMakeLists.txt(135行左右):
add_execytable(文件名(映射名称1) 文件地址)
target_link_libraries(同文件名(映射名称1)
{ }
)
修改完毕后:
先编译:shift+ctrl+b
再添加终端(bash):roscore(运行ros核心,运行一次即可)
再次添加终端(bash):source ./devel/setup.bash
rosrun 包名 文件名(映射名1) (eg rosrun plumbing_pub_sub demo02_sub)
1.4查看接受的信息
接受数据打印:
rostopic echo fang//打印键名为fang的信息
2、发送方
2.1文件结构
2.2代码及注释说明
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*
发布方:
1、包含头文件
ROS中文本类型-》std_msgs/String.h
2、初始化ROS
3、创建节点句柄
4、创建发布者对象
5、编写发布逻辑并发布数据
*/
int main(int argc,char *argv[])
{
setlocale(LC_ALL,"");//解决中文乱码问题
//2、初始化ROS节点
ros::init(argc,argv,"out");//发出
//3、创建节点句柄
ros::NodeHandle nh;
/*
4、创建发布者对象
nh.advertise<M>(string &topic,int32 queue_size);
M:发布类型
string:字符串类型,主题,自己定义
queue_size:消息长度(int32),用于缓冲,是queue类型,多了将前面的挤出
*/
ros::Publisher pub=nh.advertise<std_msgs::String>("fang",10);
/*
5、编写发布逻辑并发布数据
//要求以10HZ频率发布,文本后添加编号
//循环发布
*/
//先创建被发布的消息
std_msgs::String msg;
ros::Rate rate(1);//1HZ
//编写循环,循环中发布数据
//设置编号
int count=0;
//休眠三秒钟防止前几条数据不能发出,句柄还在注册
//ros::Duration(3).sleep();
while(ros::ok()){
count++;
msg.data="hello";
std::stringstream ss;
ss<<"hello"<<count;
msg.data=ss.str();
pub.publish(msg);//发布对象内容是msg
//添加日志:
ROS_INFO("发布的数据是:%s",ss.str().c_str());
rate.sleep();//睡0.1秒
ros::spinOnce();//处理回调函数
}
return 0;
}
3、订阅方
3.1文件结构
同2.1
3.2代码及注释说明
/*
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 订阅者 对象
5.处理订阅的消息(回调函数)
6.设置循环调用回调函数
*/
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr& msg_p){
//msg_p表示传入的消息,通过msg_p处理数据
ROS_INFO("我听见:%s",msg_p->data.c_str());
// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化 ROS 节点:命名(唯一)
ros::init(argc,argv,"listener");
//3.实例化 ROS 句柄
ros::NodeHandle nh;
//4.实例化 订阅者 对象
//使用回调函数处理接受到的数据
ros::Subscriber sub = nh.subscribe<std_msgs::String>("fang",10,doMsg);
//5.处理订阅的消息(回调函数)
//6.设置循环调用回调函数
ros::spin();//循环读取接收的数据,并调用回调函数处理
return 0;
}
4、运行结果
发送方:
订阅方: