尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PX4 ROS 2 控制接口(Control Interface)实战指南:用 ROS 2 模式替代 Offboard 控制

PX4 ROS 2 控制接口(Control Interface)实战指南:用 ROS 2 模式替代 Offboard 控制 嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载PX4 ROS 2 控制接口Control Interface是 PX4 ROS 2 接口库提供的核心能力开发者可以用 C或 Python 绑定在 ROS 2 侧编写自定义飞行模式Mode与模式执行器Mode Executor将其动态注册到 PX4 中让地面站把它当作 PX4 原生模式来显示、选择与失效保护联动甚至可以直接替换 PX4 内置的 Return 等模式。读完本文你将掌握自定义模式的类结构、四类已稳定的 setpoint 类型多旋翼 Go-to、固定翼横侧/纵向、直接舵机、Rover 层级 setpoint、VTOL 过渡控制、遥测封装、失效保护与模式需求配置以及把模式绑定到 RC 开关的完整流程。适用版本提示本文基于 PX4 v1.15 及更新的仓库代码固定翼与 Rover 相关 setpoint 标注为 PX4 v1.17。截至编写时控制接口仍有部分内容处于实验阶段——模式的架构与核心接口已基本稳定并在 CI 中测试但仅少数 setpoint 类型已定型其余仍可能变动API 尚未完全文档化。若需要用到未定型的 setpoint可能需要直接使用 PX4 内部话题这些话题不保证向后兼容。控制接口的工作模式Mode、Mode Executor 与配置覆盖下图给出了控制接口模式与模式执行器如何与 PX4 交互的整体概念Mode模式使用接口库定义的模式具有如下性质模式是一个可以向飞行器发送 setpoint如速度或直接舵机指令以控制其运动的组件模式选择一种 setpoint 类型并在激活期间持续发送它可以在多种 setpoint 类型之间切换模式不能激活其他模式必须由用户通过 RC/GCS、飞控在失效保护场景中、模式执行器或其他外部系统激活拥有一个由地面站显示的名称可以配置其模式需求例如要求有效的位姿估计可以执行多种任务例如飞向目标、放下绞盘、释放载荷再飞回可以替换 PX4 中定义的某个内置模式。Mode Executor模式执行器模式执行器是可选的、用于调度模式的组件。例如一个自定义载荷投递或巡线模式的执行器可能先触发起飞再切换到自定义模式等任务完成后触发 Return。具体性质如下模式执行器是比模式高一级的可选组件本质是一个状态机可以激活模式并等待其完成它只有在“掌权”期间才能这么做每个执行器恰好拥有一个被拥有的模式owned mode一个模式最多被一个执行器拥有。该模式作为执行器的激活入口当用户选中该模式时拥有它的执行器被激活并可以选用任意模式它一直掌权直到用户切换模式RC 或 GCS或失效保护触发模式切换失效保护解除后执行器会被重新激活这种设计允许多个执行器共存执行器不能激活其他执行器在库内模式执行器总是与某个自定义模式组合实现。这两条定义保证了用户可以在任何时刻通过 RC 或 GCS 发出模式切换命令从自定义模式或执行器手中夺回控制权模式执行器对用户是透明的——它通过被拥有的模式被间接选中与激活因此该模式应当被恰当地命名。Configuration Overrides配置覆盖模式与执行器都可以定义配置覆盖用于在模式或执行器激活期间定制某些行为。当前已实现两类禁用自动上锁Disabling auto-disarm允许着陆后再次起飞例如用于释放载荷推迟非必需失效保护Deferring non-essential failsafes允许执行器在不被非关键失效保护打断的情况下执行动作例如忽略低电量失效保护以完成绞盘操作。与 Offboard 控制对比相比传统的 offboard 控制上述概念带来如下优势多个节点或应用可以共存甚至同时运行但同一时刻只有一个节点能控制飞行器且该节点是明确界定的模式拥有独立名称可在地面站显示/选择模式与失效保护状态机和上锁检查arming checks深度集成可发送的 setpoint 类型被明确界定ROS 2 模式可以替换飞控内置模式如 Return 模式。PX4 ROS 2 模式比 PX4 内置模式更易实现与维护且为开发者提供更充足的处理能力与现成库资源。除非该模式属于安全关键safety-critical、需要严格时序或极高更新率或你的飞行器没有配套计算机否则应优先考虑使用 PX4 ROS 2 模式而非内置模式可参考 内部模式 vs 外部模式 的讨论。安装与首次测试按以下步骤完成环境准备并跑通第一个示例模式确认你已有可用的 ROS 2 环境且工作区中包含了px4_msgs消息包将接口库克隆到工作区cd $ros_workspace/src git clone --recursive https://github.com/Auterion/px4-ros2-interface-lib为保证兼容性请使用最新的main分支PX4、px4_msgs与接口库三者需相互匹配详见该库的 compatibility 说明。构建工作区cd .. colcon build source install/setup.bash在另一个 shell 中启动 PX4 SITLcd $px4-autopilot make px4_sitl gazebo-classic此处使用 Gazebo-Classic也可以用任意机型或模拟器再开一个 shell 启动 Micro XRCE Agent之后可保持运行MicroXRCEAgent udp4 -p 8888启动 QGroundControl建议使用QGroundControl Daily版本它支持动态更新模式列表回到 ROS 2 终端运行示例模式ros2 run example_mode_manual_cpp example_mode_manual应看到类似如下的输出表明My Manual Mode正在注册[DEBUG] [example_mode_manual]: Checking message compatibility... [DEBUG] [example_mode_manual]: Subscriber found, continuing [DEBUG] [example_mode_manual]: Publisher found, continuing [DEBUG] [example_mode_manual]: Registering My Manual Mode (arming check: 1, mode: 1, mode executor: 0) [DEBUG] [example_mode_manual]: Subscriber found, continuing [DEBUG] [example_mode_manual]: Publisher found, continuing [DEBUG] [example_mode_manual]: Got RegisterExtComponentReply [DEBUG] [example_mode_manual]: Arming check request (id1, only printed once)在 PX4 shell 中验证新模式是否注册成功commander status输出中应包含INFO [commander] Disarmed INFO [commander] navigation mode: Position INFO [commander] user intended navigation mode: Position INFO [commander] in failsafe: no INFO [commander] External Mode 1: nav_state: 23, name: My Manual Mode此时在 QGroundControl 中也能看到该模式选择该模式确保存在手动控制源物理或虚拟摇杆然后上锁arm飞行器。模式被激活后应打印[DEBUG] [example_mode_manual]: Mode My Manual Mode activated现在你就可以着手创建自己的模式了。源码侧的注册链路commander status中出现的External Mode由 PX4 的 模式管理模块 维护——外部模式共占用NAVIGATION_STATE_EXTERNAL1到NAVIGATION_STATE_EXTERNAL8共 8 个导航状态见 ModeManagement.hpp本示例注册后即占用了 nav_state 23即 EXTERNAL1。注册请求与应答、上锁检查、setpoint 配置、模式完成等消息通过 uXRCE-DDS 客户端的 dds_topics.yaml/fmu/in/register_ext_component_request、/fmu/out/register_ext_component_reply、/fmu/out/arming_check_request、/fmu/in/setpoint_config等在 PX4 与 ROS 2 之间桥接基于 Zenoh 的传输则对应 src/modules/zenoh/dds_topics.yaml 中的同名映射。使用接口库模式类定义本节逐步演示如何为自定义模式创建类。完整的可运行示例位于Auterion/px4-ros2-interface-lib仓库的examples/cpp/modes/manual目录参考include/mode.hpp。class MyMode : public px4_ros2::ModeBase // [1] { public: explicit MyMode(rclcpp::Node node) : ModeBase(node, Settings{My Mode}) // [2] { // [3] _manual_control_input std::make_sharedpx4_ros2::ManualControlInput(*this); _rates_setpoint std::make_sharedpx4_ros2::RatesSetpointType(*this); } void onActivate() override { // Called whenever our mode gets selected } void onDeactivate() override { // Called when our mode gets deactivated } void updateSetpoint(const rclcpp::Duration dt) override { // [4] const Eigen::Vector3f thrust_sp{0.F, 0.F, -_manual_control_input-throttle()}; const Eigen::Vector3f rates_sp{ _manual_control_input-roll() * 150.F * M_PI / 180.F, -_manual_control_input-pitch() * 150.F * M_PI / 180.F, _manual_control_input-yaw() * 100.F * M_PI / 180.F }; _rates_setpoint-update(rates_sp, thrust_sp); } private: std::shared_ptrpx4_ros2::ManualControlInput _manual_control_input; std::shared_ptrpx4_ros2::RatesSetpointType _rates_setpoint; };逐条解读[1]创建一个继承自px4_ros2::ModeBase的类[2]构造函数中传入模式名称。此处还可以配置其他选项例如替换飞控内置模式见下文“替换内部模式”[3]在此创建后续要使用的所有对象可以是 RC 输入、setpoint 类型或遥测。*this作为Context传入每个对象将对象与当前模式关联[4]每当模式处于激活状态时该方法会被周期性调用更新率取决于 setpoint 类型。在这里完成业务逻辑并生成新的 setpoint。创建模式实例后必须调用mode-doRegister()完成与飞控的实际注册若注册失败会返回false。如果使用了模式执行器则应改为在执行器上调用doRegister()。模式执行器类定义下面逐步演示模式执行器类的创建class MyModeExecutor : public px4_ros2::ModeExecutorBase // [1] { public: MyModeExecutor(px4_ros2::ModeBase owned_mode) // [2] : ModeExecutorBase(px4_ros2::ModeExecutorBase::Settings{}, owned_mode), _node(owned_mode.node()) { } enum class State // [3] { Reset, TakingOff, MyMode, RTL, WaitUntilDisarmed, }; void onActivate() override { runState(State::TakingOff, px4_ros2::Result::Success); // [4] } void onDeactivate(DeactivateReason reason) override { } void runState(State state, px4_ros2::Result previous_result) { if (previous_result ! px4_ros2::Result::Success) { RCLCPP_ERROR(_node.get_logger(), State %i: previous state failed: %s, (int)state, resultToString(previous_result)); return; } switch (state) { // [5] case State::Reset: break; case State::TakingOff: takeoff(this {runState(State::MyMode, result);}); break; case State::MyMode: // [6] scheduleMode( ownedMode().id(), this { runState(State::RTL, result); }); break; case State::RTL: rtl(this {runState(State::WaitUntilDisarmed, result);}); break; case State::WaitUntilDisarmed: waitUntilDisarmed(this { RCLCPP_INFO(_node.get_logger(), All states complete (%s), resultToString(result)); }); break; } } private: rclcpp::Node _node; };[1]创建继承自px4_ros2::ModeExecutorBase的类[2]构造函数接收与该执行器关联的自定义模式并把它传给ModeExecutorBase的构造函数[3]定义一个枚举描述要依次执行的状态[4]onActivate在执行器被激活时调用此时可以开始运行状态序列。具体实现方式由你决定本示例用runState方法推进下一个状态[5]切换到某状态时调用ModeExecutorBase提供的异步方法来启动目标模式run、takeoff、rtl等。这些方法接收一个完成回调回调提供Result参数告知操作是否成功成功时回调会继续运行下一个状态[6]使用scheduleMode()启动执行器“被拥有的模式”模式与其他状态处理保持一致。Setpoint 类型模式可以选择自己用于控制飞行器的 setpoint 类型所选类型同时决定了它与不同机型的兼容性。目前已支持的相对稳定setpoint 类型MulticopterGotoSetpointTypeGo-to仅多旋翼。平滑的位置与可选航向控制FwLateralLongitudinalSetpointType固定翼横侧/纵向仅固定翼PX4 v1.17 起。直接控制固定翼横侧与纵向动力学DirectActuatorsSetpointType直接控制电机与舵面伺服 setpointRover 系列 setpointPX4 v1.17 起。直接访问 Rover 控制 setpointPosition、Speed、Attitude、Rate、Throttle 与 Steering。其余 setpoint 类型目前仍处于实验阶段位于接口库的px4_ros2_cpp/include/px4_ros2/control/setpoint_types/experimental目录。你也可以添加自己的 setpoint 类型新增一个继承自px4_ros2::SetpointBase的类按 setpoint 需要设置配置标志然后发布任意包含 setpoint 的话题即可。Go-to SetpointMulticopterGotoSetpointType该 setpoint 类型目前仅支持多旋翼。使用px4_ros2::MulticopterGotoSetpointType平滑地控制位置与可选航向 setpoint。该 setpoint 被流式传输到 FMU 侧基于**时间最优、最大加加速度jerk**轨迹公式化的位置与航向平滑器并带有速度与加速度约束。此外还有px4_ros2::MulticopterGotoGlobalSetpointType类允许在全局坐标系中发送 setpoint。最简用法是只把三维位置传入 update 方法const Eigen::Vector3f target_position_m{-10.F, 0.F, 3.F}; _goto_setpoint-update(target_position_m);此时航向将保持不受控制。若要同时控制航向将其作为第二个参数传入const Eigen::Vector3f target_position_m{-10.F, 0.F, 3.F}; const float heading_rad 3.14F; _goto_setpoint-update( target_position_m, heading_rad);Go-to setpoint 的另一个特性是动态控制底层平滑器的速度上限即最大水平/垂直平动速度以及航向角速度。若像上面一样不指定平滑器默认使用飞行器的默认最大值通常设置为物理限制。注意平滑器只会降低速度上限绝不会提高。_goto_setpoint-update( target_position_m, heading_rad, max_horizontal_velocity_m_s, max_vertical_velocity_m_s, max_heading_rate_rad_s);update 方法中除位置外的所有参数都以std::optionalfloat模板化——如果只想约束航向角速度而不约束平动速度可以传std::nullopt_goto_setpoint-update( target_position_m, heading_rad, std::nullopt, std::nullopt, max_heading_rate_rad_s);固定翼横侧与纵向 SetpointFwLateralLongitudinalSetpointType该 setpoint 类型支持固定翼飞行器以及处于固定翼模式的 VTOL。使用px4_ros2::FwLateralLongitudinalSetpointType直接控制固定翼的横侧动力学左右运动转弯/压坡与纵向动力学前后/垂直运动加速与爬升/下降。该 setpoint 被流式传输到 PX4 的 FwLateralLongitudinalControl 模块该模块解耦横侧与纵向输入同时保证飞行器极限被尊重。要控制飞行器至少需要提供横侧和纵向各一个 setpoint纵向输入中altitude或height_rate必须有一个有限finite才能控制垂直运动若两者都为NAN飞行器保持当前高度横侧输入中course、airspeed_direction、lateral_acceleration至少有一个有限。各可控参数的详细说明请参考消息定义FixedWingLateralSetpoint 与 FixedWingLongitudinalSetpoint。基本用法该类型提供多个 update 方法每个方法允许指定越来越多的 setpoint。最简单的是updateWithAltitude()可指定course与altitude目标const float altitude_msl 500.F; const float course 0.F; // due North _fw_lateral_longitudinal_setpoint-updateWithAltitude(altitude_msl, course);PX4 使用这些 setpoint 计算发送给底层控制器的滚转角、俯仰角与油门setpoint。注意使用本方法时指令的飞行预计相对平缓/不激进。其计算链路如下横侧控制输出course setpoint用户设定→ airspeed direction航向setpoint → lateral acceleration setpoint → 滚转角 setpoint纵向控制输出altitude setpoint用户设定→ height rate setpoint → 俯仰角 setpoint 与油门设置。updateWithHeightRate()允许设置目标course与height_rate当爬升/下降速率很重要或需要动态控制时很有用const float height_rate 2.F; const float course 0.F; // due North _fw_lateral_longitudinal_setpoint-updateWithHeightRate(height_rate, course);updateWithAltitude()与updateWithHeightRate()还允许通过第三、第四个参数额外控制等效空速或横侧加速度const float altitude_msl 500.F; const float course 0.F; // due North const float equivalent_aspd 15.F; // m/s const float lateral_acceleration 2.F; // FRD, used as feedforward _fw_lateral_longitudinal_setpoint-updateWithAltitude(altitude_msl, course, equivalent_aspd, lateral_acceleration);等效空速与横侧加速度参数以std::optionalfloat定义因此可以通过传std::nullopt省略其中任意一个。若同时提供横侧加速度与 course setpoint横侧加速度 setpoint 将作为前馈feedforward使用。使用 Setpoint 结构体进行全量控制为获得最大灵活性可以创建并传入FwLateralLongitudinalSetpoint结构体每个字段都以std::optionalfloat模板化优先级规则若同时设置 course 与 airspeed directionairspeed direction 优先course 不被控制若 course 或 airspeed direction 任一有限横侧加速度作为前馈若同时设置 altitude 与 height rateheight rate 优先altitude 不被控制。px4_ros2::FwLateralLongitudinalSetpoint setpoint_s; setpoint_s.withCourse(0.F); // setpoint_s.withAirspeedDirection(0.2F); // uncontrolled setpoint_s.withLateralAcceleration(2.F); // feedforward //setpoint_s.withAltitude(500.F); // uncontrolled setpoint_s.withHeightRate(2.F); setpoint_s.withEquivalentAirspeed(15.F); _fw_lateral_longitudinal_setpoint-update(setpoint_s);下图展示了所有输入均被设置时FwLateralLongitudinalSetpointType与 PX4 之间的交互高级配置可选还可以随 setpoint 一起传入FwControlConfiguration结构体覆盖默认控制器设置与约束例如俯仰限制、油门限制以及目标下沉/爬升速率。这面向高级用户px4_ros2::FwLateralLongitudinalSetpoint setpoint_s; setpoint_s.withAirspeedDirection(0.F); setpoint_s.withLateralAcceleration(2.F); // feedforward setpoint_s.withAltitude(500.F); setpoint_s.withEquivalentAirspeed(15.F); px4_ros2::FwControlConfiguration config_s; config_s.withTargetClimbRate(3.F); config_s.withMaxAcceleration(5.F); config_s.withThrottleLimits(0.4F, 0.6F); _fw_lateral_longitudinal_setpoint-update(setpoint_s, config_s);所有配置字段均定义为std::optionalfloat未设置的值将默认采用 PX4 配置。更多配置选项参见 LateralControlConfiguration 与 FixedWingLongitudinalConfiguration 消息文档。出于安全考虑PX4 会自动将配置值限制在飞行器约束范围内。例如油门覆盖会被钳制在FW_THR_MIN与FW_THR_MAX之间。直接执行机构控制 SetpointDirectActuatorsSetpointType使用px4_ros2::DirectActuatorsSetpointType可以直接控制执行机构电机与舵机可独立设置。请注意执行机构编号是机型与安装配置相关的例如要控制四旋翼需要按照其输出/控制分配配置设置前 4 个电机。若想控制的执行机构并不影响飞行器运动例如载荷舵机请参考下面的“控制独立执行机构/舵机”一节。Rover SetpointsRover 模块使用层级结构传播 setpoint在 PX4 的 Rover 模块中所提供的“最高层”setpoint 会被用来生成其下方的 setpoint并覆盖它们。该层级给出明确的合法控制输入规则提供一个位置 setpoint或提供“左侧”speed或throttle的某个 setpoint和“右侧”attitude、rate或steering的某个 setpoint。左右组合全部合法。为便于使用接口库将这些合法组合暴露为新的 SetpointTypeSetpointTypePositionSpeedThrottleAttitudeRateSteeringControl FlagsRoverPosition✓(✓)(✓)(✓)(✓)(✓)Position, Velocity, Attitude, Rate, Control AllocationRoverSpeedAttitude✓(✓)✓(✓)(✓)Velocity, Attitude, Rate, Control AllocationRoverSpeedRate✓(✓)✓(✓)Velocity, Rate, Control AllocationRoverSpeedSteering✓(✓)✓Velocity, Control AllocationRoverThrottleAttitude✓✓(✓)(✓)Attitude, Rate, Control AllocationRoverThrottleRate✓✓(✓)Rate, Control AllocationRoverThrottleSteering✓✓Control Allocation其中 ✓ 表示该 setpoint 由接口库发布(✓) 表示由 PX4 Rover 模块根据上述层级在内部生成。Rover 专用驱动模式示例使用RoverSpeedAttitudeSetpointType见接口库的examples/cpp/modes/rover_velocity目录。上述 7 类 Rover setpoint 在 PX4 侧对应/fmu/in/rover_position_setpoint、/fmu/in/rover_speed_setpoint、/fmu/in/rover_attitude_setpoint、/fmu/in/rover_rate_setpoint、/fmu/in/rover_throttle_setpoint、/fmu/in/rover_steering_setpoint等话题均已在 dds_topics.yaml 中完成映射。控制 VTOL要在外部飞行模式中控制 VTOL请根据当前飞行配置返回正确的 setpoint 类型多旋翼模式使用与多旋翼控制兼容的 setpoint 类型例如MulticopterGotoSetpointType或TrajectorySetpointType固定翼模式使用FwLateralLongitudinalSetpointType。只要 VTOL 在整个外部模式期间保持在多旋翼或固定翼模式就无需额外处理。如果要在外部模式中指令 VTOL 过渡transition需要使用VTOL APIpx4_ros2::VTOL。该 API 提供指令过渡与查询飞行器当前状态的能力。请谨慎使用该 API与机上过渡如通过 RC 开关由 PX4 处理完整流程不同外部指令过渡会使用户部分负责确保平滑与安全行为确保你的模式同时具备TrajectorySetpointType与FwLateralLongitudinalSetpointType在模式构造函数中创建px4_ros2::VTOL实例指令过渡时在 VTOL 对象上使用toMulticopter()或toFixedwing()方法设置期望状态过渡期间发送如下 setpoint 组合// Assuming the instance of the px4_ros2::VTOL object is called vtol // Send TrajectorySetpointType as follows: Eigen::Vector3f acceleration_sp vtol.computeAccelerationSetpointDuringTransition(); Eigen::Vector3f velocity_sp{NAN, NAN, 0.f}; _trajectory_setpoint-update(velocity_sp, acceleration_sp); // Send FwLateralLongitudinalSetpointType with lateral input to realign vehicle as desired float course_sp 0.F; // North _fw_lateral_longitudinal_setpoint-updateWithAltitude(NAN, course_sp)这将确保过渡在 PX4 内被正确处理。可选地可以向computeAccelerationSetpointDuringTransition()传入一个减速 setpoint用于反向过渡back-transition。查询飞行器当前状态使用 VTOL 对象上的getCurrentState()方法。实际使用示例见接口库的examples/cpp/modes/vtol目录。控制独立执行机构/舵机若需要控制独立执行机构舵机按以下步骤先配置输出基于 MAVLink 的通用执行机构控制在模式构造函数中创建px4_ros2::PeripheralActuatorControls实例调用set()方法控制执行机构这可以独立于任何激活的 setpoint 进行。遥测可以通过以下类直接访问 PX4 遥测话题OdometryGlobalPosition全局位置OdometryLocalPosition本地位置、速度、加速度与航向OdometryAttitude飞行器姿态OdometryAirspeed空速。例如查询飞行器当前位姿估计std::shared_ptrpx4_ros2::OdometryLocalPosition _vehicle_local_position; ... // Get vehicles last local position _vehicle_local_position-positionNed(); // Check last horizontal position is valid _vehicle_local_position-positionXYValid();这些类是对 PX4 内部话题的封装当内部话题变更时库可以借此维持兼容性。新话题可参考接口库的px4_ros2_cpp/include/px4_ros2/odometry目录当然你也可以直接使用 PX4 发布的任何 ROS 2 话题。失效保护与模式需求每个模式都有一组需求标志requirement flags通常会根据模式上下文中使用的对象自动设置。例如添加手动控制输入时手动控制需求标志被自动设置_manual_control_input std::make_sharedpx4_ros2::ManualControlInput(*this);具体而言当条件不满足时设置某个标志会在 PX4 中产生以下后果模式被选中期间不允许上锁arming已上锁时该模式无法被选中已上锁且模式被选中时会触发相应失效保护例如手动控制需求对应 RC 丢失。失效保护行为可参考安全配置页面进行配置此外当模式崩溃或失去响应时也会触发失效保护。手动控制标志对应的流程如下图所示模式注册后也可以手动更新任何模式需求例如添加“需要家点home position”modeRequirements().home_position true;完整标志列表见接口库的px4_ros2_cpp/include/px4_ros2/common/requirement_flags.hpp。从源码看PX4 侧的上锁检查与失效保护通过/fmu/out/arming_check_request与/fmu/in/arming_check_reply话题与外部模式交互见 dds_topics.yamlModeManagement还会在检测到外部模式无响应时执行回退例如解除注册或回落到内部模式见 ModeManagement.cpp。推迟失效保护Deferring Failsafes模式或模式执行器可以通过调用deferFailsafesSync()方法临时推迟非必需失效保护。若希望在失效保护即将被触发时得到通知可重写void onFailsafeDeferred()方法。参考集成测试示例接口库的px4_ros2_cpp/test/integration/overrides.cpp。将模式绑定到 RC 开关或摇杆动作外部模式可以绑定到 RC 开关或摇杆动作。将模式绑定到 RC 开关时你需要知道其索引因为参数元数据中不包含动态模式名。在模式运行期间使用commander status获取该信息。例如INFO [commander] External Mode 1: nav_state: 23, name: My Manual Mode表示你应在 QGC 中选择External Mode 1PX4 通过存储模式名的哈希值保证同一模式始终分配到同一索引。这样在存在多个外部模式时结果与启动顺序无关。替换内置模式外部模式可以替换某个现有内置模式例如 Return 模式。一旦替换无论何时该模式被选中用户选择或失效保护场景都会使用外部模式仅当外部模式失去响应或崩溃时内置模式作为回退被使用。替换模式在ModeBase构造函数的 Settings 中指定Settings{kName, false, ModeBase::kModeIDRtl}从源码看PX4 在ModeManagement中通过RegisterExtComponentRequest的replace_internal_mode字段记录替换关系见 ModeManagement.cpp并在地面站/用户选中被替换模式时先检查外部模式是否有效且响应正常否则才回落到内置模式getNavStateReplacementIfValid与getReplacedModeIfAny逻辑。模式替换相关的注册/注销消息同样经由 dds_topics.yaml 中的/fmu/in/register_ext_component_request与/fmu/in/unregister_ext_component话题传递。小结PX4 ROS 2 控制接口把“外部模式”从零散的 offboard 指令提升为与飞控深度集成的第一等公民模式拥有名称、需求标志与失效保护联动可被 GCS 显示选择、可绑定 RC 开关、可替换内置模式模式执行器则提供了起飞→任务→RTL 的完整状态机编排能力。配合已定型的 Go-to、固定翼横侧/纵向、直接执行机构与 Rover 系列 setpoint 类型大多数非安全关键的导航与控制需求都可以在 ROS 2 侧以更高开发效率实现。若要深入源码可从 src/modules/commander/ModeManagement.cpp 与 src/modules/uxrce_dds_client/dds_topics.yaml 继续探索其 PX4 侧实现。赞分享嵌入式物联网机器人自动驾驶智能硬件【免费下载链接】PX4-AutopilotPX4 Autopilot Software项目地址https://gitcode.com/gh_mirrors/px/PX4-Autopilot点击查看免费下载相关推荐PX4 无人车Rover外部控制 API 指南PX4 ROS 2 接口与 ROS 2 Offboard 两种方案详解PX4 无人车Rover外部控制 API 指南PX4 ROS 2 接口与 ROS 2 Offboard 两种方案详解 本篇技术指南以 PX4 Autopi嵌入式物联网机器人自动驾驶智能硬件PX4 Offboard 模式Offboard Mode完全指南MAVLink 与 ROS 2 外部控制详解PX4 Offboard 模式Offboard Mode完全指南MAVLink 与 ROS 2 外部控制详解 Offboard 模式是 PX4 自动飞行栈嵌入式物联网机器人自动驾驶智能硬件PX4 Offboard 控制实战指南通过 MAVLink 与 ROS 2 让外部软件接管飞控PX4 Offboard 控制实战指南通过 MAVLink 与 ROS 2 让外部软件接管飞控 Offboard机外控制是 PX4 最重要的开发能力之一嵌入式物联网机器人自动驾驶智能硬件上一篇告别画面错乱my-tv多窗口布局适配全攻略下一篇tsdown多包管理实战如何在monorepo中高效使用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表