ardupilot开发 --- 测试 mav_cmd 篇

1. 参考

https://ardupilot.org/dev/docs/mavlink-commands.html

2. 通过 COMMAND_LONG 和 COMMAND_INT 发送 MAV_CMD

3. 测试

3.1 格式

message COMMAND_LONG  target_system(uint8_t)  target_component(uint8_t) command(MAV_CMD) confirmation(uint8_t)  param1(float)  param2(float)  param3(float)  param4(float)  param5(float)  param6(float)  param7(float) 

3.2 Requesting Data From The Autopilot

目的:获取所有参数;
使用REQUEST_MESSAGE命令,通过COMMAND_LONG发送:

message COMMAND_LONG  1 0 512 0 33 0 0 0 0 0 0

3.3 Getting and Setting Parameters

参考:https://ardupilot.org/dev/docs/mavlink-commands.html

3.3.1 Getting Parameters

  • Retrieving All Parameters
  • Retrieving a Parameter
  • Setting a Parameter

3.3.2 Setting Parameters

3.4 Copter Commands in Guided Mode

  • 必须要在 Guided ;
  • Movement massage
  • 基于 COMMAND_LONG 或 COMMAND_INT 的 MAV_CMDs

3.4.1 Movement massage

直接发送下面的massage就可以move the vehicle

  • SET_POSITION_TARGET_LOCAL_NED
  • SET_POSITION_TARGET_GLOBAL_INT
  • SET_ATTITUDE_TARGET (supported in Guided and Guided_NoGPS modes)

3.4.2 基于 COMMAND_LONG 或 COMMAND_INT 的 MAV_CMDs

These MAV_CMDs can be processed if packaged within a COMMAND_LONG message.
MAV_CMD_CONDITION_YAW
MAV_CMD_DO_CHANGE_SPEED
MAV_CMD_DO_FLIGHTTERMINATION - disarms motors immediately (Copter falls!).
MAV_CMD_DO_PARACHUTE
MAV_CMD_DO_SET_ROI
MAV_CMD_NAV_TAKEOFF
MAV_CMD_NAV_LOITER_UNLIM
MAV_CMD_NAV_RETURN_TO_LAUNCH
MAV_CMD_NAV_LAND
MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN
These MAV_CMDs can be processed if packaged within a COMMAND_INT message
MAV_CMD_DO_REPOSITION

3.5 测试步骤

  • 启动仿真器,进入guided模式并起飞;
    sim_vehicle.py -v ArduCopter --console --map --no-mavproxy
    module load message
    GUIDED
    arm throttle
    message COMMAND_LONG 1 0 22 0 0 0 0 180 -35.3631735 149.1719341 150

  • 移动到指定位置;
    message SET_POSITION_TARGET_LOCAL_NED 0 0 0 1 3576 100 0 -10 0 0 0 0 0 0 0 0

  • 参考:https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html

