PX4模块设计之二十七:LandDetector模块

2023-05-16

PX4模块设计之二十七:LandDetector模块

  • 1. LandDetector模块简介
  • 2. 模块入口函数
    • 2.1 主入口land_detector_main
    • 2.2 自定义子命令custom_command
  • 3. LandDetector模块重要函数
    • 3.1 task_spawn
      • 3.1.1 FixedwingLandDetector
      • 3.1.2 MulticopterLandDetector
      • 3.1.3 VtolLandDetector
      • 3.1.4 RoverLandDetector
      • 3.1.5 AirshipLandDetector
    • 3.2 instantiate
    • 3.3 start
    • 3.4 Run
  • 4. 总结
  • 5. 参考资料

1. LandDetector模块简介

支持多种机型:

  1. 固定翼:fixedwing
  2. 多旋翼:multicopter
  3. 垂直起降:vtol
  4. 车辆:rover
  5. 飞艇:airship

注:模块仅支持start/stop/status命令。

### Description

Module to detect the freefall and landed state of the vehicle, and publishing the `vehicle_land_detected` topic.
Each vehicle type (multirotor, fixedwing, vtol, ...) provides its own algorithm, taking into account various
states, such as commanded thrust, arming state and vehicle motion.

### Implementation

Every type is implemented in its own class with a common base class. The base class maintains a state (landed,
maybe_landed, ground_contact). Each possible state is implemented in the derived classes. A hysteresis and a fixed
priority of each internal state determines the actual land_detector state.

#### Multicopter Land Detector

**ground_contact**: thrust setpoint and velocity in z-direction must be below a defined threshold for time
GROUND_CONTACT_TRIGGER_TIME_US. When ground_contact is detected, the position controller turns off the thrust setpoint
in body x and y.

**maybe_landed**: it requires ground_contact together with a tighter thrust setpoint threshold and no velocity in the
horizontal direction. The trigger time is defined by MAYBE_LAND_TRIGGER_TIME. When maybe_landed is detected, the
position controller sets the thrust setpoint to zero.

**landed**: it requires maybe_landed to be true for time LAND_DETECTOR_TRIGGER_TIME_US.

The module runs periodically on the HP work queue.

land_detector <command> [arguments...]
 Commands:
   start         Start the background task
     fixedwing|multicopter|vtol|rover|airship Select vehicle type

   stop

   status        print status info

注:print_usage函数是具体对应实现。

class LandDetector : public ModuleBase<LandDetector>, ModuleParams, px4::ScheduledWorkItem

注:LandDetector模块采用了ModuleBase和WorkQueue设计。

2. 模块入口函数

2.1 主入口land_detector_main

同样继承了ModuleBase,由ModuleBase的main来完成模块入口。

land_detector_main
 └──> return LandDetector::main(argc, argv)

2.2 自定义子命令custom_command

模块仅支持start/stop/status命令,不支持其他自定义命令。

LandDetector::custom_command
 └──> return print_usage("unknown command");

3. LandDetector模块重要函数

3.1 task_spawn

不同的机型使用不同的继承LandDetector类进行区分:

  1. 固定翼:fixedwing ───> FixedwingLandDetector
  2. 多旋翼:multicopter ───> MulticopterLandDetector
  3. 垂直起降:vtol ───> VtolLandDetector
  4. 车辆:rover ───> RoverLandDetector
  5. 飞艇:airship ───> AirshipLandDetector

模块使用启动函数LandDetector::start来启动模块。

LandDetector::task_spawn
 ├──> <fixedwing>
 │   └──> obj = new FixedwingLandDetector()
 ├──> <multicopter>
 │   └──> obj = new MulticopterLandDetector()
 ├──> <vtol>
 │   └──> obj = new VtolLandDetector()
 ├──> <rover>
 │   └──> obj = new RoverLandDetector()
 ├──> <airship>
 │   └──> obj = new AirshipLandDetector()
 ├──> <else>
 │   ├──> print_usage("unknown mode")
 │   └──> return PX4_ERROR
 ├──> <obj == nullptr>
 │   ├──> PX4_ERR("alloc failed")
 │   └──> return PX4_ERROR
 ├──> strncpy(_currentMode, argv[1], sizeof(_currentMode) - 1);_currentMode[sizeof(_currentMode) - 1] = '\0'; // Remember current active mode
 ├──> _object.store(obj)
 ├──> _task_id = task_id_is_work_queue
 ├──> obj->start()
 └──> return PX4_OK

