PX4模块设计之三十六:MulticopterPositionControl模块

2023-05-16

PX4模块设计之三十六:MulticopterPositionControl模块

  • 1. MulticopterPositionControl模块简介
  • 2. 模块入口函数
    • 2.1 主入口mc_pos_control_main
    • 2.2 自定义子命令custom_command
  • 3. MulticopterPositionControl模块重要函数
    • 3.1 task_spawn
    • 3.2 instantiate
    • 3.3 init
    • 3.4 Run
  • 4. 总结
  • 5. 参考资料

1. MulticopterPositionControl模块简介

### Description
The controller has two loops: a P loop for position error and a PID loop for velocity error.
Output of the velocity controller is thrust vector that is split to thrust direction
(i.e. rotation matrix for multicopter orientation) and thrust scalar (i.e. multicopter thrust itself).

The controller doesn't use Euler angles for its work, they are generated only for more human-friendly control and
logging.

mc_pos_control <command> [arguments...]
 Commands:
   start
     [vtol]      VTOL mode

   stop

   status        print status info

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

class MulticopterPositionControl : public ModuleBase<MulticopterPositionControl>, public control::SuperBlock,
	public ModuleParams, public px4::ScheduledWorkItem

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

2. 模块入口函数

2.1 主入口mc_pos_control_main

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

mc_pos_control_main
 └──> return MulticopterPositionControl::main(argc, argv)

2.2 自定义子命令custom_command

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

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

3. MulticopterPositionControl模块重要函数

3.1 task_spawn

这里主要初始化了MulticopterPositionControl对象,后续通过WorkQueue来完成进行轮询。

MulticopterPositionControl::task_spawn
 ├──> vtol = false
 ├──> <argc > 1><strcmp(argv[1], "vtol") == 0>
 │   └──> vtol = true
 ├──> MulticopterPositionControl *instance = new MulticopterPositionControl(vtol)
 ├──> <instance>
 │   ├──> _object.store(instance)
 │   ├──> _task_id = task_id_is_work_queue
 │   └──> <instance->init()>
 │       └──> return PX4_OK
 ├──> <else>
 │   └──> PX4_ERR("alloc failed")
 ├──> delete instance
 ├──> _object.store(nullptr)
 └──> _task_id = -1

3.2 instantiate

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

3.3 init

在task_spawn中使用,对_local_pos_sub成员变量进行事件回调注册(当有vehicle_local_position消息时,会调用SubscriptionCallbackWorkItem::ScheduleNow,再触发RCUpdate::Run过程),同时在MulticopterPositionControl::init过程,触发第一次ScheduleNow。

MulticopterPositionControl::init
 ├──> <!_local_pos_sub.registerCallback()>
 │   ├──> PX4_ERR("callback registration failed")
 │   └──> return false
 ├──> _time_stamp_last_loop = hrt_absolute_time()
 ├──> ScheduleNow()
 └──> return true

3.4 Run

在Run过程中调用ScheduleDelayed(100_ms)规划下一次定时轮询。

