ROS实现无人机目标跟踪/物体跟随/循迹

1. 物体跟踪

1.1 实现思路

调用无人机的图像:

cv_image = self.bridge.imgmsg_to_cv2(data, “bgr8”)

之后同OpenCV实现机器人对物体进行移动跟随一样,获取所要跟踪的物体

节点的发布和接收见:ROS学习: Topic通讯

1.2 代码示例

import rospy
import cv2 as cv
from geometry_msgs.msg import Twist
from cv_bridge import CvBridge, CvBridgeError
from sensor_msgs.msg import Image


class image_converter:
    def __init__(self):
        self.cmd_pub = rospy.Publisher("/bebop/cmd_vel", Twist, queue_size=1)			# 发布运动控制信息
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/bebop/image_raw", Image, self.callback)		# 订阅摄像头信息

    def callback(self, data):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")			# 获取订阅的摄像头图像
        except CvBridgeError as e:
            print e

        # 对图像进行处理
        kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))		# 定义结构元素
        height, width = cv_image.shape[0:2]
        screen_center = width / 2
        screen_center_h = height / 2
        
        offset = 50
        offset_h = 30
        lower_b = (75, 43, 46)
        upper_b = (110, 255, 255)
        
        hsv_frame = cv.cvtColor(cv_image, cv.COLOR_BGR2HSV)				# 转成HSV颜色空间
        mask = cv.inRange(hsv_frame, lower_b, upper_b)								
        mask2 = cv.morphologyEx(mask, cv.MORPH_OPEN, kernel)			# 开运算去噪
        mask3 = cv.morphologyEx(mask2, cv.MORPH_CLOSE, kernel)			# 闭运算去噪
        cv.imshow("mask", mask3)
        
        # 找出面积最大的区域
        _, contours, _ = cv.findContours(mask3, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
        maxArea = 0
        maxIndex = 0
        for i, c in enumerate(contours):
            area = cv.contourArea(c)
            if area > maxArea:
                maxArea = area
                maxIndex = i
        # 绘制轮廓
        cv.drawContours(cv_image, contours, maxIndex, (255, 255, 0), 2)			

        # 获取外切矩形
        x, y, w, h = cv.boundingRect(contours[maxIndex])
        cv.rectangle(cv_image, (x, y), (x + w, y + h), (255, 0, 0), 2)
        # 获取中心像素点
        center_x = int(x + w / 2)
        center_y = int(y + h / 2)
        cv.circle(cv_image, (center_x, center_y), 5, (0, 0, 255), -1)
		# 显示图像
        cv.imshow("Image", cv_image)

        # 运动控制
        twist = Twist()
        # 左右转向和移动
        if center_x < screen_center - offset:
            twist.linear.x = 0.0
            twist.linear.y = 0.2
            twist.angular.z = 0.2
            print "turn left"
        elif screen_center - offset <= center_x <= screen_center + offset:
            twist.linear.x = 0.0
            twist.linear.y = 0.0
            twist.angular.z = 0
            print "keep"
        elif center_x > screen_center + offset:
            twist.linear.x = 0.0
            twist.linear.y = -0.2
            twist.angular.z = -0.2
            print "turn right"
        else:
            twist.linear.x = 0
            twist.angular.z = 0
            print "stop"
		# 上下移动
        if center_y < screen_center_h - offset_h:
            twist.linear.z = 0.2
            print "up up up"
        elif screen_center_h - offset_h <= center_y <= screen_center_h + offset_h:
            twist.linear.z = 0
            print "keep"
        elif center_y > screen_center_h + offset_h:
            twist.linear.z = -0.2
            print "down down down"
        else:
            twist.linear.z = 0
            print "stop"
        cv.waitKey(3)
		# 发布运动指令
        try:
            self.cmd_pub.publish(twist)
        except CvBridgeError as e:
            print e


if __name__ == '__main__':
    try:
        rospy.init_node("cv_bridge_test")
        rospy.loginfo("Starting cv_bridge_test node")
        image_converter()
        rospy.spin()

    except KeyboardInterrupt:
        print "Shutting down cv_bridge_test node."
        cv.destroyAllWindows()

效果图
在这里插入图片描述
在这里插入图片描述

2. 自主寻线

将上节的物体识别改为所寻线,运动控制左右移动/转向,剩下就是调参的事情了

OpenCV是一个开源的计算机视觉库,可以用于实现很多视觉任务,包括视觉循迹。视觉循迹是一种使用计算机视觉技术来自动检测和跟踪特定对象的方法。 在使用OpenCV实现视觉循迹时,首先需要通过摄像头或视频文件获取图像数据。然后,我们可以使用图像处理技术,如颜色空间转换、二值化等,将图像数据转换为更容易处理的形式。 接下来,我们可以使用OpenCV提供的对象检测器,如Haar特征分类器、级联分类器等,来检测感兴趣的对象。这些检测器可以通过训练样本来学习并识别目标对象,如人脸、车牌等。 一旦我们检测到了目标对象,我们就可以使用OpenCV的跟踪算法来跟踪对象的运动。这些算法可以根据目标对象在不同帧之间的位置变化来估计其速度和运动轨迹。 当我们成功地跟踪到对象并获取了其运动轨迹,我们就可以根据具体的应用需求来进行下一步的操作。例如,如果我们正在制作一个自动驾驶系统,我们可以根据对象的运动轨迹来调整车辆的行驶方向和速度。 总的来说,使用OpenCV实现视觉循迹可以帮助我们自动检测和跟踪特定对象,为很多应用提供便利和支持。无论是在工业自动化、机器人导航还是智能交通等领域,视觉循迹都发挥着重要的作用。而OpenCV作为一个功能强大且易于使用的视觉库,使得实现视觉循迹变得更加简单和高效。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arcann

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值