注:不同机型的LandDetector继承类,分别重载了各自对应的实现方法。从LandDetector业务框架流程的角度还是在LandDetector::Run中实现。

3.1.1 FixedwingLandDetector

class FixedwingLandDetector final : public LandDetector
{
public:
	FixedwingLandDetector();
	~FixedwingLandDetector() override = default;

protected:

	bool _get_landed_state() override;
	void _set_hysteresis_factor(const int factor) override {};

private:
	... //略
}

3.1.2 MulticopterLandDetector

class MulticopterLandDetector : public LandDetector
{
public:
	MulticopterLandDetector();
	~MulticopterLandDetector() override = default;

protected:
	void _update_params() override;
	void _update_topics() override;

	bool _get_landed_state() override;
	bool _get_ground_contact_state() override;
	bool _get_maybe_landed_state() override;
	bool _get_freefall_state() override;
	bool _get_ground_effect_state() override;
	bool _get_in_descend() override { return _in_descend; }
	bool _get_has_low_throttle() override { return _has_low_throttle; }
	bool _get_horizontal_movement() override { return _horizontal_movement; }
	bool _get_vertical_movement() override { return _vertical_movement; }
	bool _get_close_to_ground_or_skipped_check() override { return _close_to_ground_or_skipped_check; }

	void _set_hysteresis_factor(const int factor) override;

private:
	... //略
}

3.1.3 VtolLandDetector

class VtolLandDetector : public MulticopterLandDetector
{
public:
	VtolLandDetector() = default;
	~VtolLandDetector() override = default;

protected:
	void _update_topics() override;
	bool _get_landed_state() override;
	bool _get_maybe_landed_state() override;
	bool _get_freefall_state() override;

private:
	... //略
}

3.1.4 RoverLandDetector

class RoverLandDetector : public LandDetector
{
public:
	RoverLandDetector() = default;
	~RoverLandDetector() override = default;

protected:
	bool _get_ground_contact_state() override;
	bool _get_landed_state() override;
	void _set_hysteresis_factor(const int factor) override {};
}

3.1.5 AirshipLandDetector

class AirshipLandDetector : public LandDetector
{
public:
	AirshipLandDetector() = default;
	~AirshipLandDetector() override = default;

protected:
	bool _get_ground_contact_state() override;
	bool _get_landed_state() override;
	void _set_hysteresis_factor(const int factor) override {};
};

3.2 instantiate

注:鉴于该模块不采用任务(线程),所以ModuleBase::run_trampoline无需执行,所以可以不实现。

3.3 start

LandDetector::start
 ├──> ScheduleDelayed(50_ms)    // 默认50ms进行一次ScheduleNow
 └──> _vehicle_local_position_sub.registerCallback()  //飞行器位置消息发布时,回调一次ScheduleNow

注:位置发生改变直接回调ScheduleNow,从而触发LandDetector::Run。

uORB::SubscriptionCallbackWorkItem _vehicle_local_position_sub{this, ORB_ID(vehicle_local_position)};

3.4 Run

LandDetector业务监测框架代码(飞行器位置发生改变或者50ms定时间隔轮询)实现逻辑流程如下所示:

LandDetector::Run
 ├──> ScheduleDelayed(50_ms)  // push backup schedule, 定时延期(当没有其他消息回调时)
 ├──> perf_begin(_cycle_perf)
 │ 
 ├──> <_parameter_update_sub.updated() || (_land_detected.timestamp == 0)>
 │   ├──> _parameter_update_sub.copy(&param_update)
 │   ├──> updateParams()
 │   ├──> 【可重载】_update_params()
 │   ├──> _total_flight_time = static_cast<uint64_t>(_param_total_flight_time_high.get()) << 32
 │   └──> _total_flight_time |= static_cast<uint32_t>(_param_total_flight_time_low.get())
 │ 
 ├──> <_actuator_armed_sub.update(&actuator_armed)>
 │   └──> _armed = actuator_armed.armed
 ├──> <_vehicle_acceleration_sub.update(&vehicle_acceleration)>
 │   └──> _acceleration = matrix::Vector3f{vehicle_acceleration.xyz}
 ├──> <_vehicle_angular_velocity_sub.update(&vehicle_angular_velocity)>
 │   ├──> _angular_velocity = matrix::Vector3f{vehicle_angular_velocity.xyz}
 │   ├──> static constexpr float GYRO_NORM_MAX = math::radians(3.f); // 3 degrees/second
 │   └──> <_angular_velocity.norm() > GYRO_NORM_MAX>
 │       └──> _time_last_move_detect_us = vehicle_angular_velocity.timestamp_sample
 │
 ├──> _vehicle_local_position_sub.update(&_vehicle_local_position)
 ├──> _vehicle_status_sub.update(&_vehicle_status)
 ├──> 【可重载】_update_topics()
 ├──> <!_dist_bottom_is_observable>
 │   └──> _dist_bottom_is_observable = _vehicle_local_position.dist_bottom_sensor_bitfield & vehicle_local_position_s::DIST_BOTTOM_SENSOR_RANGE; // we consider the distance to the ground observable if the system is using a range sensor
 ├──> <_dist_bottom_is_observable && !_vehicle_local_position.dist_bottom_valid>
 │   └──> _set_hysteresis_factor(3)
 ├──> <else>
 │   └──> _set_hysteresis_factor(1)
 │   【开始LandDetector状态判断】
 ├──> const hrt_abstime now_us = hrt_absolute_time();
 ├──> _freefall_hysteresis.set_state_and_update(【可重载】_get_freefall_state(), now_us);
 ├──> _ground_contact_hysteresis.set_state_and_update(【可重载】_get_ground_contact_state(), now_us);
 ├──> _maybe_landed_hysteresis.set_state_and_update(【可重载】_get_maybe_landed_state(), now_us);
 ├──> _landed_hysteresis.set_state_and_update(【可重载】_get_landed_state(), now_us);
 ├──> _ground_effect_hysteresis.set_state_and_update(【可重载】_get_ground_effect_state(), now_us);
 │   【获取LandDetector状态】
 ├──> const bool freefallDetected = _freefall_hysteresis.get_state();
 ├──> const bool ground_contactDetected = _ground_contact_hysteresis.get_state();
 ├──> const bool maybe_landedDetected = _maybe_landed_hysteresis.get_state();
 ├──> const bool landDetected = _landed_hysteresis.get_state();
 ├──> const bool in_ground_effect = _ground_effect_hysteresis.get_state();
 │ 
 ├──> UpdateVehicleAtRest();
 │ 
 ├──> const bool at_rest = landDetected && _at_rest;
 │ 
 ├──> <(hrt_elapsed_time(&_land_detected.timestamp) >= 1_s) ||
 │       (_land_detected.landed != landDetected) ||
 │       (_land_detected.freefall != freefallDetected) ||
 │       (_land_detected.maybe_landed != maybe_landedDetected) ||
 │       (_land_detected.ground_contact != ground_contactDetected) ||
 │       (_land_detected.in_ground_effect != in_ground_effect) ||
 │       (_land_detected.at_rest != at_rest)>             // publish at 1 Hz, very first time, or when the result has changed
 │   ├──> <!landDetected && _land_detected.landed && _takeoff_time == 0> 
 │   │   └──> _takeoff_time = now_us// only set take off time once, until disarming
 │   ├──> _land_detected.landed = landDetected;
 │   ├──> _land_detected.freefall = freefallDetected;
 │   ├──> _land_detected.maybe_landed = maybe_landedDetected;
 │   ├──> _land_detected.ground_contact = ground_contactDetected;
 │   ├──> _land_detected.in_ground_effect = in_ground_effect;
 │   ├──> _land_detected.in_descend = 【可重载】_get_in_descend();
 │   ├──> _land_detected.has_low_throttle = 【可重载】_get_has_low_throttle();
 │   ├──> _land_detected.horizontal_movement = 【可重载】_get_horizontal_movement();
 │   ├──> _land_detected.vertical_movement = 【可重载】_get_vertical_movement();
 │   ├──> _land_detected.close_to_ground_or_skipped_check = 【可重载】_get_close_to_ground_or_skipped_check();
 │   ├──> _land_detected.at_rest = at_rest;
 │   ├──> _land_detected.timestamp = hrt_absolute_time();
 │   └──> _vehicle_land_detected_pub.publish(_land_detected);
 ├──> <_takeoff_time != 0 && !_armed && _previous_armed_state>
 │   ├──> _total_flight_time += now_us - _takeoff_time;
 │   ├──> _takeoff_time = 0;
 │   ├──> uint32_t flight_time = (_total_flight_time >> 32) & 0xffffffff;
 │   ├──> _param_total_flight_time_high.set(flight_time);
 │   ├──> _param_total_flight_time_high.commit_no_notification();
 │   ├──> flight_time = _total_flight_time & 0xffffffff;
 │   ├──> _param_total_flight_time_low.set(flight_time);
 │   └──> _param_total_flight_time_low.commit_no_notification();
 ├──> _previous_armed_state = _armed
 ├──> perf_end(_cycle_perf)
 └──> <should_exit()>
     ├──> ScheduleClear()
     └──> exit_and_cleanup()