<think>好的,我现在需要帮助用户了解QGroundControl(QGC)如何发送MAVLink协议。用户之前已经询问过QGC的二次开发,现在可能在使用QGC进行无人机通信或开发时遇到了具体问题。我需要先回顾之前对话,确认用户的知识背景,然后详细解释QGC发送MAVLink的机制。 首先,用户之前的问题是关于QGC二次开发的介绍,涉及界面定制、功能扩展、协议适配等。现在用户的问题更具体,聚焦在QGC发送MAVLink协议的具体实现上。可能用户正在尝试通过QGC与无人机通信,或者在进行二次开发时需要了解MAVLink消息的发送方式。 我需要明确QGC在MAVLink通信中的角色。QGC作为地面站,主要与飞控(如PX4或ArduPilot)通过MAVLink协议通信。用户可能想知道QGC如何构造和发送MAVLink消息,或者如何在二次开发中自定义消息的发送。 接下来,我需要分解问题:QGC发送MAVLink的基本流程是什么?在源码中哪些部分负责处理MAVLink消息?如何通过插件或修改源码来自定义发送消息? 用户可能的实际需求是,他们可能在开发一个需要与飞控交互的新功能,比如发送自定义指令或接收特定数据。例如,用户可能在农业无人机项目中需要发送喷洒农药的指令,或者在巡检无人机中发送路径规划指令。因此,了解QGC如何发送MAVLink消息是关键。 需要解释QGC内部的消息处理机制,比如Vehicle类、MAVLinkProtocol类的作用,以及如何通过现有的接口或插件系统来发送消息。同时,可能需要给出代码示例,说明如何创建MAVLink消息并发送。 此外,用户可能关心如何测试发送的消息,是否需要使用模拟器(如Gazebo)或真实设备进行验证。可能还需要提到调试工具,如Mavlink Inspector,用于监控发送和接收的消息。 还要注意协议版本兼容性,不同版本的MAVLink可能有差异,需要确保QGC和飞控固件的版本匹配。同时,提醒用户遵守开源协议,特别是在修改代码后分发时需遵循LGPL。 最后,总结用户可能的实际应用场景,并提供进一步学习资源,如官方文档、社区支持等,帮助用户深入学习和解决问题。Q</think>GroundControl(QGC)作为无人机地面站,与飞控(如PX4、ArduPilot)之间的通信基于**MAVLink协议**。以下是QGC发送MAVLink消息的核心机制及实现方式: --- ### **1. MAVLink通信基础** - **协议作用**:定义无人机与地面站之间的指令、状态和数据传输格式(如心跳包、传感器数据、航点指令)。 - **消息类型**:分为标准消息(MAVLink官方定义)和自定义消息(用户扩展的特殊指令)。 - **通信链路**:通过串口、UDP、TCP等物理链路传输二进制数据。 --- ### **2. QGC发送MAVLink的源码逻辑** QGC通过以下核心类实现MAVLink消息的发送: #### **(1)`Vehicle`类** - **功能**:代表连接的无人机实例,管理所有与飞控的通信。 - **发送接口**:通过`sendMessage`方法发送MAVLink消息。 ```cpp // 示例:发送指令(以MAV_CMD_NAV_TAKEOFF为例) Vehicle* vehicle = ...; // 获取当前连接的Vehicle对象 MAV_CMD command = MAV_CMD_NAV_TAKEOFF; MavlinkCommandSender::CommandInt_t cmdInt{}; cmdInt.command = command; cmdInt.param1 = 0; // 参数根据协议定义赋值 vehicle->sendMavCommand(cmdInt); ``` #### **(2)`MAVLinkProtocol`类** - **功能**:处理MAVLink消息的编码、解码及链路管理。 - **关键方法**:`sendMessage`将消息序列化后写入通信链路。 ```cpp // 发送原始MAVLink消息 mavlink_message_t msg; mavlink_msg_heartbeat_pack(...); // 打包心跳包 _mavlinkProtocol->sendMessage(msg); ``` #### **(3)插件扩展(Plugin)** - **自定义消息**:通过编写插件注入发送逻辑。 ```cpp // 自定义插件中发送消息 void CustomPlugin::sendCustomMessage() { mavlink_message_t msg; mavlink_msg_custom_pack(...); // 打包自定义消息 QGCApplication::toolbox()->mavlinkProtocol()->sendMessage(msg); } ``` --- ### **3. 典型发送场景** #### **(1)发送飞行指令** - **航点任务**:通过`MissionManager`发送航点列表(`MISSION_ITEM_INT`)。 - **读写飞控参数**:使用`PARAM_REQUEST_READ`和`PARAM_SET`消息。 #### **(3)自定义消息** - **扩展应用**:定义新的`MAV_CMD`或消息类型,需飞控端同步支持。 --- ### **4. 调试与验证** - **MAVLink Inspector**:QGC内置工具(菜单 → 分析 → MAVLink Inspector),可实时查看收发消息。 - **日志分析**:通过`.ulg`或`.tlog`文件记录通信过程。 - **模拟器测试**:使用JMavSim或Gazebo模拟飞控响应。 --- ### **5. 注意事项** - **消息兼容性**:确保QGC与飞控固件的MAVLink版本一致。 - **线程安全**:发送消息需在主线程或通过信号槽机制触发。 - **频率控制**:避免高频发送导致通信拥堵(如传感器数据流需手动启停)。 --- ### **6. 扩展开发示例** 若需发送自定义MAVLink消息(ID>255): 1. **定义消息**:在`custom.xml`中声明消息字段。 2. **生成代码**:使用MAVLink生成器生成C++头文件。 3. **集成到QGC**:替换`libs/mavlink`目录下的协议文件并重新编译。 --- 通过上述机制,QGC能够灵活控制无人机行为。若需深入定制,建议结合官方文档和飞控端代码进行联调: - [MAVLink官方文档](https://mavlink.io/) - [QGC开发者指南](https://dev.qgroundcontrol.com/master/en/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值