4.11自定义话题通信(python).md 3.2 KB

自定义话题通信(小说+插图)

本文与相关代码由alyssa1024编写,感谢!

跟着小鱼的步伐,咱们前面已经让张三走到时尚前沿,追更上了世纪畅销小说艳娘传奇。

看到自己的作品流传愈广,拥趸愈多,李四甚感欣慰,愈发精益求精,立志为广大读者创造福利,第一件就是为略显单调的小说配上插图,让大家一睹艳娘传奇风姿。

1. 准备工作

还记得4.6节我们自定义的Novel.msg接口嘛,早期发布小说时我们只使用了ROS2内置的std_msgs.msg中的string类型传递消息,并没用上

# 标准消息接口 字符串
string content
# 图像消息,调用sensor_msgs下的Image类型
sensor_msgs/Image image

如今时机成熟,是时候让我们自定义的消息类型发光发热了,其中的content就是我们小说的主体内容,而image自然就是要添加的插图了

插图哪里来呢?我们再次回忆2.4节的第三个小游戏,当时我们开启了cam2image这个节点,打开了潘多拉的照片流,诶,插图这不就来了嘛

原来一切都是心机鱼冥冥之中的铺垫~

2. 代码编写

修改头文件

illage_lili4节点中引入以下头文件

#导入系统内置的图片消息类型
from sensor_msgs.msg import Image
#从村庄接口话题消息类中导入小说消息类型
from village_interfaces.msg import Novel

修改li4类

将发布小说的接口类型更换为导入的Novel类型

self.write = self.create_publisher(Novel,"sexy_girl", 10) 

添加获取图片的订阅端,第一个参数为消息类型,第二个是话题名称,第三个是处理图片的回调函数,第四个是消息队列的长度

#声明一个空的图像
self.image = Image()
# 开始获取图片
self.create_subscription(Novel,"image",self.recv_image_callback,10)

添加接收图片的回调函数

def recv_image_callback(self,image):
    self.image = image

最后修改timer_callback函数

msg = Novel()
msg.content = '第%d回:潋滟湖 %d 次偶遇胡艳娘' % (self.i,self.i)
msg.image = self.image
self.write.publish(msg)  #将小说内容发布出去
self.get_logger().info('李四:我发布了艳娘传奇:"%s"' % msg.content)    #打印一下发布的数据,供我们看
self.get_logger().info('李四:并且为艳娘传奇配上了插图,长:"%d",宽:%d' % (msg.image.height,msg.image.width))    #打印一下发布的插图尺寸,供我们看

3. 编译功能包

在vscode中,使用Ctrl+~打开终端,在town_ws目录下输入

colcon build --packages-select village_li

4. 运行节点

Ctrl+Alt+T打开新终端,先启动相机发布图片的节点

ros2 run image_tools cam2image

image-20210910163422495.png

在原终端town_ws目录下输入

. install/setup.bash
ros2 run village_li li4_node

image-20210910191451914.png


技术交流&&问题求助:

  • QQ交流群:139707339

  • 微信公众号:鱼香ROS

  • 小鱼微信:AiIotRobot