MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充

在地面站做一些显示和指令写入的时候,因为PX4和Ardupilot固件的差异,在显示和指令写入都有不同。会有一些调试技巧,来帮助更好的调试。本次课程主要的MAVLINK库是剥离于MP的代码,所以课程的重点也是讲解ardupilot固件的地面站。甚至不同机型用不同的地面站,来降低地面站的兼容性和复杂程度。下面的PX4的固件地面站的编写只是做一个方向说明,在第三章不做深入讲解。

1、利用SimpleExample和Mavlink inspector的调试使用

如果调试Ardupilot固件SimpleExample(在前几节介绍过),我们只要修改一下代码就可以知道打印出当前的消息ID。这个可以直观看到消息ID,然后我们在http://mavlink.org/messages/common 里面对于也可以找到目前飞控系统对外发布了什么消息,找到我们想要的消息,解析即可。

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第1张图片

 如果调试PX4的固件也有比较好的工具就是:

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第2张图片

Mavlink inspector这是Mavlink消息监视工具,不过这个工具也支持Ardupilot固件。QGC的地面站同时指出Ardupilot固件和PX4的固件,其实QGC的软件也非常强大和开源,只是过年用的人比较少。用QGC这个工具也非常方便调试MAVLINK消息。

2、Mavlink设置模式指令的填充

虽然MAVLINK库做了比较好的封装,但是还是有一些填充要点要注意,不同机型的填充指令的区分,Ardopilt和PX4固件的多机型支持,尤其是模式指令发送,不同的机型的模式不一样,发送的指令ID也不一样,有些模式的发送要跟踪到控制器代码里面 典型模式发送的mavlink库函数如下
MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第3张图片

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第4张图片

ranslateMode 是做固件选择的函数,这个函数负责模式翻译,把不同类型的机架的模式控制筛选出来。这也是MP地面站支持不同种机型的地方,但是虽然里面对于PX4有选择的代码,但是支持还是不完善确切的就是不支持PX4固件。 在模式设置里面要填充
 MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第5张图片

这个结构体要填充,其中basemode是1,固定的值。 custommode不同机型设置的值都不一样。
在旋翼固件里面如下: \ardupilot-master\ardupilot-master\ArduCopter\defines.h

// Auto Pilot Modes enumeration
MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第6张图片

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第7张图片

\ardupilot-master\ardupilot-master\ArduPlane\defines.h
MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第8张图片

 PX4固件

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第9张图片

 

3、Mavlink控制指令的填充

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第10张图片

} 发送指令的基本函数其中MAVCMD是指令ID 在Mavlink/Mavlink.cs的
public enum MAVCMD: ushort
 MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第11张图片

包含了航点指令,悬停指令,一键起飞指令,跟踪指令,降落指令。mavlinkcommandlong_t是一个结构体,每次发送以前填充好这结构体里面的内容。不同指令参数不一样在http://mavlink.org/messages/common
MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第12张图片

 MAV_CMD

MP地面站二次开发教程(三)Mavlink通讯协议(4)地面站数据显示调试及其指令填充_第13张图片

generatePacket((byte)MAVLINKMSGID.COMMAND_LONG, req, sysid, compid);这个是具体的发送函数,把填充好的一包数据指令发送出去。飞控接收到相关指令,就会执行相应的动作。
 

你可能感兴趣的:(c#)