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学习-消息创建,发布者和订阅者实现及测试相关推荐

  1. ROS系统用python创建发布者与订阅者,并发布自定义话题消息

    ROS系统用python创建发布者与订阅者,并发布自定义话题消息 最近使用pythonros进行ROS系统开发,发现用python开发的教程挺少的,所以记录一下,废话不多说,开始教程: 一.创建工作空 ...

  2. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

  3. 【ROS话题通信】发布者和订阅者

    前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...

  4. ROS学习13-NVIDIA JETSON TX2 激光雷达-思岚RPLIDAR S1测试hector_mapping(rviz上渲染显示周围环境)

    ROS学习13-NVIDIA JETSON TX2 激光雷达-思岚RPLIDAR S1测试hector_mapping(rviz上渲染显示周围环境) 在前面的章节我们在ROS上测试了思岚RPLIDAR ...

  5. ROS学习:创建机器人的urdf

    ROS学习之路08:创建机器人的urdf(xacro)模型并通过rviz可视化_Hi, Robotics-CSDN博客_urdf可视化 1 创建工作空间 mkdir -p ~/catkin_ws/sr ...

  6. ros 消息队列与缓冲区_[ROS] [笔记(1)] 一个最简单的例子:Hello Robot(消息、发布者与订阅者)...

    本例程包含如下内容: 1)创建编译 Package: 2)自定义消息: 3)发布者与订阅者. 0.Hello Robot 的场景: 我们想要完成这样一个场景: 1)有一系列 robot 排成一排(pu ...

  7. 本博客导读(2021/08/09更新)

    文章目录 1. 简介 1.1 博客精神 1.2 写作目的 1.3 技术方向 1.4 博主 1.5 版权说明 2 推荐内容 2.1 主要代表作 2.2 其他推荐内容 3. 程序类 3.1 C#程序设计 ...

  8. ROS学习笔记3_发布者Publisher

    通过程序实现发布海龟的速度指令,让海龟运动. 这个系统中,通过ROS Master来管理所有节点,其中主要节点有二,一者为订阅者节点,turtlesim海龟仿真器,一者为发布节点Turtle Velo ...

  9. ROS学习笔记-创建订阅cmd_vel话题节点

    创建工作空间 cd ~ mkdir catkin_ws cd catkin_ws mkdir src cd src catkin_init_workspace #初始化工作空间 cd ~/catkin ...

最新文章

  1. WinForm下PictureBox和Panel控件的On_Paint事件有何区别
  2. ubuntu下连接mysql出现Access denied for user ‘rose‘@‘localhost‘ (using password: NO)的解决方法
  3. 1.2 UML带来了什么(学习笔记)
  4. PUCCH Format
  5. php图片滑动的属性,JavaScript_javascript图片滑动效果实现,本文为大家分享了javascript图片 - phpStudy...
  6. FTP与SFTP两者有什么区别
  7. 原生JS与Jquery删除iframe并释放内存(IE)
  8. 大量的linux、H3C、cisco、华为、模拟器、adobe教程
  9. 【WinCE】WinCE通过USB与PC同步
  10. 元气骑士里面的超级计算机,元气骑士古大陆的神器神威大全
  11. 【超级有用】大数据的压缩格式
  12. win10专业版和企业版的区别_Win10专业版和家庭版有什么区别?Win10家庭版和专业版区别对比...
  13. 酶促反应动力学_酶促反应动力学中,米氏方程怎么推导出来的?具体怎么应用?...
  14. LIME Low light Image Enhancement via Illumination Map Estimation
  15. 从Xcode编译时自带的“图片压缩”说起
  16. OkHttp相关知识(三)
  17. Python汉译英小程序
  18. 【java文本处理】删除txt文档中的空白行
  19. C语言string中的find()函数
  20. 强大的字体编辑器推荐,设计属于自己的字体

热门文章

  1. 时间控件el-date-picker限制可选当前日期前七天
  2. 项目上线,部署到服务器(腾讯服务器),http协议及https协议(微信小程序必须https协议才可发布)、Nginx配置
  3. Ubuntu操作系统安装
  4. 神州控股、神州信息、神州数码集团与腾讯云签署战略合作
  5. 【转】FILE *fp fopen 参数
  6. Daily record-December
  7. GPU Profiling
  8. Chrome浏览器安装Vue.js devtools插件
  9. C语言打开文件,并把文件内容打印
  10. 串口监听工具listen_串口命令解析