基于QT与Opencv的多旋翼无人机循线的实现(代码开源)
我采用的方案是将图像处理放在上位机上来做,由于个人比较倾向于软件方向,所以四旋翼的硬件部分直接才用了正点原子的硬件,这样也有一个好处,就是大家如果买正点原子的硬件去做,可以很方便的实现功能。
我做的比较浅,有些功能还没有实现
代码链接我在****上传审核通过后会放出来
遥控器代码:https://download.****.net/download/weixin_42521239/11185622
上位机代码:
如果没有积分的小伙伴也可以直接在评论区中留下你的邮箱,我稍后发给你。
首先放张图吧,这是QT的上位机界面
放张正点原子四旋翼的图片
好,下面介绍一下我是怎么做的(其实我没有完全做完,下面的介绍中我会指出什么地方没做完)
一、飞控的代码
飞控的代码我没有任何改动
二、遥控器代码
遥控器的代码有部分改动。因为如果你要用自己的硬件去做一架循线四旋翼,你是一定要用数据传输的设备的,正好正点原子的遥控器可以做到上位机和遥控器的通信(将遥控器与电脑用usb线相连即可),而且正点原子的四旋翼本身载重能力不强,不能再带其他设备了。
遥控器的代码改了哪里呢?
主要是remoter_ctrl.c,atkp.c,usblink.c这几个文件
remoter是遥控器的控制数据的主要代码
atkp主要是实现协议解析的代码
usblink是电脑与遥控器通过usb线通信的代码
(!!!!直接下载代码使用的小伙伴要小心!!!!!我在代码里去掉了解锁!!!!飞机推油门就会飞!!!!!)
其中比较重要的就是usblink这个通信方面的代码,因为我这个是把图像放在上位机上处理的,所以需要将位置偏差转换为控制量。下面这个代码主要就是上位机传下来的控制量。
if (usbGetDataWithTimout(&c))
{
switch(rxState)
{
case waitForStartByte1:
rxState = (c == DOWN_BYTE1) ? waitForStartByte2 : waitForStartByte1;
cksum = c;
break;
case waitForStartByte2:
rxState = (c == DOWN_BYTE2) ? waitForDataLength : waitForStartByte1;
cksum += c;
break;
case waitForDataLength:
rxPacket.dataLen = c;
rxState =waitForData;
break;
case waitForData:
rxPacket.data[dataIndex] = c;
dataIndex++;
if(dataIndex==4)
{
rxState = waitForChksum1;
dataIndex=0;
}
break;
case waitForChksum1:
//if (cksum == c)/*所有校验正确*/
if (c == 0x15)/*所有校验正确*/
{
//xQueueSend(rxQueue, &rxPacket, 0);
upAnalyze(&rxPacket);
}
else
{
rxState = waitForStartByte1;
}
rxState = waitForStartByte1;
break;
default:
break;
}
这个协议的意思是
这个一对比,是不是就非常清晰了。前面两个帧头,然后是length帧,横滚的控制帧,俯仰的控制帧,航向的控制帧,油门的控制帧,最后是校验帧。
三、上位机代码
上位机我是用QT5.10+Opencv2.4.9写的
在没加上图像之前,我首先是做了一个测试的界面,这个测试的功能就是模拟图像的偏差,对飞机进行控制。
在另外的一个图形界面里,我做了一个简单的控制飞机前后左右飞行的按钮,现在包括之前提到的上位机的部分已经全部调试好了,也就是说可以通过模拟的图像偏差和前后左右飞行的按钮来控制飞机。
然后按一下打开按钮,上位机就会自动读取测试视频(这里到时候可以改为读取摄像头的程序就好了,改起来非常简单)
四、机载摄像头
有些的人搞得非常复杂,又是图传又是摄像头的,非常麻烦。
这里我依然使用正点原子的wifi摄像头,重量轻,帧率也满足要求了。
那么怎么将正点原子的WiFi摄像头的视频在上位机上读取出来呢?
查看正点原子的wifi摄像头,我们可以发现,其官方资料给出了一种在电脑浏览器上显示拍摄视频的方法。但在浏览器上显示不是我们想要的啊。这里我们要使用到一种将wifi摄像头固定为本地摄像头的方法。
浏览器可以通过访问ip地址的方式来读取摄像的视频数据。那么记住这个IP地址
打开IPCamAdapter_x64软件,输入正点原子的ip地址,然后点击autodetect。成功之后就可以像调用本地摄像头一样调用wifi摄像头了。这个软件可以到这个博客里下载:
https://blog.****.net/weixin_42521239/article/details/86546583
好了,介绍到这里也差不多说完了。如果有不明白的可以在评论里问我。
链接我在****上传审核通过后会放出来
遥控器代码:https://download.****.net/download/weixin_42521239/11185622
上位机代码:
如果没有积分的小伙伴也可以直接在评论区中留下你的邮箱,我稍后发给你。