目录

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

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

3、Mavlink控制指令的填充

4、MAV_CMD


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

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

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

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

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

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

虽然MAVLINK库做了比较好的封装,但是还是有一些填充要点要注意,不同机型的填充指令的区分,Ardopilt和PX4固件的多机型支持,尤其是模式指令发送,不同的机型的模式不一样,发送的指令ID也不一样,有些模式的发送要跟踪到控制器代码里面 典型模式发送的mavlink库函数如下

 public void setMode(byte sysid, byte compid, string modein)
{mavlink_set_mode_t mode = new mavlink_set_mode_t();if (translateMode(sysid, compid, modein, ref mode)){setMode(sysid, compid, mode);}
}public void setMode(byte sysid, byte compid, mavlink_set_mode_t mode, MAV_MODE_FLAG base_mode = 0)
{mode.base_mode |= (byte)base_mode;generatePacket((byte)(byte)MAVLINK_MSG_ID.SET_MODE, mode, sysid, compid);Thread.Sleep(10);generatePacket((byte)(byte)MAVLINK_MSG_ID.SET_MODE, mode, sysid, compid);
}

translateMode 是做固件选择的函数,这个函数负责模式翻译,把不同类型的机架的模式控制筛选出来。这也是MP地面站支持不同种机型的地方,但是虽然里面对于PX4有选择的代码,但是支持还是不完善确切的就是不支持PX4固件。 在模式设置里面要填充

public struct mavlink_set_mode_t
{/// <summary> The new autopilot-specific mode. This field can be ignored by an autopilot. </summary>public  uint custom_mode;/// <summary> The system setting the mode </summary>public  byte target_system;/// <summary> The new base mode MAV_MODE</summary>public  /*MAV_MODE*/byte base_mode;};

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

// Auto Pilot Modes enumeration

enum control_mode_t {
STABILIZE =     0,  // manual airframe angle with manual throttle
ACRO =          1,  // manual body-frame angular rate with manual throttle
ALT_HOLD =      2,  // manual airframe angle with automatic throttle
AUTO =          3,  // fully automatic waypoint control using mission commands
GUIDED =        4,  // fully automatic fly to coordinate or fly at velocity/direction using GCS immediate commands
LOITER =        5,  // automatic horizontal acceleration with automatic throttle
RTL =           6,  // automatic return to launching point
CIRCLE =        7,  // automatic circular flight with automatic throttle
LAND =          9,  // automatic landing with horizontal position control
DRIFT =        11,  // semi-automous position, yaw and throttle control
SPORT =        13,  // manual earth-frame angular rate control with manual throttle
FLIP =         14,  // automatically flip the vehicle on the roll axis
AUTOTUNE =     15,  // automatically tune the vehicle's roll and pitch gains
POSHOLD =      16,  // automatic position hold with manual override, with automatic throttle
BRAKE =        17,  // full-brake using inertial/GPS system, no pilot input
THROW =        18,  // throw to launch mode using inertial/GPS system, no pilot input
AVOID_ADSB =   19,  // automatic avoidance of obstacles in the macro scale - e.g. full-sized aircraft
GUIDED_NOGPS = 20,  // guided mode but only accepts attitude and altitude
SMART_RTL =    21,  // SMART_RTL returns to home by retracing its steps
FLOWHOLD  =    22,  // FLOWHOLD holds position with optical flow without rangefinder
FOLLOW    =    23,  // follow attempts to follow another vehicle or ground station
};

\ardupilot-master\ardupilot-master\ArduPlane\defines.h

enum FlightMode {
MANUAL        = 0,
CIRCLE        = 1,
STABILIZE     = 2,
TRAINING      = 3,
ACRO          = 4,
FLY_BY_WIRE_A = 5,
FLY_BY_WIRE_B = 6,
CRUISE        = 7,
AUTOTUNE      = 8,
AUTO          = 10,
RTL           = 11,
LOITER        = 12,
AVOID_ADSB    = 14,
GUIDED        = 15,
INITIALISING  = 16,
QSTABILIZE    = 17,
QHOVER        = 18,
QLOITER       = 19,
QLAND         = 20,
QRTL          = 21
};

PX4固件

# Main state, i.e. what user wants. Controlled by RC or from ground station via telemetry link.
uint8 MAIN_STATE_MANUAL = 0
uint8 MAIN_STATE_ALTCTL = 1
uint8 MAIN_STATE_POSCTL = 2
uint8 MAIN_STATE_AUTO_MISSION = 3
uint8 MAIN_STATE_AUTO_LOITER = 4
uint8 MAIN_STATE_AUTO_RTL = 5
uint8 MAIN_STATE_ACRO = 6
uint8 MAIN_STATE_OFFBOARD = 7
uint8 MAIN_STATE_STAB = 8
uint8 MAIN_STATE_RATTITUDE = 9
uint8 MAIN_STATE_AUTO_TAKEOFF = 10
uint8 MAIN_STATE_AUTO_LAND = 11
uint8 MAIN_STATE_AUTO_FOLLOW_TARGET = 12
uint8 MAIN_STATE_AUTO_PRECLAND = 13
uint8 MAIN_STATE_MAX = 14
uint8 main_state                # main state machine

3、Mavlink控制指令的填充

