PX4模块设计之十四:Event设计

2023-05-16

PX4模块设计之十四:Event设计

  • 1. Event主要接口
    • 1.1 字符串消息接口
    • 1.2 参数消息接口
    • 1.3 内部uORB实现
  • 2. PX4 Events框架
    • 2.1 配置文件
    • 2.2 内嵌代码
  • 3. 使用方法
    • 3.1 Step 1:包含消息接口头文件
    • 3.2 Step 2:使用合适的API接口
    • 3.3 注意事项
  • 4. 参考资料

事件接口将事件uORB消息发布到系统内,其主要作用是通过MAVLink传输层,将消息发送到GCS和其他组件。该接口可用于发布状态变化或任何其他类型事件的事件,包括待命准备、校准完成和达到目标起飞高度等。

PX4系统里面将这部分内容抽象出一个模块libevents,并在repo上通过submodule的方式引入,体现了设计的模块化。

[submodule "src/lib/events/libevents"]
        path = src/lib/events/libevents
        url = https://github.com/mavlink/libevents.git

1. Event主要接口

  • event_name: the event name (events::ID(event_name)) 在PX4的整个源代码中必须是唯一的。一般来说,在其前面加上模块名,或较大模块的源文件。
  • Log Level
Emergency,
Alert,
Critical,
Error,
Warning,
Notice,
Info,
Debug,
Disabled,
  • Event Message 单行短字符串。它可能包含参数的模板占位符。
  • Arguments and Enums 事件可以有一组固定的参数,这些参数可以使用模板占位符插入到消息或描述中。

1.1 字符串消息接口

platforms\common\include\px4_platform_common\events.h

inline void send(uint32_t id, const LogLevels &log_levels, const char *message)
{
	EventType e{};
	e.log_levels = ((uint8_t)log_levels.internal << 4) | (uint8_t)log_levels.external;
	e.id = id;
	CONSOLE_PRINT_EVENT(e.log_level_external, e.id, message);
	send(e);
}

1.2 参数消息接口

platforms\common\include\px4_platform_common\events.h

inline void send(uint32_t id, const LogLevels &log_levels, const char *message, Args... args)
{
	EventType e{};
	e.log_levels = ((uint8_t)log_levels.internal << 4) | (uint8_t)log_levels.external;
	e.id = id;
	static_assert(util::sizeofArguments(args...) <= sizeof(e.arguments), "Too many arguments");
	util::fillEventArguments((uint8_t *)e.arguments, args...);
	CONSOLE_PRINT_EVENT(e.log_level_external, e.id, message);
	send(e);
}

1.3 内部uORB实现

platforms\common\events.cpp,通过ORB_ID(event)消息发不到系统内部,在GCS代码中订阅该消息,并针EventType进行解析。

void send(EventType &event)
{
	event.timestamp = hrt_absolute_time();

	// We need some synchronization here because:
	// - modifying orb_event_pub
	// - the update of event_sequence needs to be atomic
	// - we need to ensure ordering of the sequence numbers: the sequence we set here
	//   has to be the one published next.
	pthread_mutex_lock(&publish_event_mutex);
	event.event_sequence = ++event_sequence; // Set the sequence here so we're able to detect uORB queue overflows

	if (orb_event_pub != nullptr) {
		orb_publish(ORB_ID(event), orb_event_pub, &event);

	} else {
		orb_event_pub = orb_advertise_queue(ORB_ID(event), &event, event_s::ORB_QUEUE_LENGTH);
	}

	pthread_mutex_unlock(&publish_event_mutex);
}
struct EventType {
    uint32_t id;
    uint8_t log_levels;
    uint8_t arguments[40];
};

注:关于uORB和MAVLink详见参考资料,这里不再展开。

2. PX4 Events框架