注:这里用到了systemlib::Hysteresis类,有一定的迟滞作用。具体详见hysteresis.h/hysteresis.cpp

4. 总结

该模块最重要的任务就是更新发布vehicle_land_detected消息。

struct vehicle_land_detected_s {
	uint64_t timestamp;
	bool freefall;
	bool ground_contact;
	bool maybe_landed;
	bool landed;
	bool in_ground_effect;
	bool in_descend;
	bool has_low_throttle;
	bool vertical_movement;
	bool horizontal_movement;
	bool close_to_ground_or_skipped_check;
	bool at_rest;
	uint8_t _padding0[5]; // required for logger
}

鉴于不同机型判断逻辑不同,设计了统一的LandDetector业务监测框架,将具体判断逻辑放到LandDetector继承类的重载函数实现,详见3.1章节。

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4 modules_main
【7】PX4模块设计之三十:Hysteresis类

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

PX4模块设计之二十七:LandDetector模块 的相关文章

  • PX4通过I2C方式添加自定义传感器(3)

    添加自定义传感器并实现数据的发送和订阅 1 前期准备 1 1 建立文件夹和相关文件配置 我是在src drivers distance sensor文件夹下操作的 xff0c 当然其他文件夹下都类似 首先建立了两个文件夹angle sour
  • PX4 Offboard Control with MAVROS--Takeoff(一键起飞)

    警告 xff1a 请先在仿真环境下进行测试 xff0c 能达到预期效果后在进行实际飞行测试 xff0c 以免发生意外 本篇文章只是用作学习交流 xff0c 实际飞行时如出现意外情况作者不予以负责 所需材料 1 PIXhawk或者Pixrac
  • px4自定义mavlink收不到消息的问题

    px4版本1 12稳定版 最近在做px4二次开发相关工作 按照网上的一些教程自定义了一个mavlink消息用来控制无人机 按照教程里面的单独开了一个xml来定义消息 最后生成的消息在px4端通过流传输的方式自己写的客户端可以收到消息 但是客
  • px4: v2的主板刷写v2的固件

    v2的主板刷写v2的固件 fengxuewei 64 fengxuewei Legion Y7000 2019 PG0 src Firmware changwei rc span class token function make span
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • 基于F4/F7/H7飞控硬件和px4飞控固件的廉价自主无人机系统(1)-飞控

    前言 穿越机F4 F7 H7飞控是一系列采用stm32系列F4xx和F7xx处理器的飞控的统称 xff0c 是目前穿越机爱好者非常喜欢使用的飞控硬件 xff0c 其价格也非常便宜180 xff5e 410 而px4则是一款常见的开源飞控固件
  • 初学PX4之环境搭建

    文章转自 xff1a http www jianshu com p 36dac548106b 前言 前段时间linux崩溃了 xff0c 桌面进去后只有背景 xff0c 折腾好久没搞定 xff0c 为了节省时间索性重装了系统 xff0c 同
  • PX4 -- EKF2

    文章目录 EKF2参数高度估计Range Finder滤波 单变量更新单变量更新对多变量的影响 EKF2 参数 EKF2 中有一类 GATE 参数 当测量值在 VAR GATE 范围内才会更新值 高度估计 四种高度控制方法 xff1a 气压
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之四十五:param模块

    PX4模块设计之四十五 xff1a param模块 1 param模块简介2 模块入口函数param main3 重要函数列表4 总结5 参考资料 1 param模块简介 Description Command to access and
  • PX4模块设计之四十六:dataman模块

    PX4模块设计之四十六 xff1a dataman模块 1 dataman模块简介2 模块入口函数dataman main3 dataman模块重要函数3 1 start3 2 stop3 3 status3 4 task main 4 A
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • px4仿真无法起飞问题(Failsafe enabled: no datalink)

    报错信息 问题描述 xff1a 使用JMAVSim和gazebo仿真px4起飞时报错如下 xff1a WARN commander Failsafe enabled no datalink 说不安全 解决方法 打开QGC 就可以起飞了
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • PX4中自定义MAVLink消息(记录)

    简单记录一下这个过程 一 自定义uORB消息 这一步比较简单 xff0c 首先在msg 中新建ca trajectory msg文件 uint64 timestamp time since system start span class t
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • PX4通过参数脚本给飞控导入参数

    PX4通过参数脚本给飞控导入参数 先找一架正常能飞的无人机连接地面站 在参数页面右上角点击工具 gt 保存到文件 保存的时候文件名注明参数的相关信息 然后将需要加载参数的无人机连接至地面站 xff0c 注意需要加载参数的无人机必须和保存的参

