一、话题通信介绍

        在机器人的世界里,为了能够感知环境信息和执行动作,往往装载了很多传感器和执行器,常见的传感器有摄像头、雷达、和惯性测量单元等,常见的执行器有各种类型的地盘、机械臂关节电动机和电动夹爪等。为了方便各类传感器和执行器数据在机器人系统中互相通信、传递,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、启动

                

                记得打开发布者服务,并且启动小说服务。

Logo

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

更多推荐