总结
从ROS 2 Iron升级到Jazzy,引入了许多稳定性改进,这些改进将不在此详细讨论。以下是一些关键变更和新特性的总结:
BehaviorTree.CPP升级到4.5+
- 用户必须相应地升级他们的XML和源代码。
- XML格式需要改变,可以使用提供的Python脚本来帮助迁移。
- SubTrees的语法已改变,采用了SubTreePlus的语法。
- 如果创建了自定义的ControlNode或DecoratorNode,需要处理子节点返回
BT::NodeStatus::SKIPPED
的情况。
添加TwistStamped选项
- 新增了
enable_stamped_cmd_vel
参数,允许设置TwistStamped
消息的发布和订阅,以包含设置命令的帧和时间戳信息。
在碰撞监测中添加VelocityPolygon
- 允许用户设置多个多边形以覆盖机器人的速度限制范围。
更改碰撞监测中的多边形点参数格式
- 将多边形点的参数格式从
vector<double>
更改为字符串,使多边形描述在碰撞监测和Costmap_2D中更加统一。
引入软实时动作服务器
- 添加了软实时优先级,以更好地确保对时间敏感代码资源的分配。
opennav_coverage和opennav_docking项目
- 引入了新的元包,分别用于覆盖导航和自动充电对接框架。
多机器人启动配置
- 引入了新的多机器人启动配置,允许通过命名空间分隔多个机器人。
Voxel和Obstacle层的新选项
- 添加了
MaxWithoutUnknownOverwrite
选项,以确保静态地图是信息的主要来源。
MPPI控制器的改进
- MPPI控制器的速度提高了45%。
- 改进了目标批评和路径角度批评的公式。
- 添加了新的MPPI成本批评和加速度约束。
其他改进
- 允许行为服务器插件访问和修改动作结果。
- 添加了GPS路径跟随服务器。
- 改进了Smac规划器的调试参数和路径质量。
- 引入了新的碰撞检测器节点,允许动态启用/禁用源和多边形。
- 暴露了动作服务器的结果超时参数。
- 更新了
wait_action
节点的持续时间类型。 - 添加了成本图更新消息类型,以减少通信开销。
- 全栈使用节点时钟。
- 引入了新的优雅运动控制器。
- 在BT导航器中,插件库仅包含自定义节点。
- 添加了新的RViz插件,用于动态选择规划器、控制器等组件。
这些改进和新特性显著增强了ROS 2 Navigation2的功能和灵活性,为用户提供了更强大的导航和路径规划能力。
以下是一个详细的ROS 2 Navigation2(nav2)学习教程,以自动导航小车为例,使用ROS 2 Jazzy版本。本教程将涵盖从环境设置到实际部署的各个方面。
1. 环境设置
1.1 安装ROS 2 Jazzy
首先,确保你的系统上安装了ROS 2 Jazzy。你可以按照ROS 2的官方安装指南进行操作:
bash复制代码
# 添加ROS 2仓库到你的sources.list | |
sudo apt update && sudo apt install curl | |
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros2.repos | vcs import src --input - | |
# 安装构建依赖 | |
cd ~/ros2_ws | |
colcon build | |
# 安装ROS 2环境 | |
source install/setup.bash | |
# 验证安装 | |
ros2 --version |
1.2 安装Navigation2
接下来,安装Navigation2包:
bash复制代码
cd ~/ros2_ws/src | |
git clone https://github.com/ros-planning/navigation2.git -b jazzy | |
cd ~/ros2_ws | |
colcon build | |
source install/setup.bash |
2. 配置环境
2.1 创建工作空间
创建一个新的工作空间来存放你的导航配置和代码:
bash复制代码
mkdir -p ~/nav2_ws/src | |
cd ~/nav2_ws | |
colcon build | |
source install/setup.bash |
2.2 配置机器人描述
创建一个robot_description
文件,描述你的机器人,包括其尺寸、传感器和关节等。例如,使用URDF(统一机器人描述格式):
xml复制代码
<!-- robot_description.urdf --> | |
<robot name="my_robot"> | |
<!-- 机器人基本属性 --> | |
<link name="base_link"> | |
<visual> | |
<geometry> | |
<box size="0.5 0.5 0.3"/> | |
</geometry> | |
</visual> | |
</link> | |
<!-- 其他传感器和关节 --> | |
</robot> |
2.3 配置TF树
确保你的TF(变换)树正确配置,以便Navigation2能够正确理解和处理机器人与环境之间的关系。
3. 配置Navigation2
3.1 配置局部和全局代价地图
创建local_costmap_params.yaml
和global_costmap_params.yaml
文件,配置代价地图参数,如分辨率、障碍物膨胀半径等。
3.2 配置控制器
选择或创建适合你的机器人的控制器,如RegulatedPurePursuitController
或DWBLocalPlanner
,并配置其参数。
3.3 配置行为树
创建一个行为树XML文件,定义导航逻辑。例如:
xml复制代码
<!-- navigate_to_pose.xml --> | |
<root main_tree_to_execute="NavigateToPose"> | |
<BehaviorTree ID="NavigateToPose"> | |
<!-- 节点定义 --> | |
<ComputePathToPose ID="ComputePathToPose" goal="{goal}" /> | |
<FollowPath ID="FollowPath" path="{path}" /> | |
<!-- 其他节点 --> | |
</BehaviorTree> | |
</root> |
3.4 配置启动文件
创建启动文件,如navigation2.launch.py
,以启动Navigation2节点、控制器、行为树等。
4. 仿真测试
4.1 设置仿真环境
使用Gazebo或其他仿真工具设置你的仿真环境,包括地图、障碍物等。
4.2 运行仿真
启动Gazebo和Navigation2节点:
bash复制代码
ros2 launch navigation2 navigation2.launch.py |
在另一个终端中,启动机器人节点和传感器节点(如果适用):
bash复制代码
ros2 launch my_robot_bringup my_robot.launch.py |
4.3 测试导航
使用RViz或其他工具发送导航目标,观察机器人的导航行为。
5. 实地部署
5.1 准备机器人
确保你的机器人硬件和软件都已准备好,包括传感器、电机控制器等。
5.2 部署导航配置
将你在仿真中测试过的导航配置部署到机器人上。
5.3 实地测试
在实际环境中测试机器人的导航能力,根据需要调整参数和配置。
6. 持续优化
- 监控和日志:使用ROS 2的日志和监控工具来跟踪机器人的行为。
- 参数调优:根据测试结果调整控制器、代价地图、行为树等参数。
- 功能扩展:根据需要添加新的传感器、控制器或行为树节点。
通过完成上述步骤,你将能够使用ROS 2 Navigation2为你的自动导航小车实现强大的导航和路径规划能力。记得持续学习和探索ROS 2和Navigation2的更多功能和最佳实践。
练习题
当然,以下是根据ROS 2 Navigation2(nav2)和自动导航小车(使用ROS 2 Jazzy版本)设计的一系列题目,包括10道单选题、5道多选题和5道判断题。
单选题(10道)
-
在ROS 2中,哪个命令用于安装依赖项并构建工作空间?
A.ros2 install
B.colcon build
C.apt-get install
D.catkin_make
-
Navigation2中,用于描述机器人及其环境的文件通常是什么格式?
A. YAML
B. URDF
C. XML
D. JSON -
在Navigation2中,哪个节点负责生成到目标位置的路径?
A. ComputePathToPose
B. FollowPath
C. ClearCostmap
D. Localize -
TwistStamped
消息相比Twist
消息增加了哪些信息?
A. 速度
B. 加速度
C. 帧和时间戳
D. 方向 -
在行为树中,哪个节点通常用于执行条件判断?
A. Sequence
B. Selector
C. Decorator
D. Condition -
以下哪个参数用于在Navigation2中启用
TwistStamped
消息的发布和订阅?
A.enable_stamped_cmd_vel
B.use_twist_stamped
C.cmd_vel_stamped
D.twist_stamped_enabled
-
Navigation2中的哪个层用于处理静态障碍物信息?
A. Static Layer
B. Obstacle Layer
C. Voxel Layer
D. Inflation Layer -
在多机器人环境中,如何通过命名空间分隔不同的机器人?
A. 修改URDF文件
B. 使用不同的参数文件
C. 在启动文件中设置命名空间
D. 修改行为树文件 -
MPPI控制器相比其他控制器,主要改进了什么?
A. 提高了计算速度
B. 增加了对动态障碍物的处理
C. 改善了路径平滑性
D. 增强了全局路径规划能力 -
在ROS 2中,哪个命令用于加载和设置环境变量?
A.source
B.export
C.ros2 env
D.setup.bash
多选题(5道)
-
以下哪些文件是Navigation2配置中常见的?
A.local_costmap_params.yaml
B.global_costmap_params.yaml
C.behavior_tree.xml
D.robot_description.urdf
-
在行为树中,哪些节点通常用于控制流程?
A. Sequence
B. Selector
C. Parallel
D. Condition -
Navigation2支持哪些类型的控制器?
A. RegulatedPurePursuitController
B. DWBLocalPlanner
C. A* Planner
D. Hybrid-A* Planner -
以下哪些选项是Navigation2中可能用到的参数?
A.footprint_radius
B.obstacle_range
C.robot_base_frame
D.map_server
-
在ROS 2中,哪些工具可以用于监控和调试?
A. RViz
B. rqt_console
C. ros2 topic list
D. ros2 node info
判断题(5道)
-
Navigation2中的行为树必须使用XML格式定义。(T/F)
-
TwistStamped
消息默认包含机器人的速度、方向和加速度信息。(T/F) -
在多机器人环境中,每个机器人必须有自己的命名空间以避免冲突。(T/F)
-
MPPI控制器是一种基于模型的预测控制算法,主要用于局部路径规划。(T/F)
-
在ROS 2中,
source install/setup.bash
命令用于安装ROS 2包。(T/F)
答案:
单选题
- B
- B
- A
- C
- D
- A
- A
- C
- A
- A
多选题
- A, B, C, D
- A, B, C
- A, B
- A, B, C
- A, B, C, D
判断题
- T
- F(不包含加速度信息)
- T
- T
- F(用于设置环境变量,不是安装包)
详细中文讲解:RPP新增可选的interpolate_curvature_after_goal
行为及解决use_rotate_to_heading
与allow_reversing
之间的冲突
在PR(Pull Request)#4140中,为RPP(Regulated Pure Pursuit,调节纯追踪)控制器引入了一个新的可选参数interpolate_curvature_after_goal
(默认值为false)。这个参数的作用是激活目标点之后的“胡萝卜”(即前瞻点)的插值计算,以保持一个恒定的曲率前瞻距离。这样做的目的是为了避免路径末端在生成角速度时产生的不稳定性。需要注意的是,用于线性速度计算的“胡萝卜”保持不变。
插值计算的工作原理
插值计算是基于路径上最后两个位姿所形成的向量的方向来进行的。因此,当interpolate_curvature_after_goal
设置为true时,长度为1的路径将被拒绝,因为这种情况下无法形成有效的向量来进行插值计算。此外,这个插值功能只有在use_fixed_curvature_lookahead
设置为true时才能使用。
冲突的解决
除了引入新的插值参数外,PR #4140还解决了use_rotate_to_heading
与allow_reversing
之间的冲突。之前,这两个参数在某些情况下可能无法同时使用,特别是在机器人需要反向行驶时。现在,这个问题已经得到了修复,use_rotate_to_heading
参数现在可以在机器人反向行驶时被使用。
简而言之,这些更改提高了RPP控制器的灵活性和稳定性,特别是在处理复杂路径和需要精确控制机器人朝向的场景中。通过引入interpolate_curvature_after_goal
参数,开发者可以在需要时启用插值计算,以优化机器人的运动轨迹。同时,解决use_rotate_to_heading
与allow_reversing
之间的冲突,使得机器人能够在更多场景下灵活地调整其朝向。
总结
- 新增的
interpolate_curvature_after_goal
参数:允许在目标点之后进行“胡萝卜”的插值计算,以保持恒定的曲率前瞻距离,提高路径末端的稳定性。 - 冲突的解决:
use_rotate_to_heading
与allow_reversing
现在可以同时使用,增强了机器人的运动灵活性。
这些改进使得RPP控制器在自动导航和路径跟踪任务中表现更加出色,特别是在需要精确控制和灵活应对各种场景的情况下。
单选题(5道)
-
在RPP控制器中,哪个新引入的参数用于激活目标点之后的“胡萝卜”插值计算?
A. interpolate_curvature_before_goal
B. interpolate_goal_position
C. interpolate_curvature_after_goal
D. smooth_curvature_after_goal -
interpolate_curvature_after_goal
参数的默认值是?
A. true
B. false
C. 1
D. 0 -
当
interpolate_curvature_after_goal
设置为true时,哪种长度的路径将被拒绝?
A. 任意长度
B. 长度大于1
C. 长度小于1
D. 长度为1 -
在RPP控制器中,哪个参数需要设置为true才能使用
interpolate_curvature_after_goal
功能?
A. use_dynamic_curvature_lookahead
B. use_fixed_curvature_lookahead
C. enable_curvature_interpolation
D. curvature_interpolation_enabled -
在解决
use_rotate_to_heading
与allow_reversing
冲突之前,这两个参数在何种情况下可能无法同时使用?
A. 机器人正向行驶时
B. 机器人静止时
C. 机器人反向行驶时
D. 机器人加速时
多选题(2道)
-
interpolate_curvature_after_goal
参数的引入主要解决了哪些问题?
A. 提高了路径末端的稳定性
B. 增加了机器人的最大速度
C. 允许在目标点之后进行“胡萝卜”的插值计算
D. 改善了线性速度的计算精度 -
下列哪些参数与RPP控制器的曲率前瞻功能相关?
A. interpolate_curvature_after_goal
B. use_fixed_curvature_lookahead
C. max_linear_velocity
D. allow_reversing
判断题(2道)
-
interpolate_curvature_after_goal
参数的引入使得RPP控制器在处理复杂路径时更加灵活和稳定。(T/F) -
在解决
use_rotate_to_heading
与allow_reversing
冲突后,这两个参数在任何情况下都可以同时使用。(T/F)
答案
单选题
- C
- B
- D
- B
- C
多选题
- A, C
- A, B
判断题
- T
- F(虽然冲突得到了解决,但并不意味着这两个参数在任何情况下都可以同时使用,具体还需根据实际场景和配置来判断)
详细中文讲解:RViz新插件用于动态选择规划器、控制器、目标检查器、进度检查器和平滑器
在PR(Pull Request)#4091中,为RViz(Robot Visualization Tool)引入了一个新插件,允许用户动态地选择规划器、控制器、目标检查器、进度检查器和平滑器。这个插件的主要目的是帮助开发者在将机器人部署到实际应用之前,更方便地进行配置和集成测试。
插件的工作原理
为了实现这些组件的动态选择,该插件利用了行为树(Behavior Tree,BT)的选择器节点,并对所有相关的BT节点进行了更新。这样,用户就可以通过RViz界面直观地选择不同的组件,而无需修改代码或配置文件。
插件的演示
在提供的GIF演示中,我们可以看到有两个控制器ID,分别是FollowPath
和HighSpeedFollowPath
。默认情况下,使用的是在行为树中定义的控制器ID,即FollowPath
。然而,用户可以通过插件界面轻松地切换到HighSpeedFollowPath
。
在这个例子中,HighSpeedFollowPath
与FollowPath
的主要区别在于它的最大速度更高。在GIF中,可以明显看到当切换到HighSpeedFollowPath
时,机器人的移动速度加快了。
注意事项
- 服务器不可用:如果某个组件的服务器不可用(例如,某个控制器节点没有启动),那么该组件的下拉列表或组合框将显示为空。这是为了确保用户不会选择到无法使用的组件。
插件的优势
- 灵活性:用户可以在不修改代码的情况下,快速测试不同的规划器、控制器等组件组合,以找到最适合当前应用场景的配置。
- 直观性:通过RViz界面进行配置选择,使得整个过程更加直观和易于理解。
- 测试效率:在部署机器人之前,开发者可以更加高效地进行配置和集成测试,减少现场调试的时间和成本。
总的来说,这个新插件为ROS 2 Navigation2的用户提供了一个强大的工具,使得导航系统的配置和测试变得更加灵活和高效。
单选题(5道)
-
PR #4091为哪个工具引入了一个新插件,用于动态选择导航组件?
A. Gazebo
B. RViz
C. RQT
D. Rospy -
新插件允许用户动态选择哪些类型的导航组件?
A. 传感器和执行器
B. 规划器和控制器
C. 地图和定位器
D. 电源管理系统 -
在RViz新插件的演示GIF中,哪个控制器ID展示了更高的移动速度?
A. FollowPath
B. SlowFollowPath
C. HighSpeedFollowPath
D. PreciseFollowPath -
当某个导航组件的服务器不可用时,新插件中的对应选项会如何显示?
A. 显示为红色
B. 显示为不可用(灰色或禁用状态)
C. 仍然可以选择但会报错
D. 自动选择其他可用组件 -
新插件主要帮助开发者在哪个阶段进行配置和集成测试?
A. 机器人设计阶段
B. 机器人制造阶段
C. 机器人部署前的测试阶段
D. 机器人运行时的监控阶段
多选题(2道)
-
新插件的优势包括哪些?
A. 提高了机器人的移动速度
B. 增加了导航系统的灵活性
C. 简化了配置和集成测试过程
D. 降低了机器人制造成本 -
下列哪些组件可以通过RViz新插件进行动态选择?
A. 规划器
B. 控制器
C. 目标检查器
D. 机器人底盘
判断题(2道)
-
RViz新插件的引入使得开发者在部署机器人之前可以更方便地进行配置和集成测试。(T/F)
-
如果所有导航组件的服务器都不可用,新插件将无法正常工作。(T/F)
答案
单选题
- B
- B
- C
- B
- C
多选题
- B, C
- A, B, C
判断题
- T
- T
ROS 2 K-Turtle中的Nav2更新详解
从ROS 2 Jazzy升级到K-Turtle,Nav2(Navigation2)引入了一系列稳定性和新特性的改进。以下是对这些更新的详细中文讲解。
新Nav2 Loopback模拟器
- 功能:
nav2_loopback_sim
是一个独立的模拟器,用于创建非物理仿真的“回环”,以替代机器人硬件和物理模拟器(如Gazebo、Bullet、Isaac Sim等)。它基于命令速度的输出请求计算机器人的里程计,以创建一个完美的“无摩擦平面”风格的仿真环境,适用于单元测试、系统测试、高层系统的研发、行为测试(无需关注定位精度或系统动力学)以及多机器人仿真。
停靠静态基础设施或动态停靠
- 功能:在PR #4627中,为nav2停靠服务器添加了一种新的停靠插件类型和逻辑,以支持非充电类型的停靠。这允许用户指定停靠到静态基础设施(如传送带)或动态停靠位置(如托盘)的停靠点。此外,还包含了一个新的停靠插件
simple_non_charging_dock
,以演示新停靠服务器的功能。
新的RViz停靠面板
- 功能:在PR #4458中,为与停靠服务器交互添加了一个新的RViz面板。该面板允许用户:
- 将机器人停靠到充电器,选择停靠ID或停靠位姿和类型。同时,还可以设置是否导航到停靠位姿。
- 使机器人从充电器脱离停靠。
- 显示由
nav2_msgs/DockRobot
和nav2_msgs/UndockRobot
动作发布的动作目标状态和反馈。用户可以查看诸如经过时间、重试次数、动作当前状态(如停靠准备、控制中等)以及动作错误代码等信息。
新的BT节点
- 新增节点:
GetPoseFromPath
:从输入路径中获取特定位姿的动作。RemoveInCollisionGoals
:移除成本高于阈值的路点的动作。
新的RViz工具用于代价地图成本单元检查
- 功能:在PR #4546中,添加了一个新的RViz工具来获取代价地图成本单元的成本,并提供了一个服务来获取足迹位姿处的成本单元成本。
- 用法:使用代价地图RViz工具点击代价地图中的任何点,以检索并显示该单元的成本值。
nav2_msgs/GetCosts
服务可用于检索足迹位姿处的成本。
- 用法:使用代价地图RViz工具点击代价地图中的任何点,以检索并显示该单元的成本值。
修复闪烁可视化问题
- 功能:在PR #4561中,为
Costmap2DROS
引入了map_vis_z
参数,以帮助将地图稍微修改到默认平面以下,旨在消除RViz可视化的闪烁问题。- 默认值:
map_vis_z: 0.0
- 无闪烁的最小值:
map_vis_z: -0.008
- 默认值:
通过DWB轨迹限制速度
- 功能:在PR #4663中,为DWB局部规划器引入了
limit_vel_cmd_in_traj
参数,允许用户根据机器人的当前速度限制用于轨迹生成的速度。- 默认值:
false
- 默认值:
在目标退出时禁用零速度发布
- 功能:在PR #4675中,为控制器服务器引入了
publish_zero_velocity
参数,以在目标退出时禁用零速度发布。- 默认值:
true
- 默认值:
这些更新显著增强了Nav2的功能和灵活性,为用户提供了更强大的导航和路径规划能力,特别是在仿真、停靠、可视化以及速度控制方面。
RViz新停靠面板详细中文讲解
在PR(Pull Request)#4458中,为与停靠服务器交互,RViz(Robot Visualization Tool)中添加了一个新的面板。这个面板为用户提供了与机器人停靠和脱离停靠相关的直观操作界面,以及实时反馈和状态显示。
面板功能
- 停靠机器人:
- 用户可以选择将机器人停靠到充电器。在选择停靠时,用户可以通过停靠ID、停靠位姿和类型来进行指定。
- 面板还允许用户设置是否在停靠前导航到预设的停靠准备位姿。这为用户提供了更灵活的停靠策略,以适应不同的应用场景和环境条件。
- 脱离停靠:
- 用户可以通过面板轻松地将机器人从充电器上脱离停靠。
- 状态显示与反馈:
- 面板会显示由
nav2_msgs/DockRobot
和nav2_msgs/UndockRobot
动作发布的动作目标状态和反馈。 - 用户可以实时查看诸如已用时间、重试次数、动作当前状态(如停靠准备、控制中等)以及动作错误代码等信息。这些信息对于监控停靠过程、诊断问题和优化停靠策略非常有用。
- 面板会显示由
工作演示
在提供的GIF演示中(../_images/docking_panel.gif
),
我们可以看到面板的实际操作效果。用户通过简单的点击和选择,就可以完成机器人的停靠和脱离停靠操作,并实时获取动作的状态和反馈。
注意事项
- 停靠服务器不可用:如果停靠服务器不可用(例如,服务器未启动或网络连接问题),那么面板中的停靠类型下拉菜单将显示为空。这是为了确保用户不会选择到无法使用的停靠选项,避免产生不必要的错误或混淆。
这个新的RViz停靠面板为机器人停靠操作提供了极大的便利性和直观性。用户无需深入了解底层的停靠逻辑或编写复杂的代码,就可以通过简单的界面操作完成停靠任务,并实时监控停靠过程的状态和反馈。这对于机器人导航系统的开发和测试具有重要意义。