ROS笔记——创建简单的主题发布节点和主题订阅节点
在安装好ROS后,接着学习如何创建节点和节点之间的通信方式,以一个简单的主题发布节点和主题订阅节点说明。
节点是连接ROS网络等可执行文件,是实现某些功能的软件包,也是一个主要计算执行的进程。
一、创建工作空间
创建新文件夹,名字自定义,路径也根据自己设定。
cd ~mkdir -p ros_workspace
创建好后,就需要将次路径添加到ROS_PACKAGE_PATH中。
查看目前ROS的工作空间,
echo $ROS_PACKAGE_PATH
一般显示如下:
/opt/ros/kinetic/share
下面将路径添加到~/.bashrc中
echo "export ROS_PACKAGE_PATH=~/ros_workspace:${ROS_PACKAGE_PATH}" >> ~/.bashrc . ~/.bashrc
再次查看ROS正在使用的空间,确保路径正确添加。
二、创建ROS功能包
打开ROS工作目录:
cd ~/ros_workspace
在该目录下创建功能包:
roscreate-pkg test1_tutorials std_msgs rospy roscpp
功能包文件夹下一般包括Makefile、manifest.xml、CMakeLists.txt、mainpage.dox等文件。
std_msgs 包含常见等消息类型
rospy py库
roscpp cpp库
运行命令,查看功能包是否创建
rospack find test1_tutorials
三、编写代码
1、主题发布节点
在功能包中创建src/test1_a.cpp,并添加代码:
1 #include "ros/ros.h" 2 #include "std_msgs/String.h" 3 #include <sstream> 4 5 6 int main(int argc, char **argv) 7 { 8 ros::init(argc,argv,"test1_a"); 9 ros::NodeHandle n; 10 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000); 11 ros::Rate loop_rate(10); 12 while(ros::ok()) { 13 std_msgs::String msg; 14 std::stringstream ss; 15 ss << "Hello test1_b! I am test1_a."; 16 msg.data = ss.str(); 17 ROS_INFO("%s",msg.data.c_str()); 18 chatter_pub.publish(msg); 19 ros::spinOnce(); 20 loop_rate.sleep(); 21 } 22 return 0; 23 }
第8行: 初始化,其中第三个参数是节点名称,在ROS系统中必须唯一。
第10行:声明主题message上发布一个消息类型为str_msgs::String的消息,并设置消息缓冲区的大小。
第11行:设置发送消息的频率 10HZ,它追踪自从上一次Rate::sleep()被唤醒之后的持续时间,并在到达时间后继续休眠。
第12行:ros::ok()函数返回值,在下列情况返回false。
- SIGINT句柄接收到Ctrl+C命令来结束;
- 被名称相同的节点提出ROS网络;
- ros::shutdown()被应用的另一部分唤醒。
第18行:把消息通过主题发布出去。
第19行:和下面test1_b.cpp程序ros::spin()进行对比,参考http://www.yfworld.com/?p=2318
2、主题订阅节点
在功能包中创建src/test1_b.cpp,并添加代码:
1 #include "ros/ros.h" 2 #include "std_msgs/String.h" 3 4 void chatterCallback(const std_msgs::String::ConstPtr &msg) 5 { 6 ROS_INFO("Hello test1_a! I am test1_b. I heard:[%s]",msg->data.c_str()); 7 } 8 9 int main(int argc, char **argv) 10 { 11 ros::init(argc,argv,"test1_b"); 12 ros::NodeHandle n; 13 ros::Subscriber sub = n.subscribe("message",1000,chatterCallback); 14 ros::spin(); 15 16 return 0; 17 }
第4-7行:回调函数,当一个新消息到达指定主题时即调用。
第17行:第一个参数指定订阅主题;第二个参数设置消息缓冲区的大小;第三个参数指定回调函数。
订阅节点需要做四件事情:
1)初始化;
2)从主题订阅消息;
3)然后等待消息到达;
4)当消息到达时,chatterCallback()被回调。
四、编译节点
编辑CMakeLists.txt文件,在末尾处添加如下代码:
rosbuild_add_executable(test1_a src/test1_a.cpp) rosbuild_add_executable(test1_b src/test1_b.cpp)
rosmake工具进行编译:
rosmake test1_tutorials
五、运行功能包
在运行功能包前,请确认节点管理器已经打开。使用下面的命令运行:
roscore
在不同的终端窗口分别运行:
rosrun test1_tutorials test1_a rosrun test1_tutorials test1_b
可以看到以下信息:
六、参考
http://wiki.ros.org/ROS/Tutorials
《ROS机器人程序设计》 刘品杰 译
(欢迎转载,转载请注明出处。)
转载于:https://www.cnblogs.com/xuanxiaochen/p/6013886.html
ROS笔记——创建简单的主题发布节点和主题订阅节点相关推荐
- ubuntu18.04 ROS melodic—创建简单的机器人模型smartcar
因为古月原来链接内容和新版本有些差异问题,现在最新版基础上整理下记录供参考 ROS探索总结(五)-创建简单的机器人模型smartcar 前面我们使用的是已有的机器人模型进行仿真,这一节我们将建立一个简 ...
- ROS笔记(16) ArbotiX
ROS笔记(16) ArbotiX 1. ArbotiX简介 2. 配置节点 3. 配置控制器 4. 运行仿真 1. ArbotiX简介 车模都搭好了,现在需要让小车动起来 此时需要一些工具 Arbo ...
- ROS入门笔记(十):编写与测试简单的消息发布器和订阅器(C++)
ROS入门笔记(十):编写与测试简单的消息发布器和订阅器(C++) 文章目录 01 导读 02 功能包的创建 03 功能包的源代码编写 3.1 编写发布器节点(talker.cpp) 3.2 编写订阅 ...
- ROS学习笔记12(用Python写一个简单的消息发布和消息订阅)
文章目录 1 写一个消息发布节点 2 写一个消息订阅节点 3 构建节点 1 写一个消息发布节点 $ roscd beginner_tutorials $ mkdir scripts $ cd scri ...
- ROS学习笔记11(用C++写一个简单的消息发布和消息订阅)
文章目录 1 写一个消息发布节点 2 写一个消息订阅节点 3 构建节点 1 写一个消息发布节点 首先切换到工作目录: roscd beginner_tutorials 接着,创建src/talker. ...
- ROS学习笔记13(测试一个简单的消息发布和消息订阅)
文章目录 1 运行消息发布 2 运行消息订阅 1 运行消息发布 $ roscore # In your catkin workspace $ cd ~/catkin_ws $ source ./dev ...
- ros订阅话题python_ROS入门教程 (写一个简单的消息发布器和订阅器 (Python))
Note: This tutorial assumes that you have completed the previous tutorials: 创建ROS消息和ROS服务. Descripti ...
- ROS探索总结(四)(五)(六)——简单的机器人仿真 创建简单的机器人模型smartcar 使用smartcar进行仿真
ROS探索总结(四)--简单的机器人仿真 前边我们已经介绍了ROS的基本情况,以及新手入门ROS的初级教程,现在就要真正的使用ROS进入机器人世界了.接下来我们涉及到的很多例程都是<ROS by ...
- 判断frame是否已创建_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
创建TF广播和监听 #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtle ...
- 使用方法 ros_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
创建TF广播和监听 #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtle ...
最新文章
- 机器学习(实战)泰坦尼克号(游客存活率预估)
- 2字节取值范围_第二篇——整数和浮点数在计算机中的表示(2)
- matlab有限差分一维导热,一维导热方程-有限差分法-matlab实现11.docx
- 华为服务器忘记管理密码怎么修改,忘记云服务器密码怎么修改
- 单片机小白学步系列(十四) 点亮第一个LED的程序分析
- 漫步微积分三十一——定积分的直观含义
- ‘mvn‘ 不是内部或外部命令,也不是可运行的程序
- php pdo 抛出异常模式,php实现的PDO异常处理操作分析
- Android 十年之路: 主屏与导航
- 钽电容失效、爆炸、烧毁的种种原因!
- 网络安全笔记-18-ICMP 协议
- 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
- 消失的2000万辆小黄车去哪儿了?
- 网络工程师高薪就业行业有哪些
- 【优化求解】基于多策略黑猩猩优化算法求解单目标优化问题附matlab代码
- Python之小数点位数的控制输出
- oracle pdb还原为no-cdb,12c PDB备份与恢复测试
- Unity Shader unity文档学习笔记(十七):径向模糊 实现类似冲锋时的速度感
- 北上广深杭房价高压下,这也许是程序员扎根的唯一出路...
- MNE库读取gdf数据文件
热门文章
- 关于 Hypervisor的理解
- 高仿富途牛牛-组件化-优秀的时钟
- 2017普实软件迎新年会报道
- 常用邮箱服务器地址大全截止2020-9
- Windows锁屏图片文件存放位置
- Android开发之打卡功能
- python图标变成了白色_桌面图标上有个白色文件图标怎么去掉?解决桌面图标白色方块挡住...
- Vue入门(Vue.js,库与框架,MVVM,BootCDN,Vue入门,数据双向绑定,vue事件,生命周期,钩子函数 )
- 〖算法〗-- 排序lowB三人组:冒泡排序、选择排序、 插入排序
- 37岁老表弟接触Python,在危机中抓住新机,3年搭建Python金融“金字塔”