事件定义由命名空间分隔。每个名称空间都有一个名称和一个8位组件ID(通常与MAVLink组件ID匹配)。在命名空间中,每个事件都有一个唯一的名称和子ID(24位)。事件ID是具有子ID的组合组件ID。因此,可以通过ID或::。

rtl_land_at_home在整合libevents到PX4飞控系统时,通过src/lib/events/CMakeLists.txt将PX4和常用的消息定义从代码和配置转换成jason,以便GCS作为配置输入使用。

总体上,分为两部分:

  1. 通过配置文件汇总,提供GCS或其他应用程序。
  2. 通过代码内嵌(未见明显应用,不过如果该消息是飞控内部使用,可以使用该方式)

2.1 配置文件

build/holybro_kakutef7_default/events/all_events.json
 ├──> build/holybro_kakutef7_default/events/px4.json
 │   └──> ${all_px4_src_files}  //PX4工程源代码
 └──> build/holybro_kakutef7_default/events/common_with_enums.json
     ├──> src/lib/events/enums.json 
     └──> src/lib/events/libevents/events/libevents/events/common.json

2.2 内嵌代码

build/holybro_kakutef7_default/events/events_generated.h
 └──> build/holybro_kakutef7_default/events/common_with_enums.json
     ├──> src/lib/events/enums.json
     └──> src/lib/events/libevents/events/common.json

3. 使用方法

注:关于代码中消息将会在CMakeList.txt编译之前转换成jason或者.h文件。(编译工具提供的自动化功能)

3.1 Step 1:包含消息接口头文件

#include <px4_platform_common/events.h>

3.2 Step 2:使用合适的API接口

字符串消息接口

events::send(events::ID("navigator_mis_multi_land"), {events::Log::Error, events::LogInternal::Info},
					     "Mission rejected: more than one land start commands");

或者 参数消息接口

events::send<int32_t, int32_t>(events::ID("navigator_mis_land_approach"), {events::Log::Error, events::LogInternal::Info},
					    "Mission rejected: adjust landing approach",
					    (int)ceilf(slope_alt_req - missionitem_previous.altitude),
					    (int)ceilf(wp_distance_req - wp_distance));

3.3 注意事项

  1. 有效参数类型: uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t and float.
  2. 枚举类型定义
  • PX4和自定义枚举定义:src/lib/events/enums.json
  • MAVLink公共事件和枚举定义:mavlink/libevents/events/common.json
  1. 参数插入事件消息字符串:{n}
  2. 事件描述并非必须,如下例子所述
/* EVENT
 * @description
 * Land immediately and check the system.
 */
events::send<uint8_t, events::px4::enums::sensor_failover_reason_t>(
	events::ID("sensor_failover_baro"), events::Log::Emergency, "Baro sensor #{1} failure: {2}", failover_index,
	failover_reason);
  1. 参数表达方式:{ARG_IDX[:.NUM_DECIMAL_DIGITS][UNIT]}
    m: horizontal distance in meters
    m_v: vertical distance in meters
    m^2: area in m^2
    m/s: speed in m/s
    C: temperature in degrees celsius
    NUM_DECIMAL_DIGITS only makes sense for real number arguments

4. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4 Events Interface
【3】PX4模块设计之二:uORB消息代理
【4】PX4模块设计之三:自定义uORB消息
【5】PX4模块设计之四:MAVLink简介
【6】PX4模块设计之五:自定义MAVLink消息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4模块设计之十四:Event设计 的相关文章

