鱼香ros2(十一)话题、通信
一、话题通信介绍
在机器人的世界里,为了能够感知环境信息和执行动作,往往装载了很多传感器和执行器,常见的传感器有摄像头、雷达、和惯性测量单元等,常见的执行器有各种类型的地盘、机械臂关节电动机和电动夹爪等。为了方便各类传感器和执行器数据在机器人系统中互相通信、传递,ros2引入了一套订阅发布机制,即话题通信。
1、关键点

四个关键点:
1)发布者:
(发布节点)发布消息的一方(小鱼);
2)订阅者:
(订阅节点) 接收消息的一方,只有订阅了这个“公众号”,才会被动收到消息。(读者);
3)话题名称
发布内容,需要有名称(鱼香ros),根据名称就能找到内容;
4)话题类型(消息接口)
消息接口(图文/视频),内类的类型是属于图文还是视频的,有类型区分。

Subscribers:订阅,turtlesim订阅了哪些话题;
/parameter_events:话题名称,rcl_interfaces/msg/ParameterEvent:话题类型;
/turtle1/cmd_vel: geometry_msgs/msg/Twist:控制小海龟的。
Publishers:发布,发布的话题;
/rosout:日志;
/turtle1/pose:小海龟在海龟模拟器中的位置信息;
/turtle1/pose: turtlesim/msg/Pose小海龟实时的位置信息;
以上就是小海龟节点的订阅和发布,我们使用ros2 node info 节点名称 就可以看到节点信息。
节点信息例子,以下是使用命令:ros2 topic echo /turtle1/pose返回信息

X、Y:代表X、Y轴位置信息;
theta:海龟脑袋朝向,0是正右边,单位是弧度,不是角度。
linear_velocity:线速度,小海龟头直对着的方向的速度,前进>0,后退<0;
angular_velocity:角速度,就是原地旋转的速度,以小海龟脑袋所在方向,顺时针为>0,逆时针为<0;
2、查看接口定义
ros2 run turtlesim turtlesim_node
ros2 node info /turtlesim
3、海龟模拟器话题
ros2 topic echo /turtle1/pose
/turtle1/pose:话题的名字,输入后会对应查看到话题的内容。
ros2 topic info /turtle1/cmd_vel -v
/turtle1/cmd_vel -v:查看话题的信息。
![]()
4、接口定义
ros2 interface show geometry_msgs/msg/Twist

5、使用话题控制机器人
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear:{x:1.0}}"
小海龟动起来了。
ros2 topic pub:发布话题;
/turtle1/cmd_vel :话题名字;
geometry_msgs/msg/Twist:消息接口;
""{linear: {x: 1.0,y: 0.0},angular: {z: 0.0}}":消息接口的yml格式的内容数据填充,linear——线速度,x方向上给限速度1.0,这里一定要注意冒号(:)后面一定要加空格;angular——角速度,只有z方向有值的,是出屏幕旋转。
可以修改参数,自由控制小海龟走向。
二、通过话题发布小说
1、需求:
下载小说并通过话题间隔5S发布一行。
核心问题:
问题1:怎么下载小说?request(python中requests库)
问题2:怎么发布?确定名字和接口(话题的名字和接口,所谓接口就是内容的描述)
问题3:怎么间隔5S发布?timer定时器
2、编写:
1)创建功能包
ros2 pkg create demo_python_topic --build-type ament_python --dependencies rclpy example_interfaces --license Apache-2.0

--dependencies rclpy example_interfaces:dependencies依赖,rclpy以及我们需要的string接口,在 example_interfaces功能包下。其他参数可以参考鱼香ros2(六)。

可以使用命令查看接口功能包:ros2 interface list | grep example_interfaces

使用命令查看接口内容:ros2 interface show example_interfaces/msg/String

注意事项一定要记住。
2)编写代码

self.create_publisher(String,'novel',10):create_publisher()方法创建发布者,String:发布(话题)类型(消息接口),'novel':话题的名字,10:存储的消息队列长度。
from queue import Queue:队列,多线程有个同步问题,所以需要队列。
![]()
在init方法里一定要注意Queue的创建顺序,如果放在后面,self.timer_=self.create_timer(5,self.timer_callback) 就会导致timer_callback先执行,而此时我们的Queue还没有创建,就会一直没有数据。
3)启动节点
先添加节点
一定要启动小说服务器
4)查看话题
查看话题列表: ros2 topic list
我们自定义的话题
查看某个话题的内容:ros2 topic echo /novel
注:如果当前没有话题内容就不会有任何输出。
查看话题的频率(我们这里的要求是每5S输出一次):ros2 topic hz /novel
注:如果当前没有话题内容就不会有任何输出。
三、订阅小说并合成语音
1、需求
订阅小说,并逐行朗读
核心问题:
问题1:怎么订阅?
问题2:用什么来朗读文本?Espeak
问题3:小说来的快,读的太慢怎么办?队列
2、合成语音
1)python包管理工具
sudo apt install python3-pip -y
利用它来安装python相关的库,python有自己官方的网站pypi,放库的,类似maven库,

2)安装espeakng的python库
pip3 install espeakng:使用pip3安装espeakng的python库,方便代码使用。

3)安装合成引擎
sudo apt install espeak-ng -y:安装语音合成引擎espeak-ng。

3、编写

#创建订阅者
self.create_subscription(String,'novel_one',self.novel_callback,10):注意,这里的'novel_one'要和你需要订阅的话题者的名字一模一样,不然会找不到订阅的话题。novel_callback:回调函数,这里订阅者需要回调函数,因为你订阅后,收到消息了,你要知道是什么消息,要怎么去处理他,所以必须添加回调函数。
espeakng:读的过程中是阻塞的,会一直读一直读,他会占有当前这个线程,ros2默认是单线程的,我们需要把读从当前的线程中分离出来,就要单独开一个线程去读,这里我们就创建一个新的线程,然后在新的线程里调用espeakng去读小说内容。
threading.Thread(target=self.thread_speack_fun):创建一个线程,target=self.thread_speack_fun我要运行的目标线程是哪一个(这里是thread_speack_fun)。
4、启动

记得打开发布者服务,并且启动小说服务。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)