【4. ROS的主要通讯方式:Topic话题与Message消息】(2)

本文涉及的产品
资源编排,不限时长
简介: 【4. ROS的主要通讯方式:Topic话题与Message消息】(2)

6. 使用C++实现Subscriber订阅者

根据需求创建atr_pkg包的ma_node订阅节点


1.png

6.1 创建订阅者节点

创建Package软件包


  • 创建在~/catkin_ws/src文件夹里
  • catkin_create_pkg<包名><依赖项列表>
catkin_creat_pkg atr_pkg rospy roscpp std_msgs

2.png

新建src文件夹的ma_node.cpp文件


3.png

6.2 消息分析


4.png

6.3 添加chao_node节点的订阅

修改ma_node代码


/

#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{
  printf(msg.data.c_str());
  printf("\n");
}
int main(int argc,char *argv[])
  ros::init(argc,argv,"ma_node" );
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);
  while ( ros::ok())
  {
  ros::spinOnce();
  }
return 0;


6.4 修改CMakeLists.tet文件

增加ma_node节点配置


5.png


add_executable(ma_node src/ma_node.cpp)
target_link_libraries(ma_node
  ${catkin_LIBRARIES}
)


ctrl+s快捷保存

ctrl+shift+b快捷编译


6.5 运行调试ma_node

打开3个终端,分别运行3行代码




roscore
rosrun ssr_pkg chao_node
rosrun atr_pkg ma_node

6.png


7.png

6.6 调整和优化

修改ma_node节点,添加chao_node节点的订阅


ma_node.cpp源程序


#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{
  ROS_INFO(msg.data.c_str());
}
int main(int argc,char *argv[])
{
  setlocale(LC_ALL,"");
  ros::init(argc,argv,"ma_node" );
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);
  while ( ros::ok())
  {
  ros::spinOnce();
  }
  return 0;
}

8.png


打印如下

9.png

[]时间戳表示【格林尼治时间1970年1月1日0时0分0秒】距离现在多少秒。


6.7 添加yao_node节点的订阅

修改ma_node节点,添加yao_node节点的订阅


ma_node.cpp源程序


#include <ros/ros.h>
#include <std_msgs/String.h>
void chao_callback(std_msgs::String msg)
{
  ROS_INFO(msg.data.c_str());
}
void yao_callback(std_msgs::String msg)
{
  ROS_WARN(msg.data.c_str());
}
int main(int argc,char *argv[])
{
  setlocale(LC_ALL,"");
  ros::init(argc,argv,"ma_node" );
  ros::NodeHandle nh;
  ros::Subscriber sub = nh.subscribe("kuai_shang_che_kai_hei_qun",10,chao_callback);
  ros::Subscriber sub_2 = nh.subscribe("gie_gie_dai_wo",10,yao_callback);
  while ( ros::ok())
  {
  ros::spinOnce();
  }
  return 0;
}


10.png



打开4个终端,分别运行4行代码


roscore
rosrun ssr_pkg chao_node
rosrun ssr_pkg yao_node
rosrun atr_pkg ma_node

11.png


6.8 rqt_graph查看节点消息流

12.png

13.png




6.9 小结

  1. 确定话题名称和消息类型。
  2. 在代码文件中include <ros.h>和消息类型对应的头文件。
  3. 在main函数中通过NodeHandler大管家订阅一个话题并设置消
  4. 息接收回调函数。
  5. 定义一个回调函数,对接收到的消息包进行处理。
  6. main函数中需要执行ros::spinOnce(),让回调函数能够响应接收到的消息包。

15.png


7. 使用launch文件启动多个ROS节点

7.1 使用launch文件启动节点

该文件类型是XML语法,类似http文本。

16.png

批量启动ros节点文件

17.png

18.png

19.png

20.png

21.png

22.png


7.2 编写运行launch文件

新建launch文件夹的kai_hei.launch文件

23.png

24.png

kai_he.launch源码



launch>
  <node pkg="ssr_pkg" type="yao_node" name="yao_node" />
  <node pkg="ssr_pkg" type="chao_node" name=" chao_node" />
  <node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>

25.png

7.3 调试launch文件