  public bool doCommand(byte sysid, byte compid, MAV_CMD actionid, float p1, float p2, float p3, float p4, float p5, float p6, float p7, bool requireack = true, MethodInvoker uicallback = null){giveComport = true;MAVLinkMessage buffer;mavlink_command_long_t req = new mavlink_command_long_t();req.target_system = sysid;req.target_component = compid;req.command = (ushort)actionid;req.param1 = p1;req.param2 = p2;req.param3 = p3;req.param4 = p4;req.param5 = p5;req.param6 = p6;req.param7 = p7;//log.InfoFormat("doCommand cmd {0} {1} {2} {3} {4} {5} {6} {7}", actionid.ToString(), p1, p2, p3, p4, p5, p6,//p7);generatePacket((byte)MAVLINK_MSG_ID.COMMAND_LONG, req, sysid, compid);

} 发送指令的基本函数其中MAVCMD是指令ID 在Mavlink/Mavlink.cs的
public enum MAVCMD: ushort
 

包含了航点指令,悬停指令,一键起飞指令,跟踪指令,降落指令。mavlinkcommandlong_t是一个结构体,每次发送以前填充好这结构体里面的内容。不同指令参数不一样在http://mavlink.org/messages/common

4、MAV_CMD

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

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

  1. MP地面站二次开发教程(一)开发环境搭建和编译

    目录 基于Mavlink的上位机地面站开发教程 第一节 开发环境搭建 1.预编译 (源码尽量放到非中文目录下面) 2.初次编译 ​ 3.删除这个speech引用,重新引用这个speech包(每个人的环 ...

  2. MP地面站二次开发教程(五)简易地面站多机控制系统框架

    目录 一 .硬件框架 二.使用方式 三.软件框架 1.设备链表 没添加一个载具/飞机,就在链表里面添加一个实例化了的类(飞机/载具对象) 2.Device类包含了串口和TCP通讯的方法,添加一个新的载 ...

  3. MP地面站二次开发教程(三)Mavlink通讯协议(3)地面站数据填充与显示

    目录 1.界面布局​ 2.基本参数的显示 3.UI初步设计​ 4 .数传端口打开 5.GPS卫星数据显示 6.电量显示 7.飞控模式状态显示​ 8.飞控数据报错显示 ​ 1.界面布局 这边是参考了拓攻 ...

  4. MP地面站二次开发教程(四)地面站优化及其功能测试

    目录 1.GMAP图片加载 2.实时路径显示与地图纠偏 3.指令发送的添加 前面章节已经描述清楚指令和航点的上传,有些优化和功能测试的工作在接下来的章节里面完成 1.GMAP图片加载 我们要实现上图所 ...

  5. QGC地面站二次开发(三)Qt 简洁地面站

    目录 多机控制原理 多机控制实现 简洁地面站优化 1. 飞机的飞行轨迹以不同的颜色区分 2. 控制所有的飞机 3. 将设定航线送给特定的飞机 多机控制原理 多机地面站支持 TCP. UDP 和串口等三 ...

  6. qgc开发文档_QGC地面站二次开发教程二

    上一次带大家进行了ubuntu下的Q Ground Control安装与编译,这次教大家对地面站的页面进行修改,对按钮或者页面进行删减,如何添加下次再说吧,我还没研究明白. 一开始打开qgroundc ...

  7. shopify二次开发教程_详细教程:如何将Shopify的Storefront API与React和Redux结合使用...

    shopify二次开发教程 by Chris Frewin 克里斯·弗里温(Chris Frewin) 详细教程:如何将Shopify的Storefront API与React和Redux结合使用 ( ...

  8. MIP开发教程(三) 使用MIP-CLI工具调试组件

    一 . 在 mip-extensions 仓库中创建新的组件 二 . 预览调试组件 三 . 在 MIP 页中引用自己编写的 MIP 组件 四 . 组件提交到 GitHub 仓库时需要进行校验 站长开发 ...

  9. 来自damon的zencart二次开发教程-3.1开发自己的zencart模板

    转载自:http://www.yunxiu.org/blog/ 今天在网上FQ看到一篇老外写的,关于制作zencart模板的文章.<Creating a new Zen Cart Templat ...

最新文章

  1. 一文看懂循环神经网络-RNN(独特价值+优化算法+实际应用)
  2. python account_GitHub - Python3WebSpider/AccountPool: Account Pool
  3. 一起学习android图片四舍五入图片集资源 (28)
  4. STM32 基础系列教程 9 – 串口通信
  5. 远程桌面Web连接访问及端口更改方法
  6. 传说中理科生看到会沉默、文科生看到会流泪的【程序员文史综合题目】
  7. java string类型时间比较大小吗_Java String类型时间比较大小
  8. 【java学习之路】(java SE篇)(练习)常用类和异常的简单练习
  9. 怎么新建web程序_前端程序员发展潜力最好,那该怎么学好web前端开发?
  10. 《Serverless 架构》序言
  11. 移动开发者Windows装机必备工具
  12. 51单片机与蓝牙模块连接
  13. 华为路由器 dopra linux passwd,使用华为光猫ONT使能工具后,本地主机如何通过Telnet登录光猫进行配置...
  14. hdu 5652 India and China Origins 并查集
  15. php bi报表,PowerBI开发 报表设计技巧
  16. 游苹果山赋——东南子(2010年旧文)
  17. RPO和RTO是什么?
  18. 高等数学(第七版)同济大学 习题2-2 个人解答(后7题)
  19. 开发一个简单易用的SDK的详细步骤(超详细,超适用)
  20. 神经风格迁移综述论文分享(neural style transfer review)

热门文章

  1. 安卓随时监测网络状态,判断当前网络是否可用
  2. MQTT–多个Zigbee监测网络远程监控的实现
  3. Pointnet++复现流程及问题解决
  4. Spring读书笔记-----Spring的Bean之Bean的基本概念
  5. 蛛网时代:我们不一样!BI工具中的创新者
  6. 2017-08-09-log4j-Appender输出目的地
  7. 2021-2027全球与中国接入网电信设备市场现状及未来发展趋势
  8. 寒假学习——固定usb转串口的设备名,cp210x
  9. JS实现炫酷雪花飘落效果
  10. java程序通过modbusTCP协议直连三菱PLC机FX5U型号采集数据