# 自定义话题通信(小说+插图) > 本文与相关代码由[alyssa1024](https://github.com/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_li`的`li4`节点中引入以下头文件 ``` #导入系统内置的图片消息类型 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`目录下输入 ```shell colcon build --packages-select village_li ``` ## 4. 运行节点 `Ctrl+Alt+T`打开新终端,先启动相机发布图片的节点 ```shell ros2 run image_tools cam2image ``` ![image-20210910163422495.png](4.11自定义话题通信(python)/imgs/image-20210910163422495.png) 在原终端`town_ws`目录下输入 ``` . install/setup.bash ros2 run village_li li4_node ``` ![image-20210910191451914.png](4.11自定义话题通信(python)/imgs/image-20210910191451914.png) ------ 技术交流&&问题求助: - QQ交流群:139707339 - 微信公众号:鱼香ROS - 小鱼微信:AiIotRobot