运行下面指令,启动launch的三个节点



roslaunch atr_pkg kai_hei.launch

26.png

27.png


采用rqt_graph命令查看节点流图

28.png


修改kai_he.launch源码,添加launch-prefix=" gnome-terminal -e",开一个新终端运行显示chao_node节点




launch>
  <node pkg="ssr_pkg" type="yao_node" name="yao_node" />
  <node pkg="ssr_pkg" type="chao_node" name=" chao_node" launch-prefix=" gnome-terminal -e"/>
  <node pkg="atr_pkg" type="ma_node" name="ma_node" output="screen"/>
</launch>

29.png

运行下面指令,启动launch的三个节点




roslaunch atr_pkg kai_hei.launch

30.png


7.4 launch小结

  1. 使用launch文件,可以通过roslaunch指令一次启动多个节点。
  2. 在launch文件中,为节点添加output="screen”属性,可以让节点信息输出在终端中。(ROS_WARN不受该属性控制)
  3. 在launch文件中,为节点添加launch-prefix="gnome-terminal -e"属性,可以让节点单独运行在一个独立终端中。


31.png

8. 使用Python编写Publisher发布者节点

8.1 订阅者节点的Python实现

1.png

ctrl+alt+t打开终端,只需一次编译

创建python包




cd catkin_ws/src/
catkin_create_pkg ssr_pkg rospy std_msgs
cd ..
catkin_make

2.png

VScode打开,创建scripts

3.png

创建chao_node.py

4.png

8.2 编写chao_node.py代码

先引入python包,设置中文utf-8显示


  • ros>=20.04,采用python3
  • ros<20.04,采用python

5.png

对比学习C++发布节点

6.png

7.png


NodeHandle变为rospy


chao_node.py源码



