ROS Bebop - eiichiromomma/CVMLAB GitHub Wiki

(ROS) Bebop

とりあえず公式の説明に従ってインストールしておく。

離陸・制御・着陸

ドローンが飛び放しになって非常に危険なので、この説明を一通り読んでから実行すること

操作はドキュメントの通り。離陸と着陸はEmptyを送れば良い。

離陸

rostopic pub --once /bebop/takeoff std_msgs/Empty

制御

linearとangularを送る。linearの方は豪快に値を入れると凶器と化すので要注意

rostopic pub /bebop/cmd_vel geometry_msgs/Twist "{linear: {x: 0.0, y: 0.0, z0.0}, angular: {x: 0.0, y: 0.0, z: 0.1}}"

でz軸について回転(Yaw)。全部0を送ればホバリングになる。

rostopic pub /bebop/cmd_vel geometry_msgs/Twist "{linear: {x:.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

着陸

rostopic pub --once /bebop/land std_msgs/Empty

操作のやりかた

ひとまずコマンドで制御しようとする場合は4つのターミナルを開き、上の4コマンドをEnterだけで送れる状態にしておく(特にland)。

Bebopのカメラ映像

topicを/bebop/image_rawにするだけで良い。

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
import cv2, cv_bridge

class Follower:
    def __init__(self):
        self.bridge = cv_bridge.CvBridge()
        self.image_sub = rospy.Subscriber('bebop/image_raw', Image, self.image_callback, queue_size=1)
        self.fdet = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    def image_callback(self, msg):
        image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        faces = self.fdet.detectMultiScale(image[:,:,1])
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv2.imshow("window", image)
        cv2.waitKey(3)

rospy.init_node('follower')
follower = Follower()
rospy.spin()

あとは画像に基いて/bebop/cmd_velへpublishすれば良いのだが、画像の情報で追尾する場合には外乱対策が必要なので、テスト中はドローンを手で持って試すのが安全。

顔検出

基本的にPCでやる場合と同様。処理が重いのでオプションでどうにかする。

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
import cv2, cv_bridge

class Follower:
    def __init__(self):
        self.bridge = cv_bridge.CvBridge()
        self.image_sub = rospy.Subscriber('bebop/image_raw', Image, self.image_callback, queue_size=1)
        self.fdet = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    def image_callback(self, msg):
        image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        faces = self.fdet.detectMultiScale(image[:,:,1], scaleFactor=1.11, minNeighbors=1, minSize=(100, 100))
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv2.imshow("window", image)
        cv2.waitKey(3)

rospy.init_node('follower')
follower = Follower()
rospy.spin()

Publisherになってimage_viewerで見ることもできる。

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
import cv2, cv_bridge

class Follower:
    def __init__(self):
        self.bridge = cv_bridge.CvBridge()
        self.image_pub = rospy.Publisher("image_face", Image, queue_size=1)
        self.image_sub = rospy.Subscriber('bebop/image_raw', Image, self.image_callback, queue_size=1)
        self.fdet = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    def image_callback(self, msg):
        image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        faces = self.fdet.detectMultiScale(image[:,:,1], scaleFactor=1.11, minNeighbors=1, minSize=(100, 100))
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        self.image_pub.publish(self.bridge.cv2_to_imgmsg(image, "bgr8"))

rospy.init_node('follower')
follower = Follower()
rospy.spin()

人検出

処理が重いので半分にリサイズしてる。

#!/usr/bin/env python
import rospy
from sensor_msgs.msg import Image
import cv2, cv_bridge

class Follower:
    def __init__(self):
        self.bridge = cv_bridge.CvBridge()
        self.image_sub = rospy.Subscriber('bebop/image_raw', Image, self.image_callback, queue_size=1)
        self.hog = cv2.HOGDescriptor()
        self.hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

    def image_callback(self, msg):
        image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
        image = cv2.resize(image, (428, 240))
        hogParams = {'winStride': (8, 8), 'scale': 1.5}
        people, r = self.hog.detectMultiScale(image[:, :, 1], **hogParams)
        for (x, y, w, h) in people:
            cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
        cv2.imshow("window", image)
        cv2.waitKey(1)

rospy.init_node('follower')
follower = Follower()
rospy.spin()