使用YoloV5搭建追踪云台的教程(不含源码)

  一.简介

        本教程主要是使用YoloV5模型来实现对某一单一目标类型进行识别,并通过云台来实现对目标的追踪。由于本教程相关的项目目前正在参加比赛,所以不能透露出全部代码,请见谅!

       注:本教程较为简洁,只提供代码逻辑,详细教程后续会发布(包含完整代码)

二.教程 

1.设备

        硬件需要树莓派5(所有支持IIC协议的Linux设备都可以),PCA9685板,USB摄像头,SG90S舵机两个,云台。(如图)

        库的话需要YoloV5模型,adafruit_servokit库(控制舵机),numpy库,OpenCV库,torch库,time库。

2.教程

     前两部分代码逻辑大致如下(以无人机举例):

    首先便是导入“二”部分的所有库,之后创建一个class

class DroneTracker:
   #........

   #最后别忘了释放资源
if __name__ == "__main__":
    tracker = DroneTracker()  #这里你class里面是什么就写什么
    try:
        tracker.detect_and_track()
    finally:
        cv2.destroyAllWindows()  
        print("程序已结束,资源已释放。")

        创建完了之后搞几个def

def __init__(self):   #初始化舵机,PCA9685板是16通道的一块控制板
        self.kit = ServoKit(channels=16)
        self.Servo1 = self.kit.servo[0]  # 控制水平旋转
        self.Servo2 = self.kit.servo[1]  # 控制垂直俯仰
        #........
        self.Servo1.angle = 90  # 初始化角度
        self.Servo2.angle = 90
        #........

       这里主要是初始化舵机,设置初始化角度,一般设置90度,毕竟直接在中间也方便许多。同时我用的云台只需要2个舵机,就设置了两个舵机,当然你也可以搞16个(最多16个),全凭自己喜好哈doge 

       完了之后设置一下自己的模型

        self.device = select_device('cpu')  # 或者使用 'cuda' 如果有GPU
        self.model = DetectMultiBackend('你自己模型的地址', device=self.device)
        self.model.warmup((1, 3, 640, 640))  # 模型预热

 

     记住别忘记改一下模型的地址哈,这里YoloV5我喜欢V5S,在Linux上面运行相对流畅

     下一步就是怎么设置舵机的旋转了,话不多说,直接上这一部分的代码!

      

    def adjust_servos(self, x_offset, y_offset):
        """根据偏移调整舵机角度"""
        new_x_angle = max(1, min(180, self.Servo1.angle + x_offset))
        new_y_angle = max(1, min(180, self.Servo2.angle + y_offset))
        self.Servo1.angle = new_x_angle
        self.Servo2.angle = new_y_angle

       

        这里我是设定的根据目标距离图像中心的x,y差值来控制舵机的移动,在这段代码中是” x_offset和 y_offset“,后面也会有提到,这两个数值就是偏移距离,这样的话可以让舵机的移动更加”丝滑“!

        好了,最重点的地方来了,就是怎么检测特定的单一目标并追踪呢?

        在完成视频读取等一系列动作之后,之后便是特定种类的识别,这一段代码是这样的:

if self.model.names[int(cls)] == 'drone':

       对,其实就是一个简单的if判断 ,将识别到的特定目标读取后,这时就有了以下代码

x_offset = -(center_x - screen_center_x) / frame_width * 10
y_offset = (center_y - screen_center_y) / frame_height * 10
self.adjust_servos(x_offset, y_offset)

      这样前面舵机的偏移度数就有了 ,就会根据差值来计算偏移度数了,然后这一段完整代码等比赛结束后会向各位展示的,因为比较重要,几个项目都有(抱歉)

     最后”show“以下,返回结束进程,整个代码就结束了!

cv2.imshow('Drone Tracking', frame)
if cv2.waitKey(1) == ord('q'):  # 按'q'退出
    break

三.总结

     其实没展示的代码是重中之重,后续会更新的,敬请期待!

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proteus 8 Professional是一款电路设计软件,可以用它来模拟和测试电路。如果你想要在Proteus 8 Professional中编写舵机程序,你需要使用微控制器来控制舵机。以下是一个简单的舵机控制程序示例: ``` #include <reg51.h> sbit servo = P1^0; // 将舵机连接到P1.0引脚 void delay_us(unsigned int us) // 微秒级延迟函数 { while(us--); } void main() { TMOD = 0x01; // 设置计时器0为模式1 TH0 = 0x4B; // 设置计时器0的高8位 TL0 = 0xFD; // 设置计时器0的低8位 TR0 = 1; // 启动计时器0 while(1) { servo = 1; // 将P1.0引脚置为高电平 delay_us(1500); // 延时1.5ms servo = 0; // 将P1.0引脚置为低电平 delay_us(18500); // 延时18.5ms } } ``` 这个程序使用计时器0来控制舵机。计时器0的工作原理是将TH0和TL0寄存器中的值加载到计时器中,在每个时钟周期中递减计时器的值,直到计时器的值为0时触发中断。在这个程序中,我们设置计时器0为模式1,它将自动重载,并在计时器值为0时触发中断。我们将TH0和TL0寄存器设置为适当的值,以便每20ms触发一次中断。在中断服务例程中,我们将P1.0引脚置为高电平1.5ms来控制舵机的角度。然后,我们延迟18.5ms,将P1.0引脚置为低电平,以便舵机返回到初始位置。 请注意,这只是一个简单的舵机控制程序示例,你需要根据你使用的舵机和微控制器进行适当的修改。同时,你需要将这个程序编译成HEX文件,并将其加载到微控制器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值