#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
if _name__ == "_main_":
  rospy.init_node ( " chao_node ")
  rospy.logwarn("我的枪去而复返,你的生命有去无回!")
  pub = rospy.Publisher( "kuai_shang_che_kai_hei_qun" ,String , queue_size=10)
  rate = rospy. Rate( 10)
  while not rospy.is_shutdown():
  rospy.loginfo("我要开始刷屏了")
  msg = String()
  msg.data =“国服马超,带飞"
  pub.publish(msg)
  rate.sleep(

8.png

8.3 py文件添加可执行的权限

9.png

在所在文件夹打开终端

chmod +x chao_node.py


设置标签

8.4 运行调试chao_node.py

打开两个终端分别运行两条指令




roscore
rosrun ssr_pkg chao_node.py

10.png

rostopic工具


rostopic list
rostopic echo /kuai_shang_che_kai_hei_qun
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"

11.png

python前面经过第一次编译,后期不需要编译可以直接运行,也不需要CMake文件配置


8.5 编写yao_node.py代码

直接复制chao_node.py改为yao_node.py,权限也会一起传递

12.png

yao_node.py源码




#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
if _name__ = "__main_":
  rospy.init_node ( "yao_node")
  rospy.logwarn("过去生于未来! ")
  pub = rospy. Publisher( "gie_gie_dai_wo" ,String , queue_size=10)
  rate = rospy.Rate(10)
  while not rospy.is_shutdown():
  rospy.loginfo("我要开始刷屏了")
  msg = String()
  msg.data = "求上车+++"
  pub.publish(msg)
  rate.sleep()


8.6 运行调试yao_node.py

打开两个终端分别运行两条指令

roscore
rosrun ssr_pkg yao_node.py

13.png

rostopic工具


rostopic list
rostopic echo /gie_gie_dai_wo
echo -e "\u56FD\u670D\u9A6C\u8D85\uFF0C\u5E26\u98DE"

14.png

9. 使用Python实现Subscriber订阅者

根据需求创建atr_pkg包的ma_node订阅节点


15.png

9.1 创建订阅者节点

创建Package软件包


  • 创建在~/catkin_ws/src文件夹里
  • catkin_create_pkg<包名><依赖项列表>



cd catkin_ws/src/
catkin_creat_pkg atr_pkg rospy std_msgs
cd ..
catkin_make

16.png

VScode打开,创建scripts文件夹,创建ma_node.py

17.png

9.2 编写ma_node.py代码

先引入python包,设置中文utf-8显示


  • ros>=20.04,采用python3
  • ros<20.04,采用python

18.png

对比学习C++发布节点

19.png

20.png

NodeHandle变为rospy


修改ma_node代码



#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
def chao_callback(msg):
  rospy. loginfo(msg.data)
ifname== "_main_":
  rospy.init_node ( "ma_node" )
  sub = rospy.Subscriber("kuai_shang_che_kai_hei_qun" ,String , chao_callback,queue_size=10)
  rospy.spin ()


9.3 py文件添加可执行的权限

21.png


在所在文件夹打开终端

22.png



chmod +x ma_node.py

9.4 运行调试ma_node

打开3个终端,分别运行3行代码



roscore
rosrun ssr_pkg chao_node.py
rosrun atr_pkg ma_node

23.png


9.5 添加yao_node节点的订阅

修改ma_node节点,添加yao_node节点的订阅


ma_node.py源程序



#!/usr/bin/env python3
#coding=utf-8
import rospy
from std_msgs.msg import String
def chao_callback(msg):
  rospy. loginfo(msg.data)
def yao_callback(msg):
  rospy. logwarn(msg.data)
ifname== "_main_":
  rospy.init_node ( "ma_node" )
  sub = rospy.Subscriber("kuai_shang_che_kai_hei_qun" ,String , chao_callback,queue_size=10)
  sub_2 = rospy.Subscriber("gie_gie_dai_wo" ,String , yao_callback,queue_size=10)
  rospy.spin ()

24.png


9.6 编写launch启动文件

新建launch文件夹的kai_hei.launch文件

25.png

kai_he.launch源码




launch>
  <node pkg="ssr_pkg" type="yao_node.py" name="yao_node" />
  <node pkg="ssr_pkg" type="chao_node.py" name=" chao_node" />
  <node pkg="atr_pkg" type="ma_node.py" name="ma_node" launch-prefix=" gnome-terminal -e"/>
</launch>


9.7 运行调试

打开2个终端,分别运行2行代码


roscore
roslaunch atr_pkg kai_hei.launch

26.png

9.8 rqt_graph查看节点消息流

打开一个终端,输入



rqt_graph

27.png


10. 总结

本节学习了ROS机器人的主要通讯方式,尝试C++和python两种语言编写Topic话题与Message消息,接下来会介绍机器人的运动操作。完美撒花!

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
Ubuntu Java Python
ROS2通讯中间件安装与使用
本文记录主要ROS2的安装、如何JAVA和PYTHON对ROS2消息的订阅和发布。
|
3月前
|
传感器 算法 数据可视化
ROS2教程04 ROS2话题
这篇文章是关于ROS2(Robot Operating System 2)的教程,主要介绍了ROS2中话题的概念、特性、使用方式,以及如何编写发布者和订阅者的代码。
75 3
ROS2教程04 ROS2话题
|
3月前
|
机器人
ROS2教程 04 话题Topic
本文是关于ROS2(机器人操作系统2)中话题(Topic)机制的教程,详细介绍了ROS2中话题的命令使用,包括列出、回显、发布、信息查询、类型查询等功能,并通过示例代码展示了如何创建发布者(Publisher)和订阅者(Subscriber)节点,以及如何测试发布-话题-订阅通信。
230 0
ROS2教程 04 话题Topic
|
4月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
6月前
|
传感器
[ROS2] --- topic
[ROS2] --- topic
138 0
|
存储 API C++
ROS Topic 相关API接口与命令行介绍
ROS Topic 相关API接口与命令行介绍
538 0
|
机器学习/深度学习 Ubuntu 网络协议
【UR机械臂ros通讯前的示教器网络配置】
【UR机械臂ros通讯前的示教器网络配置】
522 0
|
传感器 机器人 C++
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
【4. ROS的主要通讯方式:Topic话题与Message消息】(1)
375 0
|
算法 C语言 C++
【ROS】服务通信、话题通信的应用
现在可以直接使用键盘来控制乌龟运动了
123 0
|
22天前
|
Ubuntu 机器人 Linux

推荐镜像

更多