协同搬运组上位机方案分享
2022-08-25
本文主要介绍了 山魂四队 参加 第十七届全国大学生智能汽车竞赛群体智能挑战赛协同搬运组 比赛时,“边云结合”的“云”端程序,并且对架构做了分享。
笔者本次比赛原先参加的是完全模型组的比赛,只是很可惜因为种种原因,完全模型组并未进入国赛,故转战挑战今年国赛新组别协同搬运组的比赛!了解我这次智能车之旅,请参见 十七届智能车——南京之旅
参加两年智能车比赛过程中,受开源思想帮助很多,为了回报社区,并且帮助后来参加比赛的同学们,“云”端程序已经在 GitHub 上开源:hilookas/Wuhu_Coordinator
“边”端程序因为非笔者所写,且比赛仍然在进行中,待合适时机会进行分享。
关于完全模型组的分享,请参见:完全模型组 EdgeBoard 端快速调车经验分享
整体架构
协同搬运组任务与智能视觉组任务类似,但是多了使用 WiFi 模块的要求,并且在发车前不提供 A4 纸。与智能视觉组别相比,增加了了通信以及图像识别的要求。
排除有使用 WiFi 直接“人工”智能控制小车方案外,我们使用了场外架设摄像头的方案。
考虑到当今智能手机普遍提供有广角镜头,且自带有图像处理器(ISP)进行畸变矫正处理,相机分辨率也十分高,每个地标在摄像头中都有足够多的像素点,故我们采用了手机摄像头作为场外摄像头。
一台性能完全的笔记本电脑作为云端,遥控摄像头拍照,将照片回传,并且将计算的结果传给小车。小车之间会互相发送遥控信号进行避碰。
电脑、手机摄像头与小车的连接采用 WiFi 进行,通过一台手机共享出 2.4GHz 频段的 WiFi 热点,将这些设备组合在一个网络中。这样组网极大的方便了线下比赛时快速布置网络。
现场车辆放置以及手机摄像头放置如下图所示:
调用摄像头的问题
如今手机摄像头虽然强大,但是摄像头的使用多半是需要采用系统的私有 API 进行,对于此 Google 为 Camera2 添加了多摄像头 API 规范化摄像头调用,只是很可惜,经过我的测试,我的红米手机以及同学的华为手机都不兼容此 API。
不过我们采用了一个变通方案,即使用 Android 调试桥(ADB)模拟人手动拍照。ADB 提供有命令执行以及文件传输的接口,例如:
- 打开小米手机的摄像头可以使用:
adb shell am start -n com.android.camera/.Camera
- 列出最新的图片可以使用:
adb shell ls -t /sdcard/DCIM/Camera/IMG_20220822*
- 将图片传回电脑可以使用:
adb pull /sdcard/DCIM/Camera/IMG_20220822_xxxxxx.jpg recv.jpg
拍照的话,一个比较通用的方式是使用音量键模拟拍照键(自拍杆的原理):
adb shell input keyevent 24
ADB 也提供了无线连接手机的方式,可以首先使用有线连接到手机上,分别执行:
adb usb
adb tcpip 5555
adb connect <手机ip>:5555
即可无线连接到手机。
通过 adb devices
命令可以列出所有连接上的手机,通过 adb -s <device_name>
可以指定指令运行的设备。
点位的寻找
对于智能车比赛的赛道布,我们可以发现都是蓝色的,蓝色图像反映在 b 通道即为白色,而地标本身也为白色,白色之间不好区分。我们可以采用 g 或者 r 通道作为灰度图,这样赛道布为黑色,地标为白色,很大的方便了我们寻找地标点。
虽然手机摄像头拍照厉害,但是对于整个场地,可能还是略显捉急,所以我们可以让两个手机各自负责半场的区域:
此外我们发现,如果把摄像头放在边线中点上,摄像头为了拍到半场,需要往后后退许多放置,而如果放置在角点上,可以贴边放置,节省很多空间,并且也不会影响小车的移动路径。
图为手机在比赛场上实际拍摄到的图片:
手机摄像头架设后,第一件事情需要拍照,并且通过人工点击场地的角点获取逆透视变换矩阵,在这个过程后,小车真正发车前,手机摄像头的角度和位置就不能变化了。逆透视可以很好的帮助我们找到地标所在的格子点。
实际场地可能有光斑,我们采用的是通过灰度差的方式来判断是否为地标,在一个地标周围8个点都比中间这个点暗的时候,认定为地标,对于边界模糊的光斑,这个方法运行良好,对于边界清晰的光斑,emm上机器学习吧qwq。
车辆路径的规划
我们将场地切分为四块,其中一辆车负责一列,另外一辆车负责三列,蛇形寻找,这样每辆小车运行结束后,车都会停在角落里,方便车卸下自己背着的图片,当然这个方案并不是最优的,仍然存在提升空间。
车辆避碰的挑战
左侧的小车在找完图片后,会往上和往左弹出自己的图片,右侧小车也会在找完图片后,相应的往上和往右弹出自己的图片。但是存在左侧小车往右弹出和右侧小车往左弹出的问题,这会导致两辆车的路径交叉,并且可能会导致车辆碰撞。
为了解决这个问题,左侧小车在弹完上面和左面的图片后在20行位置等待,右侧小车会在弹完上面和右面的图片后,前往到10行,并且在就绪后通知左侧小车可以运行,之后两辆小车会分别在10行和20行往对应侧移动,这个效果非常漂亮,只是很可惜线下赛比赛时,路径规划的程序出了点小问题,最后并没有走成这个样子qwq。
线下调试时录像如下:
双份车车~双份快乐~十七届智能车协同搬运组调试记录_哔哩哔哩_bilibili
结语
这次比赛时间紧任务重,但是由于 RTT 提供的对 lwip 的封装,程序编写过程简明易懂,很大的减少了工作量和工作时间,帮助我们快速的完成了比赛的任务。在此对 RTT 和逐飞的工程师表示感谢。
同时也在此对南京信息工程大学的老师们以及组委会表示诚挚的感谢,尽管比赛证件发生了丢失的情况,但是仍然很快的帮助我们补齐了需要的证件,让我们能够顺利进场比赛,人性化的组织以及有温度的管理让我们感受到了回家的感觉(泪目)!