[大疆航线] 系列(2) 基于KML或WPML文件的航点动作设计与自定义航线
关键词:无人机航线
、航点动作
、kml航线文件
,wpml航线软件
作者:ludwig1860
日期:2024.7.3
1. KML的高级使用
如果需要精准控制每个航点以及航点处的动作,就需要对KML文件进行调整。怎么调整呢?
从DJI Pilot地面站软件中自行编辑一个满足自己所有调整需求的航线(仅包含几个航点即可,目的是为了导出KML文件后查看各个动作标签是什么,该怎么写)
导出KML后,按照该KML文件的格式,自行写代码生成KML文件
将自定义的KML文件导入至DJI Pilot 或者GS PRO,即可执行该航线。 特别注意:目前该种方式生成的KML文件支持DJI Pilot, DJI Pilot 2,可能在GS PRO上存在些问题(GS PRO导入KML文件的功能是额外收费的哦)。不支持GS RTK。
以下截取了该种KML文件的一部分,可以看到,对于航点1,无人机的偏航角被调整为135°,云台的俯仰角被调整为-30°,飞行高度的模式为相对地面高度。
<Placemark>
<name>Waypoint1</name>
<visibility>1</visibility>
<description>Waypoint</description>
<styleUrl>#waypointStyle</styleUrl>
<ExtendedData xmlns:mis="www.dji.com">
<mis:useWaylineAltitude>false</mis:useWaylineAltitude>
<mis:turnMode>Auto</mis:turnMode>
<mis:heading>135</mis:heading>
<mis:gimbalPitch>-30</mis:gimbalPitch>
<mis:actions>ShootPhoto</mis:actions>
</ExtendedData>
<Point>
<altitudeMode>relativeToGround</altitudeMode>
<coordinates>114.22104084422674,39.82171229314839,100.14499999999998</coordinates>
</Point>
</Placemark>
注意:以上KML文件每个航点的坐标顺序:
经度
、纬度
、高程
2. KML与WPML文件
先给大家看一段大疆给出的一个背景:
在过去很长的一段时间里,航线仅能在单一设备上编辑、执行,跨设备跨机型应用困难重重。航线文件格式不公开、不共享,用户难以独立完成二次编辑、业务调优的工作。
本着为行业和用户解放重复生产力的愿景,大疆正式对外发布航线文件格式标准——WPML (WayPoint Markup Language 的缩写)。
一头雾水是吧,我刚一开始也意识不到,其实大家可以想象这样一个场景,当你费了很大劲设计了一条航线,用在你的御3无人机上挺好的,但是自己或者别人也想用一下这个航线,并且用在经纬M300上时,那就又需要重新画一次航线,这不就是重复劳动了嘛。
所以大疆想着将这些机型的航线格式进行统一,也就是标准化,进而推出了WPML文件。
特别注意:WPML 航线文件格式标准基于 KML(Keyhole Markup Language)的定义进行扩展。WPML 航线文件遵循 KMZ 归档要求,所有航线文件以 “.kmz” 后缀结尾。
KMZ文件实质是使用 ZIP 格式打包的归档文件,也就是说,直接将压缩包的后缀名zip更改为kmz。
WPML 航线文件解压后的文件结构(res文件夹可以没有):
waypoints_name.kmz
└── wpmz
├── res // 资源文件
├── template.kml // 模板文件
└── waylines.wpml // 执行文件
注意:
航线文件内部各文件或文件夹的命名请遵循此规范,否则可能导致航线文件读取失败。 航线名称即航线文件的文件名。如 new_waypoints.kmz
的航线名称是new_waypoints
。该WPML文件目前仅支持御3行业版、多光谱版、经纬300 RTK、经纬350 RTK等行业用途无人机。
有关该航线文件的详细介绍,请查阅:Link,还有一些MSDK的航线编辑教程:Link。如果需要自己开发航线规划软件,可以参考大疆的说明,把各个字段搞清楚,通过参数控制无人机的指令。
特别注意:
当导入WPML的KMZ文件到Pilot 2地面站时,KMZ文件中的
template.kml
是必须的,而waylines.wpml
不是必须的。 当Pilot 2生成具体执行航线时,会自动在该KMZ文件中生成对应的waylines.wpml
。当导入WPML的KMZ文件到司空 2 (英文名为Flighthub 2)地面站时, KMZ文件中必须在wpmz文件夹中同时包含
template.kml
和waylines.wpml
,方能被司空2识别和解析。
司空2是在线的Link,目前可以免费使用哦。
如下展示了template.kml文件中某个航点的飞行动作指令,确实有点复杂了。
<Placemark>
<Point>
<coordinates>116.25419,40.25471</coordinates>
</Point>
<wpml:index>1</wpml:index>
<wpml:ellipsoidHeight>74.3602094162653</wpml:ellipsoidHeight>
<wpml:height>74.3602094162653</wpml:height>
<wpml:gimbalPitchAngle>-32.0</wpml:gimbalPitchAngle>
<wpml:waypointHeadingParam>
<wpml:waypointHeadingMode>smoothTransition</wpml:waypointHeadingMode>
<wpml:waypointHeadingAngle>39.0</wpml:waypointHeadingAngle>
<wpml:waypointPoiPoint>0.000000,0.000000,0.000000</wpml:waypointPoiPoint>
<wpml:waypointHeadingPathMode>followBadArc</wpml:waypointHeadingPathMode>
<wpml:waypointHeadingPoiIndex>0</wpml:waypointHeadingPoiIndex>
</wpml:waypointHeadingParam>
<wpml:waypointSpeed>4</wpml:waypointSpeed>
<wpml:useGlobalHeight>1</wpml:useGlobalHeight>
<wpml:useGlobalSpeed>0</wpml:useGlobalSpeed>
<wpml:useGlobalTurnParam>1</wpml:useGlobalTurnParam>
<wpml:useStraightLine>0</wpml:useStraightLine>
<wpml:actionGroup>
<wpml:actionGroupId>2</wpml:actionGroupId>
<wpml:actionGroupStartIndex>1</wpml:actionGroupStartIndex>
<wpml:actionGroupEndIndex>1</wpml:actionGroupEndIndex>
<wpml:actionGroupMode>sequence</wpml:actionGroupMode>
<wpml:actionTrigger>
<wpml:actionTriggerType>reachPoint</wpml:actionTriggerType>
</wpml:actionTrigger>
<wpml:action>
<wpml:actionId>0</wpml:actionId>
<wpml:actionActuatorFunc>zoom</wpml:actionActuatorFunc>
<wpml:actionActuatorFuncParam>
<wpml:payloadPositionIndex>0</wpml:payloadPositionIndex>
<wpml:focalLength>36.0</wpml:focalLength>
</wpml:actionActuatorFuncParam>
</wpml:action>
<wpml:action>
<wpml:actionId>1</wpml:actionId>
<wpml:actionActuatorFunc>rotateYaw</wpml:actionActuatorFunc>
<wpml:actionActuatorFuncParam>
<wpml:aircraftHeading>51.0</wpml:aircraftHeading>
<wpml:aircraftPathMode>counterClockwise</wpml:aircraftPathMode>
</wpml:actionActuatorFuncParam>
</wpml:action>
<wpml:action>
<wpml:actionId>2</wpml:actionId>
<wpml:actionActuatorFunc>gimbalRotate</wpml:actionActuatorFunc>
<wpml:actionActuatorFuncParam>
<wpml:gimbalRotateMode>absoluteAngle</wpml:gimbalRotateMode>
<wpml:gimbalPitchRotateEnable>1</wpml:gimbalPitchRotateEnable>
<wpml:gimbalPitchRotateAngle>-32.0</wpml:gimbalPitchRotateAngle>
<wpml:gimbalRollRotateEnable>0</wpml:gimbalRollRotateEnable>
<wpml:gimbalRollRotateAngle>0.0</wpml:gimbalRollRotateAngle>
<wpml:gimbalYawRotateEnable>0</wpml:gimbalYawRotateEnable>
<wpml:gimbalYawRotateAngle>0.0</wpml:gimbalYawRotateAngle>
<wpml:gimbalRotateTimeEnable>0</wpml:gimbalRotateTimeEnable>
<wpml:gimbalRotateTime>0.0</wpml:gimbalRotateTime>
<wpml:payloadPositionIndex>0</wpml:payloadPositionIndex>
</wpml:actionActuatorFuncParam>
</wpml:action>
</wpml:actionGroup>
</Placemark>