文绍斌:无人机+程序猿==啥 | DroneSalon演讲回顾
「DroneSalon - 无人机软件创新沙龙」于 10 月 14 日下午在广州 T.I.T 创意园顺利举行(活动回顾),短短一个下午的时间,三位演讲嘉宾分别从自己的专业角度对「无人机+软件」主题进行了高质量的内容分享。DroneDev 微信公众号(id:dronedev)会根据现场录像,及后期嘉宾审阅对嘉宾的演讲内容进行详细的文字版整理。
今天给大家带来的是文绍斌(烧饼)的在沙龙上的演讲《无人机 + 程序猿 == 啥》。他以大疆的产品作为例子,跟大家探讨了无人机除了作为一台「会飞的相机」,当它遇到开发者时,还可以产生哪些有趣的应用场景。
文绍斌,一位资深的 DJI SDK 开发者,有着丰富的 DJI 第三方应用程序的开发经验,目前在一家无人机服务供应商(DaaS)公司中担任 iOS 工程师。
以下,Enjoy:
说起无人机,可能普通消费者的第一反应就是高大上,航拍。确实,无人机可以突破我们肉身的物理限制,作为人类肉眼的延伸,让我们可以轻而易举地探索到以前千辛万苦都难以到达的地方。
但是除了作为一台「会飞的相机」,无人机身上所具有的其他部件,让它拥有更加广阔的想象空间。
部件 · 相机
对于相机这个部件,它产生的数据当然是图像数据了。图像数据经过编码,传输到我们的手机上,这就是我们飞无人机时所看到的实时图传了:
作为我们肉眼的延伸,这些图传数据除了用于展示风景外,还可以进行怎么样的科技加工呢?
VR
首先,我们可以直接针对图传的展示形式做处理,它现在是平面的,但我们可以尝试将它变成立体的。去年是 VR 爆发的元年,Google 等大公司也介入推进 VR 的发展,并提供一套比较完善的 SDK 来开发 VR 相关的特性,对于无人机软件开发者来说,这将极大地方便开发者将无人机图传转换为 VR 图像(烧饼在现场展示了 Litchi app 上的 VR 功能介绍视频,下图为视频截图)。
图传传输
我们的图传,是在移动设备上显示的。这就意味着,我们还可以利用移动设备上面的所有资源,其中最有价值的资源,当然就是网络了。通过网络,图传数据可以被传输出去:
既可以考虑将视频数据压缩之后,利用互联网将数据发送到远端的设备上。这里可以采用主流的视频直播协议比如 RTMP,又或者利用 WebRTC 来实现 P2P 数据传输,甚至还可以自行利用 UDP 跟 TCP 自定义一套传输协议。这样可以做到,你在广州飞无人机,你的家人在顺德、佛山、山东等地区观看到你通过无人机所捕获的景色,甚至还可以利用网络信号远程控制你的无人机进行拍照。
除了通过互联网传输数据,我们也可以实现近地传输,在同一个局域网内,利用 Socket 直接将数据发送到目标设备上。如果在 iOS 上,还可以利用 MultipeerConnectivity 这个库,即使两台设备没有连接到同一个局域网,也可以通过 P2P Wi-Fi 来高速传输视频数据。
除了图传信号的共享,我们还可以将相机的控制信号指令通过网络传输出去,这其实里面就蕴含着一个很有潜力的产品雏形——多人无人机协作,可以说这里的想象空间非常大。
GPU
除了网络,移动设备上还有资源可以使用呢。就是它那越来越强大的 CPU,还有 GPU。于是,我们就可以拿着这些图传数据做一件当下相当火热的事情,机器学习(Machine Learning)。
当然,要在移动设备上面训练一个模型不太现实,不过去使用一个已经有的模型还是可以应付的。比如,我们可以利用苹果开放的一些已经封装好的模型,来识别无人机图传画面上所拍摄到的主要物体都是些什么。
结合上面说的「图传传输」部分,如果能将图像数据通过网络共享出去,那么图像处理的这个耗资源的操作就可以「外包」到性能更高的电脑中做处理,比如说利用 OpenCV 来对图像中的内容做一些特定条件筛查。
图片建模
相机另外两种数据输出格式是照片跟视频。在测绘工作里面,有一个经典的需求,那就是生成某个区域的正射影像图。
这里是香港科技大学的数字正射影像图(Digital Orthophoto Map,简称 DOM),第一眼看上去可能跟我们通常看到的卫星图有点类似。但其实有很大不同。首先它精度比较高,为了达到 DOM 所要求的精度,通常都需要无人机在低空飞行,连续拍照,最后再做合成以及纠正拼接,然后才能生成某个区域的 DOM。而这里提到的纠正便是指将无人机拍出来的中心投影的影像纠正为没有透视效果的平面影像,图像经过这样的纠正处理,才具有测绘学上的意义。
左图为理想的正射影像图示例,右图为未纠正为正射影像图之前的状态除了生成 2D 影像,我们还可以通过无人机采集到的图像数据来建立 3D 模型,利用 DJI 设备的热点环绕功能,环绕建筑物飞行,然后拍照,再将照片经过类似 Altizure,Pix4D 等处理软件进行建模处理。
以上两款软件都是已经面向用户市场的商业化软件。但对于我们应用层的开发者来说,我们还可以尝试一下同样强大的来自 OpenDroneMap 开源库的 WebODM,我们可以把 WebODM 部署在自己的电脑或者服务器上,来提供生成正射影像图以及 3D 模型的服务。
图片拼接
在生成正射影像图的过程中,涉及到拼接无人机所拍照片的步骤,这容易让人想到另外一种使用场景——生成球型全景照片。利用 OpenCV 这个我们耳熟能详的计算机视觉神器,我们可以将无人机采集到的照片拼接起来,生成一张全景图,然后放到一些全景照片的播放器里面播放,或者是利用前面提到的 VR 来展示。至于照片的采集方法及思路如下:
利用 DJISDK 提供的 TimelineMission,控制无人机的云台以不同的朝向拍摄若干张照片即可。需要注意的是这样生成的全景图是没有天空的,所以这里还有一个步骤,就是补天。当然也可以用 OpenCV 来自动完成,做到只需要用户导入采集到的原照片,最后输出得到拼接好并且具有天空的全景图。
部件 · GPS
WaypointMission
很多人接触 DJI SDK 的开发者接手的第一项任务就是开发航点规划的功能。具体点来说就是用户可以在地图上点选若干个地点,生成一条路径,接着无人机便按着这条路径自动飞行。
但是身处中国的伙伴就要注意了,这里有一个坑,那就是国内其实存在着一个东西叫做火星坐标。如果使用的是国内的地图服务,比如高德,那么其实通过地图获取到的坐标并不是 DJI 的设备所需要的 WGS 坐标系的坐标,而是 GCJ02 坐标系的坐标,也就是国家测绘局的坐标。关于它诞生的来由以及这个加密解密的算法就不多说了,网上有很多资料。如果你使用的是百度地图,那就更加要注意了。因为百度地图自己又有另外一套坐标,我们暂且把它称为 BD 坐标系。
如果你希望自己的产品在国内外都能顺畅使用,那比较推荐使用 MapBox 提供的地图服务,在国内还是国外,通过地图选点获取到的坐标都是 WGS84 坐标系的坐标,通俗点说就是标准的 GPS 坐标。而且它的数据来源并不是高德,可能是四维图新,在一些高德显示的卫星图为一片模糊的地方它依然能够清晰地显示。
值得注意的是,在 DJI SDK 迭代到 4.1 时,由于政策原因,SDK 里引入了一个比较麻烦而且有点小坑的应用激活机制,并且在 Realease note 里面这提到可以保证开发者在国内可以正确的地理信息,但实际开发时,发现无人机返回的坐标数据,以及接收的坐标数据,依然是 WGS84 坐标系的坐标,也就是标准 GPS 坐标。
自动巡航
这是 Pix4D Capture 的操作界面,通过它的交互,用户可以在地图上面框选一个区域,生成一条路线来充满这个区域,接着让无人机沿着这条路线自动飞行,并且通过间隔拍照采集数据。如果再加上无人机的避障传感器,甚至还能够做到自动的障碍物巡检。
部件 · IMU
最后要介绍的是 IMU 部件。一般来说,一个 IMU 内会装有三轴陀螺仪以及三个方向的加速度计。有了它,无人机可以告知开发者它每个时刻的姿态数据。比如说无人机的朝向,以及在三个坐标轴上的速率。那拿到这些速率之后我们又可以做些什么呢。
试想一下,如果你是一个航拍爱好者,当你在户外一个人进行拍摄的时候,你可能需要同时控制无人机的航向以及云台的朝向。对于类似 Phantom、Spark 这类单云台、单镜头的机器,当你调整了云台之后,可能也会影响你对无人机的操控,因为云台的朝向可能不再跟无人机的朝向一致了。
对于比较大的空域,我们可以考虑使用前面提到的航线规划,那如果是一块小草地上面的操控呢,当你进行了一连串的高超操作的时候,却发现有一个地方云台没有调整好,那刚才的操作岂不是白费了?
如果可以将前面进行操作时的速率数据保存下来,然后再让无人机完美重现这次飞行操作,那我们就只需要专注于云台以及拍摄画面的调整,那上面提到的问题岂不是得到解决了吗。那么此时,IMU 部件的作用就出来了,我们可以通过保存读取 IMU 的数据来实现这个需求了。
主题演讲的最后,烧饼在现场用 DJI Spark 展示了这个需求场景的 Demo。我们可以通过下面的视频观看到这个现场 Demo ,并可连同上文的分享内容一起回顾活动当天烧饼的精彩分享: