目录总览

小车yolo机械臂(一)ros下gazebo搭建小车(可键盘控制)安装摄像头仿真 加载yolo检测识别标记物体

小车yolo机械臂(二)机械臂仿真 ros下从xacro模型文件搭建Moveit!+Gazebo仿真系统

小车yolo机械臂(三)ROS消息订阅监听 rospy.Subscriber 订阅监听yolo python实现订阅/darknet_ros/bounding_boxes topic

小车yolo机械臂(四)python ros 和darknet_ros 使用launch文件启动脚本

小车yolo机械臂(五)让小车在命令下运动起来 rostopic pub /cmd_vel geometry_msgs/Twist

小车yolo机械臂(六)ros gazebo 小车摄像头根据darknet_ros中yolo目标检测的信息进行自主运动

小车yolo机械臂(七)小车与机械臂融合,并控制机械臂运动 gazebo control

小车yolo机械臂(八)ros小车和机械臂gazebo仿真,机械臂根据darknet_ros中yolo检测结果来自动运动 python实现

准备

最近在做一个项目,要在小车上安装摄像头,摄像头的图像的topic(话题)传递给darknet_ros里的yolo进行检测,现在要做的就是,单独写个python。

项目基础:

ros下gazebo搭建小车(可键盘控制)安装摄像头仿真 加载yolo检测识别标记物体

在上面项目的基础上,在mrobot_gazebo下新建scripts,再在scripts下新建一个python文件:listener_yolo.py,作用就是用于订阅/darknet_ros/bounding_boxes话题的信息,这个话题含有yolo识别检测出的信息。

在这里插入图片描述

终端查看topic信息

首先,我们先看看,怎么使用终端查看darnet_ros下yolo识别出来的信息。

1,把上面说的项目运行起来

运行小车及摄像头的gazebo仿真

 roslaunch mrobot_gazebo my_gazebo3.launch

运行darknet_ros

roslaunch darknet_ros darknet_ros.launch

2,查看当前所有的topic

rostopic list

在这里插入图片描述
可以看到很多以darknet_ros开头的

输出话题

我们将/darknet_ros/bounding_boxes这个话题输出,执行指令

rostopic echo /darknet_ros/bounding_boxes




在这里插入图片描述
yolo的检测出的信息就输出在了终端里

下一步我们就要使用python来订阅这一话题,然后讲订阅后的信息打印在终端上。

新建listener_yolo.py

在mrobot_gazebo下新建scripts,再在scripts下新建一个python文件:listener_yolo.py

我们先要给listener_yolo.py权限,不然无法执行。

在listener_yolo所在目录执行:

chmod +x listener_yolo.py

在写里面的内容之前,我先把我查阅的比较有用的资料先罗列出来:

Rospy的官方教程代码讲解(一)发布与订阅

ROS消息传递——std_msgs

ROS自定义msg类型及使用 这篇的评价里的内容激发了我:

Python 使用自定义 msg 导入方式: 
from 功能包名.msg import 消息文件名

我们这里需要实现对yolo检测信息话题的订阅(即:/darknet_ros/bounding_boxes),所以我们不需要写话题的发布,直接写订阅。

listener_yolo.py的代码:

#!/usr/bin/env python  
import rospy
from darknet_ros_msgs.msg import BoundingBoxes


def callback(data):
    print data
def listener():
    rospy.init_node('topic_subscriber')
    sub = rospy.Subscriber('/darknet_ros/bounding_boxes', BoundingBoxes, callback)
    print sub

    print type(sub)
    rospy.spin()

if __name__ == '__main__':
    listener()

直接划重点:
导入darknet_ros_msgs中的BoundingBoxes消息类型

这个导入我在网上查了很多,饶了很多弯路,网上的资料几乎都是导入:from std_msgs.msg import String,在一个博客中看到的一个评论,让我知道了如何修改。

首先,在终端运行:

rosmsg list

在这里插入图片描述
可以看到很多msg,我们找到我们需要的
在这里插入图片描述
可以看到有:

darknet_ros_msgs/BoundingBox

根据这条信息,我们写出:

from darknet_ros_msgs.msg import BoundingBoxes

在订阅话题命令中,这样写:

sub = rospy.Subscriber('/darknet_ros/bounding_boxes', BoundingBoxes, callback)

结果

最后在终端执行命令:

rosrun mrobot_gazebo listener_yolo.py

在这里插入图片描述
可以看到结果的输出