机器人ROS自动驾驶【免费下载链接】navigation2ROS 2 Navigation Framework and System项目地址https://gitcode.com/gh_mirrors/na/navigation2点击查看免费下载本文以 ROS 2 Navigation2 框架中的nav2_behaviors包为对象系统讲解集中式行为服务器的设计动机、TimedBehavior模板的执行模型、Spin/BackUp/DriveOnHeading/Wait/AssistedTeleop五类内置行为的工作原理并结合仓库源码与nav2_bringup示例参数给出可直接复制使用的配置与自定义行为插件的开发路径。读完本文你将掌握行为服务器从参数配置、插件加载、动作接口到源码实现的全链路知识。一、nav2_behaviors 是什么行为即服务在 Navigation2 的生态中nav2_behaviors是一个专门用于执行行为Behaviors的任务服务器包。所谓行为是指机器人在导航过程中需要临时执行的、短期的运动或状态原语例如原地旋转Spin、后退脱困BackUp、沿当前朝向直线前进DriveOnHeading、原地等待Wait以及人工辅助遥控AssistedTeleop。这些行为通常由行为树Behavior Tree中的 Recovery 节点在导航异常时触发用于让机器人从卡死、碰撞风险等状态中恢复。从仓库结构看该包的核心构成如下include/nav2_behaviors/timed_behavior.hppTimedBehavior模板行为开发的最常用基类include/nav2_behaviors/behavior_server.hpp 与 src/behavior_server.cpp行为服务器的生命周期节点实现负责通过 pluginlib 动态加载行为插件plugins/五个内置行为插件的具体实现spin.cpp、back_up.cpp、drive_on_heading.cpp、wait.cpp、assisted_teleop.cppbehavior_plugin.xml插件的 pluginlib 注册清单test/test_behaviors.cpp针对TimedBehavior基类的单元测试。二、集中式行为服务器为什么要共享资源导航系统中TF坐标变换订阅、代价地图costmap订阅等都是相当昂贵的资源每个独立节点都会建立自己的订阅连接消耗可观的计算与通信开销。如果每个行为都做成独立节点机器人的资源开销会显著增加。nav2_behaviors的集中式行为服务器正是为了解决这一问题而设计把所有行为合并到一个服务器进程中让它们共享 TF 缓冲、代价地图订阅等公共资源同时每个行为在执行逻辑与对外接口上保持完全独立。这也是官方 README 中强调的核心价值——share resources whilst retaining complete independence in execution and interface。这一设计在 src/behavior_server.cpp 的setupResourcesForBehaviorPlugins()中体现得淋漓尽致服务器根据各行为插件通过getResourceInfo()声明的代价地图需求NONE/LOCAL/GLOBAL/BOTH定义见 nav2_core/include/nav2_core/behavior.hpp按需创建唯一的本地/全局代价地图订阅器、足迹订阅器和CostmapTopicCollisionChecker碰撞检查器再统一传给每个行为插件使用。例如Spin、DriveOnHeading、Wait、AssistedTeleop都声明只需要LOCAL代价地图见各自的头文件getResourceInfo()实现因此服务器只需创建一个本地代价地图订阅即可服务全部行为。三、插件接口一切行为的基石 nav2_core::Behavior在 Nav2 中插件体系遵循核心接口 pluginlib 动态加载的经典模式。一个行为插件唯一必须继承的基类是 nav2_core/include/nav2_core/behavior.hpp 中定义的nav2_core::Behavior抽象类它定义了行为服务器与插件之间的契约virtual void configure( const nav2::LifecycleNode::WeakPtr parent, const std::string name, nav2::TransformBuffer::SharedPtr tf, std::shared_ptrnav2_costmap_2d::CostmapTopicCollisionChecker local_collision_checker, std::shared_ptrnav2_costmap_2d::CostmapTopicCollisionChecker global_collision_checker) 0; virtual void cleanup() 0; virtual void activate() 0; virtual void deactivate() 0; virtual CostmapInfoType getResourceInfo() 0;接口只要求实现生命周期四个阶段配置、清理、激活、去激活以及资源需求声明。值得注意的是行为并不强制要求是 Action 形式——如果你愿意完全可以把行为建模成 Service 或其他接口。官方文档明确指出TimedBehavior只是方便但不是必须的辅助类。不过绝大多数运动原语都是长时间运行的任务天然适合建模为 ROS 2 Action可取消、可反馈、可超时因此仓库默认提供了TimedBehavior模板来简化这类行为的开发。四、TimedBehavior 模板定时行为引擎的源码解剖include/nav2_behaviors/timed_behavior.hpp 是行为开发的核心模板类它继承自nav2_core::Behavior并内置了一个泛型 Action 服务器nav2::SimpleActionServerActionT。其设计思想是把行为抽象成两个用户回调框架负责循环调度。4.1 核心抽象三个必须/可选的虚函数virtual ResultStatus onRun(const std::shared_ptrconst typename ActionT::Goal command) 0; virtual ResultStatus onCycleUpdate() 0; virtual void onConfigure() {} virtual void onCleanup() {} virtual void onActionCompletion(std::shared_ptrtypename ActionT::Result result) {}onRun(command)在动作开始时只调用一次用于解析 Goal、做前置校验如 TF 是否可用、输入是否合法返回SUCCEEDED才会进入主循环否则整个行为直接以失败终止onCycleUpdate()主循环的核心以cycle_frequency的频率被循环调用每次执行一个单位的工作例如计算一次速度指令返回RUNNING则继续返回SUCCEEDED则行为成功结束返回FAILED则行为失败并携带错误码与错误信息其余三个虚函数是可选的挂钩点分别用于配置阶段、清理阶段和动作结束时的善后处理。4.2 状态与结果类型模板定义了执行状态枚举和结果结构体enum class Status : int8_t { SUCCEEDED 1, FAILED 2, RUNNING 3, }; struct ResultStatus { Status status; uint16_t error_code{0}; std::string error_msg; };error_code与各动作消息中定义的错误码常量对应详见后文动作接口与错误码小节error_msg提供人类可读的错误描述二者都会在行为失败时写入 Action Result 中返回给调用方。4.3 主执行循环的完整流程模板的execute()方法timed_behavior.hpp实现了完整的动作执行状态机其流程如下活性检查若服务器处于未激活状态enabled_为 false直接警告并忽略请求调用onRun失败则立即以terminate_current结束动作并返回错误计时开始记录start_time创建nav2::Rate loop_rate(node, cycle_frequency_)控制循环频率循环处理while (rclcpp::ok())更新elapsed_time_检查抢占请求当前版本尚未实现抢占源码中留有TODO(orduno) #868注释收到抢占请求会记录错误、stopRobot()停止机器人并终止动作检查取消请求收到取消则停止机器人、记录已耗时、终止所有动作调用onCycleUpdate()并按其返回状态分发SUCCEEDED→ 记录total_elapsed_time、调用onActionCompletion、succeeded_currentFAILED→ 写入错误码与错误信息、终止动作RUNNING→loop_rate.sleep()后进入下一轮。4.4 生命周期管理与公共资源configure()阶段会从参数服务器读取cycle_frequency、local_frame、global_frame、robot_base_frame、transform_staleness_threshold默认 0.0创建以行为名命名的 Action Server并创建nav2_util::TwistPublisher发布到cmd_vel话题。activate()/deactivate()会同步激活/去激活速度发布器与动作服务器。模板还提供了两个开箱即用的受保护工具getCurrentPoseChecked()在本地坐标系下获取新鲜的机器人位姿若 TF 缺失或超时超过transform_staleness_threshold则返回 false 且不改写位姿——所有依赖位姿的行为都用它做前置检查stopRobot()发布一个全零速度指令linear.x/y 0, angular.z 0frame 为robot_base_frame用于超时、取消、碰撞等场景下的紧急制动。4.5 测试印证test/test_behaviors.cpp 中定义了一个继承TimedBehaviorDummyBehaviorAction的DummyBehavior测试类onRun根据命令字符串模拟成功/失败初始化onCycleUpdate模拟 1 秒的运动时长正好验证了onRun 单次初始化 主循环周期性更新 三态返回这套执行模型。官方 README 也提到TimedBehavior内部使用了 nav2_util/README.md#twist-publisher-and-twist-subscriber-for-commanded-velocities 中的nav2_util::TwistPublisher。五、行为服务器插件加载与生命周期管理5.1 节点与默认插件src/behavior_server.cpp 中的behavior_server::BehaviorServer是一个继承自nav2::LifecycleNode的组件节点通过RCLCPP_COMPONENTS_REGISTER_NODE注册为 ROS 组件可被 Composition 容器加载。构造函数中声明的默认插件列表为default_ids_ {spin, backup, drive_on_heading, wait} default_types_{nav2_behaviors::Spin, nav2_behaviors::BackUp, nav2_behaviors::DriveOnHeading, nav2_behaviors::Wait}也就是说默认启用四个行为AssistedTeleop需要显式加入behavior_plugins列表才会被加载这正是官方 README 专门说明其teleop_command_timeout参数的原因——它默认不在插件列表中。5.2 加载与配置流程生命周期on_configure阶段依次执行创建 TF 缓冲与监听器create_transform_buffer/create_transform_listenerloadBehaviorPlugins()遍历behavior_plugins中声明的每个 ID读取{id}.plugin参数得到具体类名如nav2_behaviors::Spin通过pluginlib::ClassLoadernav2_core::Behavior创建插件实例任一插件创建失败都会导致配置失败setupResourcesForBehaviorPlugins()按需创建本地/全局代价地图订阅器、足迹订阅器与碰撞检查器见第二节configureBehaviorPlugins()逐个调用插件的configure(node, id, tf_, local_collision_checker_, global_collision_checker_)。on_activate/on_deactivate阶段则遍历所有插件调用其activate()/deactivate()同时创建/销毁 bond 连接用于节点间活性监控。5.3 插件的 XML 注册每个行为插件都通过PLUGINLIB_EXPORT_CLASS宏导出并在 behavior_plugin.xml 中登记例如library pathnav2_spin_behavior class typenav2_behaviors::Spin base_class_typenav2_core::Behavior/ /library新建自定义行为插件时需要同样编写 XML 描述并在 CMake 中安装pluginlib_export_plugin_description_file服务器即可通过参数动态加载无需改一行服务器代码。六、内置行为插件逐个拆解6.1 Spin原地旋转plugins/spin.cpp 实现了Spin行为目标是通过target_yaw弧度旋转指定角度。它的关键点在onCycleUpdate()角度累加通过current_yaw - prev_yaw_计算每帧增量并做 ±π 的环绕处理abs(delta_yaw) M_PI时取补角方向累加到relative_yaw_作为已转角度同时发布angular_distance_traveled反馈三角速度剖面剩余角度remaining_yaw接近 0 1e-6即成功停车否则按vel sqrt(2 * rotational_acc_lim_ * remaining_yaw)计算速度并钳制在min_rotational_vel_与max_rotational_vel_之间实现减速逼近目标角的平滑控制碰撞前瞻isCollisionFree()按simulate_ahead_time_默认 2.0s和cycle_frequency_的步长用本地代价地图碰撞检查器逐帧模拟旋转轨迹上的位姿若前方有碰撞则停车并返回COLLISION_AHEAD错误超时保护超过 Goal 中的time_allowance仍未完成则停车并返回TIMEOUT。其参数在onConfigure()中读取默认值分别为simulate_ahead_time2.0、max_rotational_vel1.0、min_rotational_vel0.4、rotational_acc_lim3.2单位为 rad/s 与 rad/s²。6.2 DriveOnHeading沿朝向直线行驶include/nav2_behaviors/plugins/drive_on_heading.hpp 实现了一个带加减速约束的直线行驶行为目标target是一个geometry_msgs/Point只允许 X 方向分量Y/Z 非零会返回INVALID_INPUT。实现要点速度规划每周期根据上一周期速度last_vel_按acceleration_limit_/deceleration_limit_默认 2.5 / -2.5计算可行速度区间并std::clamp保证加减速平滑且可控接近目标时按max_vel_to_stop sqrt(-2 * deceleration_limit_ * remaining_distance)提前减速防超调低于minimum_speed_默认 0.10时以最小速度兜底避免低速死区方向一致性校验onRun中要求target.x与speed同号否则返回INVALID_INPUT碰撞前瞻同样以simulate_ahead_time_步长沿行驶方向逐帧检查本地代价地图碰撞则停车返回COLLISION_AHEAD成功判据已行驶距离hypot(diff_x, diff_y)随distance_traveled反馈发布达到|target.x|即停车成功。6.3 BackUp倒车脱困include/nav2_behaviors/plugins/back_up.hpp 中BackUp类直接继承自DriveOnHeadingBackUpAction仅重写了onRun它静默地把速度和目标方向强制转为负值command_x_ -fabs(target.x)、command_speed_ -fabs(speed)从而复用 DriveOnHeading 的整套加减速与碰撞检测逻辑只允许沿 X 轴负方向后退。Y/Z 方向输入同样被拒绝INVALID_INPUT。这是模板与继承复用带来的典型收益一个新行为往往只需要几十行代码。6.4 Wait定时等待plugins/wait.cpp 是最简单的行为onRun记录wait_end_ now goal.timeonCycleUpdate每周期发布剩余时间time_left反馈剩余时间大于 0 返回RUNNING否则返回SUCCEEDED。它不需要运动控制主要用于导航流程中的停顿场景如等待传感器数据、等待任务切换。6.5 AssistedTeleop带碰撞保护的人工遥控plugins/assisted_teleop.cpp 实现了辅助遥控行为是五个插件中机制最丰富的一个官方 README 也专门为其补充了说明遥操作输入通过nav2_util::TwistSubscriber订阅cmd_vel_teleop话题默认话题名cmd_vel_teleop同时支持Twist与TwistStamped两种消息类型当使用TwistStamped时要求上游必须填充消息的 header 时间戳否则新鲜度检查无法生效命令超时保护一旦操作者开始驾驶收到第一条指令若在teleop_command_timeout默认0.25s内没有新的遥操作指令到达行为判定操作者松手或链路中断立即停车并以TELEOP_INPUT_TIMEOUT失败退出将该参数设为0.0可关闭此检查适用于指令稀疏的遥操作源如低频手柄、网络遥控碰撞投影onCycleUpdate以simulation_time_step_默认 0.1s为步长、projection_time_默认 1.0s为窗口用projectPose()对当前遥操作速度做前向运动学投影含线性/角速度的姿态更新逐帧在本地代价地图上检查碰撞若第一个时间步就碰撞则速度指令直接清零若后续时间步碰撞则按time / projection_time_比例缩放速度实现前方有障碍就自动减速主动退出订阅preempt_teleop话题std_msgs/Empty收到消息即判定遥控成功、停车并返回SUCCEEDED超时兜底超过time_allowance未结束则停车返回TIMEOUT并通过current_teleop_duration反馈实时上报已遥控时长。七、动作接口与错误码客户端视角五个内置行为对应五个动作定义全部位于 nav2_msgs/action/ 目录。它们的 Goal、Result 与 Feedback 结构如下行为Goal 关键字段Feedback动作文件Spintarget_yawfloat32弧度、time_allowance、disable_collision_checksangular_distance_traveledSpin.actionBackUptargetPoint仅 X 有效、speed、time_allowance、disable_collision_checksdistance_traveledBackUp.actionDriveOnHeadingtargetPoint仅 X 有效、speed、time_allowance、disable_collision_checksdistance_traveledDriveOnHeading.actionWaittimeDurationtime_leftWait.actionAssistedTeleoptime_allowancecurrent_teleop_durationAssistedTeleop.action所有行为的 Result 都统一包含total_elapsed_time实际耗时、error_code与error_msg。disable_collision_checks为 true 时可跳过行为内部的代价地图碰撞检测危险操作仅用于特殊调试场景。错误码按包分别编号Spin 以 700 起、BackUp 710、DriveOnHeading 720、AssistedTeleop 730、Wait 740常见语义包括NONE0、GOAL_REJECTED1、SEND_GOAL_FAILURE2、TIMEOUT、TF_ERROR、COLLISION_AHEAD、INVALID_INPUT、TELEOP_INPUT_TIMEOUT等客户端可直接依据错误码做恢复策略分支。八、实战配置nav2_params.yaml 全量示例nav2_bringup自带的 params/nav2_params.yaml 给出了行为服务器的完整配置模板五个行为全部启用behavior_server: ros__parameters: local_costmap_topic: local_costmap/costmap_raw global_costmap_topic: global_costmap/costmap_raw local_footprint_topic: local_costmap/published_footprint global_footprint_topic: global_costmap/published_footprint cycle_frequency: 10.0 behavior_plugins: [spin, backup, drive_on_heading, assisted_teleop, wait] spin: plugin: nav2_behaviors::Spin simulate_ahead_time: 2.0 max_rotational_vel: 1.0 min_rotational_vel: 0.4 rotational_acc_lim: 3.2 backup: plugin: nav2_behaviors::BackUp simulate_ahead_time: 2.0 acceleration_limit: 2.5 deceleration_limit: -2.5 minimum_speed: 0.10 drive_on_heading: plugin: nav2_behaviors::DriveOnHeading simulate_ahead_time: 2.0 acceleration_limit: 2.5 deceleration_limit: -2.5 minimum_speed: 0.10 wait: plugin: nav2_behaviors::Wait assisted_teleop: plugin: nav2_behaviors::AssistedTeleop projection_time: 1.0 simulation_time_step: 0.1 teleop_command_timeout: 0.25 local_frame: odom global_frame: map robot_base_frame: base_link transform_tolerance: 0.1各参数的作用与默认值汇总如下默认值取自 behavior_server.cpp 与各插件的onConfigure()参数默认值说明cycle_frequency10.0行为主循环更新频率HzTimedBehavior的执行节奏behavior_plugins[spin, backup, drive_on_heading, wait]启用的插件 ID 列表assisted_teleop需显式加入{id}.plugin见默认类型每个插件 ID 对应的具体 C 类名local_costmap_topic/global_costmap_topiclocal_costmap/costmap_raw/global_costmap/costmap_raw代价地图订阅话题local_footprint_topic/global_footprint_topiclocal_costmap/published_footprint/global_costmap/published_footprint足迹订阅话题local_frame/global_frameodom/mapTF 坐标系参考robot_base_framebase_link机器人本体坐标系transform_tolerance0.1足迹变换允许的容差秒transform_staleness_threshold0.0位姿新鲜度阈值0.0 表示不启用过期检查TimedBehavior::configure读取spin.simulate_ahead_time2.0旋转碰撞前瞻模拟时长秒spin.max_rotational_vel/min_rotational_vel1.0 / 0.4最大/最小旋转速度rad/sspin.rotational_acc_lim3.2旋转加速度限制rad/s²backup/drive_on_heading.acceleration_limit2.5直线加速度限制m/s²backup/drive_on_heading.deceleration_limit-2.5直线减速度限制m/s²必须为负源码会自动取绝对值修正符号backup/drive_on_heading.minimum_speed0.10最小行驶速度m/sassisted_teleop.projection_time1.0碰撞投影前瞻时长秒assisted_teleop.simulation_time_step0.1投影模拟步长秒assisted_teleop.teleop_command_timeout0.25遥操作指令超时秒0.0 关闭检查assisted_teleop.cmd_vel_teleopcmd_vel_teleop遥操作速度输入话题名配置提醒acceleration_limit与deceleration_limit必须分别为正、负值源码在onConfigure中会检测并自动修正std::abs处理cycle_frequency同时决定了碰撞前瞻模拟的分辨率模拟步长为1 / cycle_frequency_teleop_command_timeout0.0仅用于关闭稀疏遥操作源的超时检查正常情况下建议保留默认值以保障安全。九、编写自定义行为最小实现模板结合第三节与第四节的机制编写一个新行为插件例如自定义的前后蠕动只需三步继承TimedBehaviorYourAction实现onRun解析 Goal、前置校验、初始化位姿与终点与onCycleUpdate每周期计算速度、更新反馈、按状态机返回RUNNING/SUCCEEDED/FAILED并按需覆写onConfigure读取behavior_name_ .xxx前缀参数、getResourceInfo声明代价地图需求导出插件文件末尾调用PLUGINLIB_EXPORT_CLASS(your_namespace::YourBehavior, nav2_core::Behavior)注册与配置在包内新建your_behavior.xml仿照 behavior_plugin.xml 格式在 CMake 中安装并调用pluginlib_export_plugin_description_file然后在behavior_server的behavior_plugins列表中追加 ID 并补上{id}.plugin参数即可服务器与行为树调用方无需任何改动。官方 README 进一步指出行为甚至可以不依赖TimedBehavior——只要实现nav2_core::Behavior接口建模为 Service 等其他交互形式也完全可行TimedBehavior的价值在于帮你管理长时运行动作的复杂度循环、超时、取消、停车、碰撞检查这也是绝大多数运动原语的选择。十、小结nav2_behaviors通过集中式行为服务器 pluginlib 插件体系 TimedBehavior定时执行引擎三层设计把 TF、代价地图等昂贵资源聚合共享把 Spin、BackUp、DriveOnHeading、Wait、AssistedTeleop 等恢复与辅助行为统一纳入 Action 接口管理并为开发者提供了极低门槛的自定义行为扩展路径。理解它的执行模型onRun 单次初始化 onCycleUpdate 周期推进 三态返回、参数体系服务器级与{id}.前缀的插件级两级参数以及动作错误码约定是进行导航恢复策略调优与二次开发的关键基础。赞分享机器人ROS自动驾驶【免费下载链接】navigation2ROS 2 Navigation Framework and System项目地址https://gitcode.com/gh_mirrors/na/navigation2点击查看免费下载相关推荐Yii 2 Behaviors行为机制完全指南定义、挂载、事件响应与内置行为实战Yii 2 Behaviors行为机制完全指南定义、挂载、事件响应与内置行为实战 Behaviors行为又称 mixin/混合是 Yii 2 框架中后端Web框架如何深度定制ModernWpf控件模板打造独特UI体验的完整指南如何深度定制ModernWpf控件模板打造独特UI体验的完整指南 ModernWpf是一个为WPF应用提供现代样式和控件的开源项目通过定制控件模板开发者可桌面应用UI组件LightTable 行为与快捷键配置完全指南Behaviors、Keymap、Tags 与命令系统深度解析LightTable 行为与快捷键配置完全指南Behaviors、Keymap、Tags 与命令系统深度解析 本指南以 LightTable 官方配置文档开发工具IDE上一篇如何自定义机器学习可视化器Yellowbrick扩展开发终极指南下一篇终极指南如何使用Gron让JSON数据搜索变得简单高效创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考