mavlink中的base_mode和custom_mode

base_mode和custom_mode是mavlink心跳包中很重要的组成部分,用来反应无人机当前的模式状态。QGC地面站如何知道无人机当前是否解锁,处于什么飞行模式,就是依靠心跳包里的base_mode和custom_mode,/mavros/state话题里的一些状态项的值,也是来自于心跳包里的base_mode和custom_mode。同时我们用QGC进行无人机的模式切换,QGC发送的是SET_MODE这个mavlink消息给飞控,SET_MODE(#11) mavlink消息里面其实主要就是base_mode和custom_mode这两项。
HEARTBEAT(#0) mavlink消息
http://mavlink.io/zh/messages/common.html
 

输入图片说明


SET_MODE(#11) mavlink消息
http://mavlink.io/zh/messages/common.html
 

输入图片说明


/mavros/state话题

输入图片说明

通过mavros设置模式其实也是发的base_mode和custom_mode,mavros再将其转为SET_MODE mavlink消息发给飞控
http://docs.ros.org/en/api/mavros_msgs/html/srv/SetMode.html

输入图片说明

base_mode是mavlink里面定义的一些基础的无人机模式信息,是通用的,比如无人机有没有解锁这种基础状态,不管是PX4还是APM或者其他飞控,但凡用mavlink协议,base_mode都是这几个(下面有详细讲),但是custom_mode,mavlink是没有具体给定的,是可以自定义的,不同的飞控定义的custom_mode就可能不同,custom_mode就用于表示自定义的飞行模式,比如px4和apm都有各自的一些定义的飞行模式,不完全相同,具体可以看http://wiki.ros.org/mavros/CustomModes 实际看飞控处于什么飞行模式是看custom_mode的值,但是看无人机有没有解锁是看base_mode。
注意网上看到一些文章说base_mode是当前模式,custom_mode是目标模式,不是这样的。
下图是APM和PX4中各自定义的一些custom_mode
http://wiki.ros.org/mavros/CustomModes
 

../../libraries/GCS_MAVLink/GCS_Common.cpp: In member function ‘void GCS_MAVLINK::handle_set_mode(const mavlink_message_t&)’: ../../libraries/GCS_MAVLink/GCS_Common.cpp:2816:5: error: ‘mavlink_set_mode_t’ was not declared in this scope; did you mean ‘mavlink_sens_power_t’? 2816 | mavlink_set_mode_t packet; | ^~~~~~~~~~~~~~~~~~ | mavlink_sens_power_t compilation terminated due to -Wfatal-errors. 我在mavlink/message_definitions/v1.0/common.xml文件中删除了 </message> <message id="11" name="SET_MODE"> <deprecated since="2015-12" replaced_by="MAV_CMD_DO_SET_MODE">Use COMMAND_LONG with MAV_CMD_DO_SET_MODE instead</deprecated> <description>Set the system mode, as defined by enum MAV_MODE. There is no target component id as the mode is by definition for the overall aircraft, not only for one component.</description> <field type="uint8_t" name="target_system">The system setting the mode</field> <field type="uint8_t" name="base_mode" enum="MAV_MODE">The new base mode.</field> <field type="uint32_t" name="custom_mode">The new autopilot-specific mode. This field can be ignored by an autopilot.</field>代码段,就出现了报错,请为我分析一下原因,报错代码段在libraries/GCS_MAVLink/GCS_Common中/* handle a SET_MODE MAVLink message */ void GCS_MAVLINK::handle_set_mode(const mavlink_message_t &msg) { mavlink_set_mode_t packet; mavlink_msg_set_mode_decode(&msg, &packet); const MAV_MODE _base_mode = (MAV_MODE)packet.base_mode; const uint32_t _custom_mode = packet.custom_mode; AP_Vehicle::input_wzk(_custom_mode); _set_mode_common(_base_mode, _custom_mode); }
03-08
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗筱涵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值