目录
1.重新创建一个软件包
进入src目录 输入 cd catkin_ws/src/——创建软件包 输入catkin_create_pkg 包名 依赖项列表
切换到vscode——点击左侧src中的acr_pkg——点击src——右键 创建节点ma_node
然后就可以在右侧写ma_node的代码啦!
2.创建订阅者及订阅话题
第一步 :先include两个头文件
第二步 :main主函数(会用自动补全)(删const)
第三步 :初始化节点
ros::init(argc,argv,"节点名称");
第四步 召唤大管家
ros::NodeHandle nh;
第五步 让大管家帮我们订阅一个话题(和发布类似)
先生成一个Subscriber对象(多了一个回调函数)(回调函数在订阅者接受到消息后会被程序自动调用执行)
ros::Subscriber sub = nh.subscribe("订阅的话题名称",缓存长度,回调函数);
在main函数前定义回调函数
里面的msg.data.c_str()是将string类型转换为字符数组类型,因为printf的参数类型是字符数组类型
⚠️:记得加输出\n,不然消息会连成一行
接着写循环
⚠️:里面要记得写ros::spinOnce()函数,让节点可以接受到消息包
3.编译节点
进入CMake文件——找到Build章节——找到add_executable这一行 复制——粘贴到文件末尾——找到target_link这一行 复制三行——粘贴到文件末尾——去掉注释(可先全选中它们,按下crtl /)——把节点名都修改为ma_node——编译
4.运行
启动ros核心——rosrun chao节点(发布者节点)——rosrun ma节点(订阅者节点)
5.调整和优化
①显示消息接收的频率
crtl c ma节点——将ma_node cpp中的printf改为ROS_INFO,删掉换行符——编译——重新run ma节点——oh no都是?
⚠️:因为ROS_INFO的编码方式会受程序的Locale环境设置影响,一般的程序会默认C的Locale设置,会让一些输出函数只支持英文字符的显示,需要将Locale设置为中文环境
设置步骤:
vscode——在main中调用
setlocale(LC_ALL,"");
——编译——重新启动节点
②再接收yao_node的消息
再定义一个Subscriber对象(名称,群名,回调函数要改变)——在main前定义回调函数——该用ROS_WARN来显示消息内容(消息显示黄色,与前面的白色消息区别)——保存——编译——运行yao_node——运行ma_node
③查看通讯网络图
再次分屏——执行rqt_graph——会弹出通讯关系图
④话题是谁的话题?
话题并不只属于发布者和订阅者,而是由ROS系统创建管理的,只要节点向大管家提出话题发布和订阅需求,话题就会自动被创建
6.小结
小tip:又一个常用工具rqt_graph
图形化显示当前系统活跃的节点以及节点间的话题通讯关系
只要在终端输入
rqt_graph