MulticopterPositionControl::Run
 ├──> [优雅退出处理]
 ├──> ScheduleDelayed(100_ms)  // reschedule backup
 ├──> parameters_update(false)
 ├──> <!_local_pos_sub.update(&vehicle_local_position)>
 │   └──> return
 ├──> const float dt = math::constrain(((vehicle_local_position.timestamp_sample - _time_stamp_last_loop) * 1e-6f), 0.002f, 0.04f)
 ├──> _time_stamp_last_loop = vehicle_local_position.timestamp_sample
 ├──> setDt(dt) // set _dt in controllib Block for BlockDerivative
 ├──> <_vehicle_control_mode_sub.updated()>
 │   ├──> const bool previous_position_control_enabled = _vehicle_control_mode.flag_multicopter_position_control_enabled
 │   └──> <_vehicle_control_mode_sub.update(&_vehicle_control_mode)>
 │       ├──> <!previous_position_control_enabled && _vehicle_control_mode.flag_multicopter_position_control_enabled>
 │       │   └──> _time_position_control_enabled = _vehicle_control_mode.timestamp
 │       └──> <else if (previous_position_control_enabled && !_vehicle_control_mode.flag_multicopter_position_control_enabled>
 │           └──> reset_setpoint_to_nan(_setpoint)  // clear existing setpoint when controller is no longer active
 ├──> _vehicle_land_detected_sub.update(&_vehicle_land_detected)
 ├──> <_param_mpc_use_hte.get()><_hover_thrust_estimate_sub.update(&hte)><hte.valid>
 │   └──> _control.updateHoverThrust(hte.hover_thrust)
 ├──> _trajectory_setpoint_sub.update(&_setpoint)
 ├──> <(_setpoint.timestamp != 0) && (_setpoint.timestamp < vehicle_local_position.timestamp)> // adjust existing (or older) setpoint with any EKF reset deltas
 │   ├──> <vehicle_local_position.vxy_reset_counter != _vxy_reset_counter>
 │   │   ├──> _setpoint.vx += vehicle_local_position.delta_vxy[0]
 │   │   └──> _setpoint.vy += vehicle_local_position.delta_vxy[1]
 │   ├──> <vehicle_local_position.vz_reset_counter != _vz_reset_counter>
 │   │   └──> _setpoint.vz += vehicle_local_position.delta_vz
 │   ├──> <vehicle_local_position.xy_reset_counter != _xy_reset_counter>
 │   │   ├──> _setpoint.x += vehicle_local_position.delta_xy[0]
 │   │   └──> _setpoint.y += vehicle_local_position.delta_xy[1]
 │   ├──> <vehicle_local_position.z_reset_counter != _z_reset_counter>
 │   │   └──> _setpoint.z += vehicle_local_position.delta_z
 │   └──> <vehicle_local_position.heading_reset_counter != _heading_reset_counter>
 │       └──> _setpoint.yaw = wrap_pi(_setpoint.yaw + vehicle_local_position.delta_heading)
 ├──> <vehicle_local_position.vxy_reset_counter != _vxy_reset_counter>
 │   ├──> _vel_x_deriv.reset()
 │   └──> _vel_y_deriv.reset()
 ├──> vehicle_local_position.vz_reset_counter != _vz_reset_counter) {
 │   └──> _vel_z_deriv.reset()
 ├──> [save latest reset counters]
 │   ├──> _vxy_reset_counter = vehicle_local_position.vxy_reset_counter
 │   ├──> _vz_reset_counter = vehicle_local_position.vz_reset_counter
 │   ├──> _xy_reset_counter = vehicle_local_position.xy_reset_counter
 │   ├──> _z_reset_counter = vehicle_local_position.z_reset_counter
 │   └──> _heading_reset_counter = vehicle_local_position.heading_reset_counter
 ├──> PositionControlStates states{set_vehicle_states(vehicle_local_position)}
 ├──> <_vehicle_control_mode.flag_multicopter_position_control_enabled><(_setpoint.timestamp < _time_position_control_enabled) && (vehicle_local_position.timestamp_sample > _time_position_control_enabled)>
 │   └──> _setpoint = generateFailsafeSetpoint(vehicle_local_position.timestamp_sample, states) // set failsafe setpoint if there hasn't been a new, trajectory setpoint since position control started
 ├──> <_vehicle_control_mode.flag_multicopter_position_control_enabled && (_setpoint.timestamp >= _time_position_control_enabled)>
 │   └──> _vehicle_constraints_sub.update(&_vehicle_constraints) // update vehicle constraints and handle smooth takeoff
 ├──> <!PX4_ISFINITE(_vehicle_constraints.speed_up) || (_vehicle_constraints.speed_up > _param_mpc_z_vel_max_up.get())> // fix to prevent the takeoff ramp to ramp to a too high value or get stuck because of NAN
 │   └──> _vehicle_constraints.speed_up = _param_mpc_z_vel_max_up.get() // TODO: this should get obsolete once the takeoff limiting moves into the flight tasks
 ├──> <_vehicle_control_mode.flag_control_offboard_enabled>
 │   ├──> const bool want_takeoff = _vehicle_control_mode.flag_armed && (vehicle_local_position.timestamp_sample < _setpoint.timestamp + 1_s)
 │   ├──> <want_takeoff && PX4_ISFINITE(_setpoint.z) && (_setpoint.z < states.position(2))>
 │   │   └──> _vehicle_constraints.want_takeoff = true
 │   ├──> <want_takeoff && PX4_ISFINITE(_setpoint.vz) && (_setpoint.vz < 0.f)>
 │   │   └──> _vehicle_constraints.want_takeoff = true
 │   ├──> <want_takeoff && PX4_ISFINITE(_setpoint.acceleration[2]) && (_setpoint.acceleration[2] < 0.f)>
 │   │   └──> _vehicle_constraints.want_takeoff = true
 │   └──> <else>
 │       └──> _vehicle_constraints.want_takeoff = false
 ├──> [ override with defaults ]
 │   ├──> _vehicle_constraints.speed_up = _param_mpc_z_vel_max_up.get()
 │   └──> _vehicle_constraints.speed_down = _param_mpc_z_vel_max_dn.get()
 ├──> _takeoff.updateTakeoffState(_vehicle_control_mode.flag_armed, _vehicle_land_detected.landed, _vehicle_constraints.want_takeoff, _vehicle_constraints.speed_up, false, vehicle_local_position.timestamp_sample) // handle smooth takeoff
 ├──> const bool not_taken_off             = (_takeoff.getTakeoffState() < TakeoffState::rampup)
 ├──> const bool flying                    = (_takeoff.getTakeoffState() >= TakeoffState::flight)
 ├──> const bool flying_but_ground_contact = (flying && _vehicle_land_detected.ground_contact)
 ├──> <!flying>
 │   └──> _control.setHoverThrust(_param_mpc_thr_hover.get())
 ├──> <_takeoff.getTakeoffState() == TakeoffState::rampup>
 │   └──> _setpoint.acceleration[2] = NAN  // make sure takeoff ramp is not amended by acceleration feed-forward
 ├──> <not_taken_off || flying_but_ground_contact>
 │   ├──> reset_setpoint_to_nan(_setpoint) // we are not flying yet and need to avoid any corrections
 │   ├──> _setpoint.timestamp = vehicle_local_position.timestamp_sample
 │   ├──> Vector3f(0.f, 0.f, 100.f).copyTo(_setpoint.acceleration) // High downwards acceleration to make sure there's no thrust
 │   └──> _control.resetIntegral() // prevent any integrator windup
 ├──> [limit tilt during takeoff ramupup]
 │   ├──> const float tilt_limit_deg = (_takeoff.getTakeoffState() < TakeoffState::flight) ? _param_mpc_tiltmax_lnd.get() : _param_mpc_tiltmax_air.get()
 │   ├──> _control.setTiltLimit(_tilt_limit_slew_rate.update(math::radians(tilt_limit_deg), dt))
 │   ├──> const float speed_up = _takeoff.updateRamp(dt, PX4_ISFINITE(_vehicle_constraints.speed_up) ? _vehicle_constraints.speed_up : _param_mpc_z_vel_max_up.get())
 │   └──> const float speed_down = PX4_ISFINITE(_vehicle_constraints.speed_down) ? _vehicle_constraints.speed_down :_param_mpc_z_vel_max_dn.get()
 ├──> const float minimum_thrust = flying ? _param_mpc_thr_min.get() : 0.f  // Allow ramping from zero thrust on takeoff
 ├──> _control.setThrustLimits(minimum_thrust, _param_mpc_thr_max.get())
 ├──> float max_speed_xy = _param_mpc_xy_vel_max.get()
 ├──> <PX4_ISFINITE(vehicle_local_position.vxy_max)>
 │   └──> max_speed_xy = math::min(max_speed_xy, vehicle_local_position.vxy_max)
 ├──> _control.setVelocityLimits(max_speed_xy, math::min(speed_up, _param_mpc_z_vel_max_up.get()), math::max(speed_down, 0.f))// takeoff ramp starts with negative velocity limit
 ├──> _control.setInputSetpoint(_setpoint)
 ├──> <!PX4_ISFINITE(_setpoint.z) && PX4_ISFINITE(_setpoint.vz) && (fabsf(_setpoint.vz) > FLT_EPSILON) && PX4_ISFINITE(vehicle_local_position.z_deriv) && vehicle_local_position.z_valid && vehicle_local_position.v_z_valid>// update states
 │	 │    // A change in velocity is demanded and the altitude is not controlled.
 │	 │    // Set velocity to the derivative of position
 │	 │    // because it has less bias but blend it in across the landing speed range
 │	 │    //  <  MPC_LAND_SPEED: ramp up using altitude derivative without a step
 │	 │    //  >= MPC_LAND_SPEED: use altitude derivative
 │   ├──> float weighting = fminf(fabsf(_setpoint.vz) / _param_mpc_land_speed.get(), 1.f)
 │   └──> states.velocity(2) = vehicle_local_position.z_deriv * weighting + vehicle_local_position.vz * (1.f - weighting)
 ├──> _control.setState(states)
 ├──> <!_control.update(dt)>  // Run position control, Failsafe
 │   ├──> _vehicle_constraints = {0, NAN, NAN, false, {}} // reset constraints
 │   ├──> _control.setInputSetpoint(generateFailsafeSetpoint(vehicle_local_position.timestamp_sample, states))
 │   ├──> _control.setVelocityLimits(_param_mpc_xy_vel_max.get(), _param_mpc_z_vel_max_up.get(), _param_mpc_z_vel_max_dn.get())
 │   └──> _control.update(dt)
 ├──> [Publish internal position control setpoints] 
 │   ├──> _vehicle_local_position_setpoint_s local_pos_sp{}
 │   ├──> __control.getLocalPositionSetpoint(local_pos_sp)
 │   ├──> _local_pos_sp.timestamp = hrt_absolute_time()
 │   ├──> __local_pos_sp_pub.publish(local_pos_sp)  // on top of the input/feed-forward setpoints these containt the PID corrections, This message is used by other modules (such as Landdetector) to determine vehicle intention.
 │   ├──> _vehicle_attitude_setpoint_s attitude_setpoint{}
 │   ├──> __control.getAttitudeSetpoint(attitude_setpoint)
 │   ├──> _attitude_setpoint.timestamp = hrt_absolute_time()
 │   └──> __vehicle_attitude_setpoint_pub.publish(attitude_setpoint) // Publish attitude setpoint output
 ├──> <else>// an update is necessary here because otherwise the takeoff state doesn't get skipped with non-altitude-controlled modes
 │   └──> _takeoff.updateTakeoffState(_vehicle_control_mode.flag_armed, _vehicle_land_detected.landed, false, 10.f, true, vehicle_local_position.timestamp_sample)
 ├──> const uint8_t takeoff_state = static_cast<uint8_t>(_takeoff.getTakeoffState())
 └──> <takeoff_state != _takeoff_status_pub.get().takeoff_state || !isEqualF(_tilt_limit_slew_rate.getState(), _takeoff_status_pub.get().tilt_limit)>
     ├──> _takeoff_status_pub.get().takeoff_state = takeoff_state
     ├──> _takeoff_status_pub.get().tilt_limit = _tilt_limit_slew_rate.getState()
     ├──> _takeoff_status_pub.get().timestamp = hrt_absolute_time()
     └──> _takeoff_status_pub.update()  // Publish takeoff status

4. 总结

具体逻辑业务后续再做深入,从模块代码角度:

  • 输入
uORB::SubscriptionCallbackWorkItem _local_pos_sub{this, ORB_ID(vehicle_local_position)};	/**< vehicle local position */

uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};

