小車yolo機械臂(六)ros gazebo 小車攝像頭根據darknet_ros中yolo目標檢測的資訊進行自主運動

WinstonYF發表於2020-10-27

小車yolo機械臂(六)ros gazebo 小車攝像頭根據darknet_ros中yolo目標檢測的資訊進行自主運動

前言

前面幾篇部落格已經實現了小車通過命令列運動,以及yolo檢查結果資訊的輸出,那麼現在我們要將這兩者融合在一起。根據darkenet_ros中yolo的結果(比如前方檢測出有人,小車啟動,向前)自動進行運動。

rospy.Publisher()

我們要將控制小車運動的程式碼,寫到listener_yolo.py檔案中,在這個python檔案中,已經實現了yolo檢測目標的輸出,那麼現在我們要實現的就是將小車運動的命令植入到這個python檔案中。

pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)

我們用到rospy.Publisher,這是話題的一個釋出,這裡用到的是Twist訊息型別,因為/cmd_vel這個話題所對應的訊息型別為:geometry_msgs/Twist (上一個部落格有講解)
所以我們在python檔案的頂部,要匯入:

from geometry_msgs.msg import Twist

queue_size 這裡比較複雜,我就直接貼上複製其它博主的講解了:

rospy中的publish()預設是阻塞式同步傳送模式。這將導致連線斷開後publish卡死(比如無線連線的publisher和subscriber)。
不過,可以將publish和subscribe的queue_size寫入一個大於0的值使publish成為非同步模式。

rospy讓小車自主動起來

直接上程式碼:

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


def callback(data):
    print data.bounding_boxes[0].Class
    if data.bounding_boxes[0].Class == 'person':
        pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
		desired_velocity = Twist()
		desired_velocity.linear.x = 0.1
		desired_velocity.angular.z = 0
        pub.publish(desired_velocity)
		print "go on"
   

def listener():
    rospy.init_node('topic_subscriber')

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

    rospy.spin()

if __name__ == '__main__':
    listener()

我們啟動模型:

roslaunch mrobot_gazebo my_gazebo3.launch

在這裡插入圖片描述
現在小車還是靜止的,我們在小車模型前面放置一個人。
在這裡插入圖片描述
小車檢測到前方有人,就開始移動
在這裡插入圖片描述
在這裡插入圖片描述
在終端也小車也列印出了移動的結果。

相關文章