2021-08-09-ROS学习-消息创建,发布者和订阅者实现及测试
2.ROS中创建msg
在软件包里定义一个新的消息
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
除了上面一行外,还可以加其他的消息定义。
要确保msg文件能被转换为C++、Python和其他语言的源代码。
打开package.xml, 确保它包含以下两行且没有被注释。如果没有,需要添加进去:
<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
在构建时,其实只需要message_generation,而在运行时,只需要message_runtime。
在CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
有时即使没有使用全部依赖项调用find_package,项目也可以构建。这是因为catkin把你所有的项目整合在了一起,因此如果之前的项目调用了find_package,你的依赖关系也被配置成了一样的值。但是,忘记调用意味着你的项目在单独构建时很容易崩溃。
确保导出消息的运行时依赖关系:
catkin_package(...CATKIN_DEPENDS message_runtime ......)
add_message_files(FILESNum.msg
)
手动添加.msg文件后,我们要确保CMake知道何时需要重新配置项目。
现在必须确保generate_messages()函数被调用:
generate_messages(DEPENDENCIESstd_msgs
)
使用rosmsg
以上就是创建消息的所有步骤。通过rosmsg show命令看看ROS能否识别它。
$ rosmsg show [message type]
示例:
$ rosmsg show beginner_tutorials/Num
可以看到:
int64 num
在上面的例子中,消息类型包含两部分:
beginner_tutorials – 定义消息的软件包
Num – 消息的名称Num
如果不记得msg在哪个包中,也可以省略包名称。
$ rosmsg show Num
你会看到:
[beginner_tutorials/Num]:
int64 num
3.ROS中创建srv
$ roscd beginner_tutorials
$ mkdir srv
从另一个包复制现有的srv定义,而不是手动创建新的srv。roscp是一个实用的命令行工具,用于将文件从一个包复制到另一个包。
例子:
$ roscp [package_name] [file_to_copy_path] [copy_path]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
同样在package.xml,确保它包含以下两行
<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
CMakeLists.txt文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了。直接将message_generation添加到COMPONENTS列表中即可
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
message_generation对msg和srv都适用
添加所需附加依赖项
add_service_files(FILESAddTwoInts.srv
)
使用rossrv
以上就是创建服务的所有步骤。让我们通过rossrv show命令看看ROS能否识别它。
用法:
$ rossrv show <service type>
示例:
$ rossrv show beginner_tutorials/AddTwoInts
跟rosmsg类似, 你也可以在不指定包名的情况下找到这样的服务:
$ rossrv show AddTwoInts
msg和srv的一般步骤
1.先修改CMakeLists.txt,添加任意你的消息用到的包含.msg文件的软件包
generate_messages(DEPENDENCIESstd_msgs
)
4.编写简单的发布者和订阅者的介绍
“节点”是连接到ROS网络的可执行文件。在这里,我们将创建talker(发布者)节点,该节点将不断广播消息。
将当前目录切换到之前的教程中创建的beginner_tutorials包中:
$ roscd beginner_tutorials
$ mkdir src
$ cd src
在src目录下创建talker.cpp文件并粘贴以下内容进去:
https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/talker/talker.cpp
在src目录下创建talker.cpp文件并粘贴以下内容进去:
https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/listener/listener.cpp
修改CMakeLists.txt,最终的CMakeLists.txt长这样:
https://raw.github.com/ros/catkin_tutorials/master/create_package_pubsub/catkin_ws/src/beginner_tutorials/CMakeLists.txt
其中:
1.ros/ros.h是一个很便利的include,它包括了使用ROS系统中最常见的公共部分所需的全部头文件。
2.引用了位于std_msgs包里的std_msgs/String消息。这是从std_msgs包里的String.msg文件中自动生成的头文件。
3.初始化ROS。这使得ROS可以通过命令行进行名称重映射——不过目前不重要。这也是我们给节点指定名称的地方。节点名在运行的系统中必须是唯一的。注意:名称必须是基本名称,例如不能包含任何斜杠/。
4.为这个进程的节点创建句柄。创建的第一个NodeHandle实际上将执行节点的初始化,而最后一个被销毁的NodeHandle将清除节点所使用的任何资源。
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
告诉主节点我们将要在chatter话题上发布一个类型为std_msgs/String的消息。这会让主节点告诉任何正在监听chatter的节点,我们将在这一话题上发布数据。第二个参数是发布队列的大小。在本例中,如果我们发布得太快,它将最多缓存1000条消息,不然就会丢弃旧消息。
NodeHandle::advertise()返回一个ros::Publisher对象,它有2个目的:其一,它包含一个publish()方法,可以将消息发布到创建它的话题上;其二,当超出范围时,它将自动取消这一宣告操作。
ros::Rate loop_rate(10);
ros::Rate对象能让你指定循环的频率。它会记录从上次调用Rate::sleep()到现在已经有多长时间,并休眠正确的时间。在本例中,我们告诉它希望以10Hz运行。
loop_rate.sleep();
现在我们使用ros::Rate在剩下的时间内睡眠,以让我们达到10Hz的发布速率。
void chatterCallback(const std_msgs::String::ConstPtr& msg)
这是一个回调函数,当有新消息到达chatter话题时它就会被调用。该消息是用boost shared_ptr智能指针传递的,这意味着你可以根据需要存储它,即不用担心它在下面被删除,又不必复制底层(underlying)数据。
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
通过主节点订阅chatter话题。每当有新消息到达时,ROS将调用chatterCallback()函数。第二个参数是队列大小,以防我们处理消息的速度不够快。在本例中,如果队列达到1000条,再有新消息到达时旧消息会被丢弃。
NodeHandle::subscribe()返回一个ros::Subscriber对象,你必须保持它,除非想取消订阅。当Subscriber对象被析构,它将自动从chatter话题取消订阅
ros::spin();
ros::spin()启动了一个自循环,它会尽可能快地调用消息回调函数。不过不要担心,如果没有什么事情,它就不会占用太多CPU。另外,一旦ros::ok()返回false,ros::spin()就会退出,这意味着ros::shutdown()被调用了,主节点让我们关闭。
5.测试简单的发布者和订阅者
$ roscore
在运行你的程序前,请确保你在调用catkin_make后已经source过工作空间。
$ source ./devel/setup.bash
$ rosrun beginner_tutorials talker
$ rosrun beginner_tutorials listener
2021-08-09-ROS学习-消息创建,发布者和订阅者实现及测试相关推荐
- ROS系统用python创建发布者与订阅者,并发布自定义话题消息
ROS系统用python创建发布者与订阅者,并发布自定义话题消息 最近使用pythonros进行ROS系统开发,发现用python开发的教程挺少的,所以记录一下,废话不多说,开始教程: 一.创建工作空 ...
- 2021.08.09【普及组】模拟赛C组比赛总结
文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...
- 【ROS话题通信】发布者和订阅者
前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...
- ROS学习13-NVIDIA JETSON TX2 激光雷达-思岚RPLIDAR S1测试hector_mapping(rviz上渲染显示周围环境)
ROS学习13-NVIDIA JETSON TX2 激光雷达-思岚RPLIDAR S1测试hector_mapping(rviz上渲染显示周围环境) 在前面的章节我们在ROS上测试了思岚RPLIDAR ...
- ROS学习:创建机器人的urdf
ROS学习之路08:创建机器人的urdf(xacro)模型并通过rviz可视化_Hi, Robotics-CSDN博客_urdf可视化 1 创建工作空间 mkdir -p ~/catkin_ws/sr ...
- ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...
本例程包含如下内容: 1)创建编译 Package: 2)自定义消息: 3)发布者与订阅者. 0.Hello Robot 的场景: 我们想要完成这样一个场景: 1)有一系列 robot 排成一排(pu ...
- 本博客导读(2021/08/09更新)
文章目录 1. 简介 1.1 博客精神 1.2 写作目的 1.3 技术方向 1.4 博主 1.5 版权说明 2 推荐内容 2.1 主要代表作 2.2 其他推荐内容 3. 程序类 3.1 C#程序设计 ...
- ROS学习笔记3_发布者Publisher
通过程序实现发布海龟的速度指令,让海龟运动. 这个系统中,通过ROS Master来管理所有节点,其中主要节点有二,一者为订阅者节点,turtlesim海龟仿真器,一者为发布节点Turtle Velo ...
- ROS学习笔记-创建订阅cmd_vel话题节点
创建工作空间 cd ~ mkdir catkin_ws cd catkin_ws mkdir src cd src catkin_init_workspace #初始化工作空间 cd ~/catkin ...
最新文章
- WinForm下PictureBox和Panel控件的On_Paint事件有何区别
- ubuntu下连接mysql出现Access denied for user ‘rose‘@‘localhost‘ (using password: NO)的解决方法
- 1.2 UML带来了什么(学习笔记)
- PUCCH Format
- php图片滑动的属性,JavaScript_javascript图片滑动效果实现,本文为大家分享了javascript图片 - phpStudy...
- FTP与SFTP两者有什么区别
- 原生JS与Jquery删除iframe并释放内存(IE)
- 大量的linux、H3C、cisco、华为、模拟器、adobe教程
- 【WinCE】WinCE通过USB与PC同步
- 元气骑士里面的超级计算机,元气骑士古大陆的神器神威大全
- 【超级有用】大数据的压缩格式
- win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?Win10家庭版和专业版区别对比...
- 酶促反应动力学_酶促反应动力学中,米氏方程怎么推导出来的?具体怎么应用?...
- LIME Low light Image Enhancement via Illumination Map Estimation
- 从Xcode编译时自带的“图片压缩”说起
- OkHttp相关知识(三)
- Python汉译英小程序
- 【java文本处理】删除txt文档中的空白行
- C语言string中的find()函数
- 强大的字体编辑器推荐,设计属于自己的字体