mavlink中的base_mode和custom_mode含义说明

custom_mode 用于表示自定义的飞行模式,比如px4和apm都有各自的一些定义的飞行模式,不完全相同,具体可以看http://wiki.ros.org/mavros/CustomModes。现在也可以明白为什么px4把这些模式叫custom_mode了。所以真正看飞控处于什么飞行模式还是得看custom_mode的值。
注意不是网上看到的一些说base_mode是当前模式,custom_mode是目标模式,不是的!!!

base_mode

base_mode是一个uint8_t类型,里面又8个Bit位,每个bit位对应的含义如下,在MAV_MODE_FLAG里面有定义
 

输入图片说明

输入图片说明

所以在mavros的代码里看到base_mode这么被赋值,或者从base_mode里面获取一些比如是否解锁的信息,也就很好理解了。

  base_mode |= (uas->get_armed()) ? enum_value(MAV_MODE_FLAG::SAFETY_ARMED) : 0;
  base_mode |= (uas->get_hil_state()) ? enum_value(MAV_MODE_FLAG::HIL_ENABLED) : 0;
  base_mode |= enum_value(MAV_MODE_FLAG::CUSTOM_MODE_ENABLED);

输入图片说明

custom_mode

输入图片说明

//! PX4 custom mode -> string
static const cmode_map px4_cmode_map{{
  {px4::define_mode(px4::custom_mode::MAIN_MODE_MANUAL), "MANUAL"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_ACRO), "ACRO"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_ALTCTL), "ALTCTL"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_POSCTL), "POSCTL"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_OFFBOARD), "OFFBOARD"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_STABILIZED), "STABILIZED"},
  {px4::define_mode(px4::custom_mode::MAIN_MODE_RATTITUDE), "RATTITUDE"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_MISSION), "AUTO.MISSION"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_LOITER), "AUTO.LOITER"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_RTL), "AUTO.RTL"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_LAND), "AUTO.LAND"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_RTGS), "AUTO.RTGS"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_READY), "AUTO.READY"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_TAKEOFF), "AUTO.TAKEOFF"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_FOLLOW_TARGET), "AUTO.FOLLOW_TARGET"},
  {px4::define_mode_auto(px4::custom_mode::SUB_MODE_AUTO_PRECLAND), "AUTO.PRECLAND"},
}};

custom_mode是uint32_t类型,逻辑低16位保留,逻辑高16位分别由main_mode和sub_mode组成
mavros/include/mavros/px4_custom_mode.h · 马熙/mavros - Gitee.com

/**
 * @brief PX4 custom mode
 *
 * This union decodes uint32_t HEARTBEAT.custom_mode
 * and uint32_t SET_MODE.custom_mode.
 */
union custom_mode {
	enum MAIN_MODE : uint8_t {
		MAIN_MODE_MANUAL = 1,
		MAIN_MODE_ALTCTL,
		MAIN_MODE_POSCTL,
		MAIN_MODE_AUTO,
		MAIN_MODE_ACRO,
		MAIN_MODE_OFFBOARD,
		MAIN_MODE_STABILIZED,
		MAIN_MODE_RATTITUDE
	};

	enum SUB_MODE_AUTO : uint8_t {
		SUB_MODE_AUTO_READY = 1,
		SUB_MODE_AUTO_TAKEOFF,
		SUB_MODE_AUTO_LOITER,
		SUB_MODE_AUTO_MISSION,
		SUB_MODE_AUTO_RTL,
		SUB_MODE_AUTO_LAND,
		SUB_MODE_AUTO_RTGS,
		SUB_MODE_AUTO_FOLLOW_TARGET,
		SUB_MODE_AUTO_PRECLAND
	};

	struct {
		uint16_t reserved;
		uint8_t main_mode;
		uint8_t sub_mode;
	};

https://blog.csdn.net/nieji3057/article/details/127617132

uint32 custom_mode = (main_mode<<16)|(sub_mode<<24);

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MAVLink是一种轻量级、信息透明的通信协议,用于在无人机和地面站之间传输信息。它是一个开放源代码的协议,可以在各种硬件平台和操作系统上运行。 MAVLink支持大量的消息类型,用于传输飞行控制器和地面站之间的状态信息、传感器数据、遥控器命令等等。 MAVLink的使用场景非常广泛,主要应用于以下几个方面: 1. 无人机飞行控制:MAVLink协议被广泛应用于无人机飞行控制器,用于传输飞行状态、传感器数据、航点信息、遥控器命令等等。 2. 地面站控制:MAVLink协议也可以被应用于地面站软件,用于接收和发送与无人机相关的信息。 3. 自主驾驶汽车:MAVLink协议也可以应用在自主驾驶汽车,用于传输车辆状态、传感器数据、控制命令等等。 MAVLink的获取和使用需要一定的开发经验和相关工具的支持,下面举例说明: 1. 获取MAVLinkMAVLink的源代码可以从GitHub上获取,也可以从一些开发套件获取,如PX4开发套件。 2. MAVLink的使用:MAVLink可以使用多种开发语言进行编程,如C++、Python等等。下面以C++为例,介绍MAVLink的使用。 (1)创建MAVLink消息:可以使用MAVLink的C++库来创建MAVLink消息,如下所示: ``` mavlink_message_t message; mavlink_msg_heartbeat_pack(system_id, component_id, &message, type, autopilot, base_mode, custom_mode, system_status); ``` 这里创建了一个心跳消息,并将该消息打包成MAVLink数据包。 (2)发送MAVLink消息:可以使用串口或UDP等方式将MAVLink消息发送到无人机或地面站,如下所示: ``` sendto(fd, buffer, len, 0, (struct sockaddr*)&dstAddr, sizeof(dstAddr)); ``` 这里使用UDP方式将MAVLink消息发送到目标地址。 (3)解析MAVLink消息:可以使用MAVLink的C++库来解析接收到的MAVLink消息,如下所示: ``` mavlink_message_t message; mavlink_status_t status; while (read(fd, buf, 1) > 0) { if (mavlink_parse_char(MAVLINK_COMM_0, buf[0], &message, &status)) { switch (message.msgid) { case MAVLINK_MSG_ID_HEARTBEAT: mavlink_heartbeat_t heartbeat; mavlink_msg_heartbeat_decode(&message, &heartbeat); // do something with heartbeat break; // handle other message types here } } } ``` 这里使用串口方式接收MAVLink消息,并使用MAVLink的C++库解析该消息,然后根据消息类型做出相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值