uORB::Subscription _hover_thrust_estimate_sub{ORB_ID(hover_thrust_estimate)};
uORB::Subscription _trajectory_setpoint_sub{ORB_ID(trajectory_setpoint)};
uORB::Subscription _vehicle_constraints_sub{ORB_ID(vehicle_constraints)};
uORB::Subscription _vehicle_control_mode_sub{ORB_ID(vehicle_control_mode)};
uORB::Subscription _vehicle_land_detected_sub{ORB_ID(vehicle_land_detected)};
  • 输出
uORB::PublicationData<takeoff_status_s>              _takeoff_status_pub{ORB_ID(takeoff_status)};
uORB::Publication<vehicle_attitude_setpoint_s>	     _vehicle_attitude_setpoint_pub{ORB_ID(vehicle_attitude_setpoint)};
uORB::Publication<vehicle_local_position_setpoint_s> _local_pos_sp_pub{ORB_ID(vehicle_local_position_setpoint)};	/**< vehicle local position setpoint publication */

5. 参考资料

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

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

PX4模块设计之三十六:MulticopterPositionControl模块 的相关文章

  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • PX4二次开发中查无资料的踩坑总结

    写在前 xff1a 2021年9月下旬开始摸索px4飞控的二次开发 xff0c 从C 43 43 零基础到第一个修改算法后的版本稳定运行 xff0c 大概用了2个月 xff0c 从12月初改用新版本px4源码到现在又过去了约1个月 xff0
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • 【8-12】树莓派部署t265+px4飞控实现无人机视觉定位

    在之前的文章中 xff0c 我们已经成功在树莓派 xff08 ubuntu mate 18 04 xff09 上部署了T265的追踪摄像头 本文将利用MAVROS协议 xff0c 将T265测量的位姿信息发送给px4固件 xff0c 实现室
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Ubuntu18.04安装PX4踩坑、报错及解决方案整理

    笔者最近需要跑无人机巡检大坝的仿真 xff0c 于是在自己的Ubuntu2018 04中开始安装PX4 xff0c 问过不少之前已经装过PX4的师兄和同学 xff0c 都曾在PX4安装过程中踩过许多坑 xff0c 耗费了不少时间 xff0c
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • 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软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • PX4之常用函数解读

    PX4Firmware 经常有人将Pixhawk PX4 APM还有ArduPilot弄混 这里首先还是简要说明一下 xff1a Pixhawk是飞控硬件平台 xff0c PX4和ArduPilot都是开源的可以烧写到Pixhawk飞控中的
  • PX4通过参数脚本给飞控导入参数

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

    make px4 fmu v3 时报的错 CMake版本的问题 由https blog csdn net zhizhengguan article details 118380965推测 xff0c 删除cmake policy也没事 ma

随机推荐

  • 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
  • atop安装和使用

    atop就是一款用于监控Linux系统资源与进程的工具 xff0c 它以一定的频率记录系统的运行状态 xff0c 所采集的数据包含系统资源 CPU 内存 磁盘和网络 使用情况和进程运行情况 xff0c 并能以日志文件的方式保存在磁盘中 at
  • 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模块设计之十六: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
  • 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模块设计之二十三:自定义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
  • 5G无人车/无人船远控模块,5G图传,FPV增程,含APM/Pix图传数传一体

    本模块适用于 电机 43 电调 43 转向舵机 结构的车 船模型 插入手机SIM卡即可实现无限距离高清图传和遥控 配套安卓手机端APP xff0c 可以手机触屏操控 xff0c 也可以外接USB手柄操控 xff0c 还可以用方向盘 43 油
  • PX4模块设计之二十六:BatteryStatus模块

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

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十六:MulticopterPositionControl模块

    PX4模块设计之三十六 xff1a MulticopterPositionControl模块 1 MulticopterPositionControl模块简介2 模块入口函数2 1 主入口mc pos control main2 2 自定义