随机推荐

  • BetaFlight开源代码框架简介

    BetaFlight开源代码框架简介 1 框架设计分析考量2 框架分析前提条件3 主程序框架4 调度框架5 模块方法6 典型任务 amp 模块6 1 典型任务6 2 典型模块6 3 传感模块 7 回顾 amp 分析8 分析模板 1 框架设计
  • 四轴飞控DIY集成FPV功能

    四轴飞控DIY集成FPV功能 1 功能需求2 概念介绍2 1 制式2 2 显示分辨率2 3 摄像头线数高于700线低于700线 3 需求分析4 组件选择5 接线组装5 1 摄像头接线5 2 图传接线 6 组装位置7 FPV功能调试7 1 摄
  • MFC拷贝文件及进度条显示

    参考 xff1a 封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度 http blog csdn net career2011 article details 6844513 实例讲解C
  • BetaFlight模块设计之三十二:MSP协议模块分析

    BetaFlight模块设计之三十二 xff1a MSP协议模块分析 1 MSP协议模块1 1 MSP描述1 2 MSP版本优缺点1 3 MSP代码资源 2 MSP报文解析2 1 MSP收包状态机2 2 MSP报文格式 3 MSP报文处理3
  • BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三 xff1a Pid模块分析 Pid模块1 Pid audio子模块2 Pid init子模块3 Pid算法子模块3 1 TPA模式3 2 飞行模式3 3 Launch模式3 4 AcroTrainer模
  • BetaFlight模块设计之三十四:OSD模块分析

    BetaFlight模块设计之三十四 xff1a OSD模块分析 1 OSD模块1 1 osd状态机子模块1 2 osd warnings检查子模块1 3 osd elements子模块 2 OSD设备 驱动及适配框架2 1 OSD设备2
  • ssh无法远程登陆问题汇总

    ssh无法远程登陆问题汇总 1 ssh服务是否已经启动1 1 sshd服务是否已经安装1 2 sshd是否已经启动 2 检查sshd配置3 检查路由情况4 检查hosts许可文件5 检查防火墙问题5 1 检查防火墙是否启动5 2 修改防火墙
  • traceroute命令结果分析

    traceroute命令结果分析 1 基本原理2 IP地址种类2 1 A类IP地址2 2 B类IP地址2 3 C类IP地址2 4 D类地址用于多点广播 Multicast 2 5 E类IP地址 3 测试3 1 第一次3 2 第二次 4 总结
  • bash脚本返回值应用

    bash脚本返回值应用 应该说bash脚本对于linux系统来说具有举足轻重的意义 这里不做展开 xff0c 也不做bash脚本介绍 更多的是做一个例子 xff0c 应用了bash脚本的以下特性 xff1a 输入参数函数定义调用可执行命令脚
  • 如何理解printf变参函数的实现

    如何理解printf变参函数的实现 1 printf函数变参的问题2 printf函数定义和解释2 1 printf函数定义2 2 Linux Man page解释 https man7 org linux man pages man3 s
  • BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析

    BetaFlight模块设计之三十五 xff1a RSSI信号强度 amp 链路稳定性分析 1 RSSI信号强度1 1 RSSI Value1 2 RSSI dBm Value 2 链路稳定性3 RSSI amp LinkQuality来源
  • Linux的so组件设计框架及逻辑

    Linux的so组件设计框架及逻辑 1 组件关注点1 1 组件定义关注点1 2 组件业务关注点 2 so特性3 so组件设计逻辑4 so组件设计框架4 1 so组件范例4 2 so隐式调用范例4 3 so显式调用范例 5 so组件设计建议
  • PX4模块设计之八:Ubuntu 20.04搭建FlightGear模拟器

    PX4模块设计之八 xff1a Ubuntu 20 04搭建FlightGear模拟器 1 使用FlightGear的源由2 FlightGear模拟器简介3 Ubuntu 20 04搭建FlightGear步骤3 1 设置flightge
  • 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度

    封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度等 前段时间无意间想到如何控制文件复制过程的复制速度 xff0c 并且能实时获得复制进度 对于一个几兆甚至更小的文件 xff0c 调用AP
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十四:Event设计

    PX4模块设计之十四 xff1a Event设计 1 Event主要接口1 1 字符串消息接口1 2 参数消息接口1 3 内部uORB实现 2 PX4 Events框架2 1 配置文件2 2 内嵌代码 3 使用方法3 1 Step 1 xf