随机推荐

  • 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
  • PX4模块设计之十五:PX4 Log设计

    PX4模块设计之十五 xff1a PX4 Log设计 1 PX4 Log介绍2 ULog文件格式2 1 ULog文件结构2 2 ULog文件头结构2 3 ULog消息结构定义2 3 1 B Flag Bits 消息2 3 2 F Forma
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • MFC鼠标响应、鼠标画线

    鼠标响应关键就是对两个函数进行操作 xff1a OnLButtonDown和OnLButtonUp xff1b 1 使用MFC AppWizard exe xff09 建立一个单文档MFC工程 2 首先要在CxxxView类的定义里加上后续
  • 查理·芒格:让自己配得上想要的东西

    巴菲特说他一生遇人无数 xff0c 从来没有遇到过像查理这样的人 94岁的查理 芒格毕业于哈佛大学法学院 xff0c 是沃伦 巴菲特的黄金搭档 xff0c 伯克夏 哈撒韦公司的副主席 xff0c 芒格的头脑是原创性的 xff0c 从来不受任
  • PX4模块设计之十九:Replay模块

    PX4模块设计之十九 xff1a Replay模块 1 Replay模块简介2 模块入口函数2 1 主入口replay main2 2 自定义子命令Replay custom command 3 重要实现函数3 1 Replay task
  • TX12 + ExpressLRS 915MHz RC控制链路配置及问题汇总

    TX12 43 ExpressLRS 915MHz RC控制链路配置及问题汇总 1 硬件配置1 1 TX12遥控器1 2 发射 接受机 2 问题汇总2 1 ELRS接收机无法点亮 第一次 2 2 ELRS接收机无法点亮 第二次 2 3 触发
  • PX4模块设计之二十:PX4应用平台初始化

    PX4模块设计之二十 xff1a PX4应用平台初始化 1 PX4应用平台介绍2 PX4应用平台初始化实现3 讨论和思考4 参考资料 在PX4启动过程章节的基础上 xff0c 可以深入分析下PX4应用平台 xff08 框架 xff09 的实
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之二十二:FlightModeManager模块

    PX4模块设计之二十二 xff1a FlightModeManager模块 1 FlightModeManager简介2 FlightModeManager启动3 FlightModeManager模块重要实现3 1 custom comm
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之二十五:DShot模块

    PX4模块设计之二十五 xff1a DShot模块 1 DShot模块简介2 DShot类继承关系3 模块入口函数3 1 主入口dshot main3 2 自定义子命令custom command 4 DShot模块重要函数4 1 task
  • PX4模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec