多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

鱼香ros2(十一)话题、通信

鱼香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后退0angular_velocity:角速度就是原地旋转的速度以小海龟脑袋所在方向顺时针为0逆时针为02、查看接口定义ros2 run turtlesim turtlesim_noderos2 node info /turtlesim3、海龟模拟器话题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/Twist5、使用话题控制机器人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怎么下载小说requestpython中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_interfacesdependencies依赖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、合成语音1python包管理工具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(targetself.thread_speack_fun)创建一个线程targetself.thread_speack_fun我要运行的目标线程是哪一个这里是thread_speack_fun。4、启动记得打开发布者服务并且启动小说服务。
返回列表