爱折腾-创客智造实验室 - ROS2与Navigation2入门教程
type: channel
link: https://www.ncnynl.com/category/ROS2-Navigation2
description: 通过学习ROS2与Navigation2入门教程，了解动态路径规划、计算电机速度、避开障碍物和结构恢复行为
items: ROS2与Navigation2入门教程-目录
items: ROS2与Navigation2入门教程-Navigation 2概述
items: ROS2与Navigation2入门教程-开始使用Nav2
items: ROS2与Navigation2入门教程-构建和安装Nav2
items: ROS2与Navigation2入门教程-移动机器人导航概念
items: ROS2与Navigation2入门教程-设置TF
items: ROS2与Navigation2入门教程-设置URDF
items: ROS2与Navigation2入门教程-设置里程计（Odometry）
items: ROS2与Navigation2入门教程-使用ROS2进行相机标定
items: ROS2与Navigation2入门教程-在ROS 2/Nav2中获取错误回溯信息

ROS2与Navigation2入门教程-目录
type: item
date: 2021-09-08T02:40:00+00:00
description: 目录： ROS2与Navigation2入门教程-Navigation 2概述 ROS2与Navigation2入门教程-开始使用Nav2 ROS2与Navigation2入门教程-构建和安装Nav2 ROS2与Navigation2入门教程-移动机器人导航概念 ROS2与Navigation2入门教程-设置TF ROS2与Navigation2入门教程-设置URDF ROS2与Navigation2入门教程-设置里程计（Odometry） ROS2与Navigation2入门教程-使用ROS2进行相机标定 ROS2与Navigation2入门教程-在ROS 2/Nav2中获取错误回溯信息 ROS2与Navigation2入门教程-使用Turtlebot3物理机器人进行导航 ROS2与Navigation2入门教程-使用SLAM制图的同时进行导航 ROS2与Navigation2入门教程-使用外部的STVL成本地图插件进行导航 ROS2与Navigation2入门教程-动态物体跟随 ROS2与Navigation2入门教程-使用禁区进行导航 ROS2与Navigation2入门教程-使用速度限制进行导航 ROS2与Navigation2入门教程-编写新的Costmap2D插件 ROS2与Navigation2入门教程-编写新的规划器（Planner）插件 ROS2与Navigation2入门教程-编写新的控制器（Controller）插件 ROS2与Navigation2入门教程-编写新的行为树（Behavior Tree）插件 ROS2与Navigation2入门教程-编写新的恢复器（Recovery）插件 ROS2与Navigation2入门教程-配置航点跟随者（Waypoint Follower） ROS2与Navigation2入门教程-配置行为树导航仪（Behavior-Tree Navigator） ROS2与Navigation2入门教程-配置行为树XML节点（Behavior Tree XML Nodes） ROS2与Navigation2入门教程-配置Costmap 2D ROS2与Navigation2入门教程-配置生命周期管理器（Lifecycle Manager） ROS2与Navigation2入门教程-配置规划器服务器（Planner Server） ROS2与Navigation2入门教程-配置NavFn规划器 ROS2与Navigation2入门教程-配置Smac规划器 ROS2与Navigation2入门教程-配置Theta*规划器（Theta Star Planner） ROS2与Navigation2入门教程-配置控制器服务器（Controller Server） ROS2与Navigation2入门教程-配置地图服务器/保存器（Map Server/Saver） ROS2与Navigation2入门教程-配置DWB控制器（DWB Controller） ROS2与Navigation2入门教程-配置AMCL ROS2与Navigation2入门教程-配置恢复器服务器（Recovery Server） ROS2与Navigation2入门教程-配置受管制纯追踪（Regulated Pure Pursuit）控制器 ROS2与Navigation2入门教程-行为树XMLs概述 ROS2与Navigation2入门教程-导航至某个位姿（Navigate To Pose）行为树 ROS2与Navigation2入门教程-通过多个位姿导航（Navigate Through Poses）行为树 ROS2与Navigation2入门教程-跟随动态点（Follow Dynamic Point）行为树 ROS2与Navigation2入门教程-导航插件（Navigation Plugins） ROS2与Navigation2入门教程-python3简单命令（Simple Commander）API 参考: https://navigation.ros.org/

ROS2与Navigation2入门教程-Navigation 2概述
type: item
date: 2021-10-26T03:11:00+00:00
description: 说明： 介绍Navigation 2 Navigation 2概述 Navigation 2（以下简称“Nav2”）项目是ROS导航（Navigation）软件堆栈的精神继任者。该项目旨在寻找一种安全的方式让移动机器人从A点移动到B点。Nav2也可以应用于其他涉及机器人导航的应用，例如跟踪动态点。为此，Nav2将会完成动态路径规划、计算电机速度、避开障碍物和结构恢复行为。要了解Nav2项目相关项目、使用Nav2的机器人、ROS 1对比、维护者等的更多信息，请参见其“关于和联系方式”网页。 Nav2使用行为树（BT，Behavior Trees）调用模块化服务器来完成一个动作。动作可以是计算路径、控制工作（control efforts）、恢复或任何其他与导航相关的动作。这些都是通过ROS动作服务器与行为树（BT）进行通信的独立节点。下图将让您对Nav2的结构有一个很好的初步了解。请注意：在每个控制器、规划器和恢复器服务器中可以有多个插件，并具有与之匹配的BT插件。这可以用来创建基于具体环境（上下文）的导航行为。若想查看Nav2项目与 ROS (1) Navigation之间的对比，请参阅“ROS到ROS 2 的导航（Navigation）”。 Nav2的预期输入是符合REP-105的TF坐标变换、使用静态成本地图图层的地图源、BT XML文件和任何相关的传感器数据源。这样Nav2就可以为完整性约束机器人或非完整性约束机器人的电机提供有效的速度指令以进行跟随。目前Nav2支持所有的主要机器人类型：完整性约束机器人、差分驱动机器人、腿式机器人和阿克曼（类汽车）机器人等基本类型！Nav2同时使用用于SE2碰撞检测的圆形和任意形状机器人为这些基本类型的机器人提供独特的支持。 Nav2具有下列工具： 加载、提供和存储地图的工具（地图服务器Map Server） 在地图上定位机器人的工具 (AMCL) 避开障碍物从A点移动到B点的路径规划工具（Nav2 Planner） 跟随路径过程中控制机器人的工具（Nav2 Controller） 将传感器数据转换为机器人世界中的成本地图表达的工具（Nav2 Costmap 2D） 使用行为树构建复杂机器人行为的工具（Nav2 行为树和BT Navigator） 发生故障时计算恢复行为的工具（Nav2 Recoveries） 跟随顺序航点的工具（Nav2 Waypoint Follower） 管理服务器生命周期的工具和看门狗(Nav2 Lifecycle Manager) 启用用户自定义算法和行为的插件（Nav2 Core） Nav2还提供了一组启动插件来帮助您进行机器人导航。NavFn使用A*或Dijkstra算法计算从一个位置到达目标位置的最短路径。DWB会使用DWA算法来计算跟踪路径的控制工作，并通过其自身的几个插件计算轨迹评分（critics）。恢复行为包括：等待、旋转、清除成本地图以及后退。有一组行为树（BT）插件用于调用这些服务器和计算条件。最后，还有一组用于与Nav2软件堆栈交互和控制生命周期的Rviz插件。可以在“导航插件（Navigation Plugins）”网页上找到用户报告的全部插件列表。 本Nav2系列教程包括如何安装Nav2、以Turtlebot 3（TB3）为示例机器人使用Nav2的方法、如何为其他机器人进行Nav2自定义、调整行为以获得更佳性能以及自定义内部结构以获得高级软件堆栈等内容。 相关视频 IROS 2020关于Nav2马拉松实验的演讲。查看视频： 这个视频是Turtlebot3（TB3）机器人在小型休息室中进行导航的示例。查看视频

ROS2与Navigation2入门教程-开始使用Nav2
type: item
date: 2021-10-26T03:12:00+00:00
description: 说明： 介绍如何完成Nav2二进制软件包的安装以及在Gazebo仿真软件中进行Turtelbot3仿真机器人导航等过程 安装Nav2 按照ROS官方文档的安装说明进行ROS 2二进制软件包安装。 使用Linux系统的软件包管理器安装Nav2软件包，命令为： sudo apt install ros-<ros2-distro>-navigation2 sudo apt install ros-<ros2-distro>-nav2-bringup 安装Turtlebot3软件包，命令为： sudo apt install ros-<ros2-distro>-turtlebot3* 运行示例 在Linux系统的GUI中打开一个终端。 设置关键环境变量，命令为： source /opt/ros/<ros2-distro>/setup.bash export TURTLEBOT3_MODEL=waffle export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/<ros2-distro>/share/turtlebot3_gazebo/models 如果是从源代码编译安装ROS 2的，或者ROS 2和Gazebo安装目录不是默认目录，则要改成相应的正确目录。 在该终端中运行以下命令： ros2 launch nav2_bringup tb3_simulation_launch.py 对于ROS 2 Dashing Diademata或者更早的发行版，请使用nav2_simulation_launch.py启动文件。但是，建议使用最新的ROS 2长期支持（LST）发行版（即Foxy）以获得更好的稳定性和功能完整性。 这个启动文件会在turtlebot3_world仿真世界中启动带有AMCL定位程序的Nav2软件包。同时还会启动机器人状态发布者节点以提供坐标变换、一个含有Turtlebot3 URDF模型的Gazebo实例和RVIZ。 如果一切正常，就可以看到RViz和Gazebo GUI，如下所示： 单击RViz左下角的“启动（Startup）”按钮。这会让Nav2更改为活动（Active）状态。这样RViz应该会改变外观以显示该地图 导航 启动后，机器人最初并不知道自己在哪里。默认情况下，Nav2会等待用户给出机器人的一个大致起始位置。查看机器人在Gazebo仿真世界中的位置，并在地图上找到该位置。通过单击RViz中的“2D位置估计（2D Pose Estimate）”按钮然后在地图中机器人估计的位置处单击来设置机器人的初始位置。可以通过从刚才单击的位置向前拖动来设置机器人起始的移动方向。 目前为止如果使用的都是默认值，则该机器人应大致如下图所示： 如果设置的机器人位置不完全正确，那也没关系。Nav2在导航时会对位置进行优化。如果愿意，也可以再次单击“2D Pose Estimate”按钮并重新尝试设置机器人的初始位置。 一旦设置好机器人初始位置后，就会完成坐标变换树，且Nav2会完全激活并准备就绪。现在应该可以看到机器人和点云（见下图）。 接下来，单击“导航目标（Navigaton2 Goal）”按钮并选择一个目的地。这会调用BT导航仪（navigator）通过动作服务器到达该目标位置。可以通过在RViz左下角显示的Navigation 2 rviz插件暂停（取消）或重置该动作。 现在就可以看到机器人在移动了（如下图所示）。 参考： https://navigation.ros.org/getting_started/index.html

ROS2与Navigation2入门教程-构建和安装Nav2
type: item
date: 2021-10-26T03:12:00+00:00
description: 说明： 介绍如何构建和安装Nav2 安装 Nav2软件包及其依赖包都发布了二进制文件。可以通过以下命令安装它以获得最新的稳定发行版： sudo apt install ros-<distro>-navigation2 ros-<distro>-nav2-bringup ros-<distro>-turtlebot3* 对于Ubuntu 20.04，请使用下面这个命令，因为其通配符的解析已更改： sudo apt install ros-<distro>-navigation2 ros-<distro>-nav2-bringup '~ros-<distro>-turtlebot3-.*' 构建 有3种构建Nav2的方式: 为特定的ROS 2发行版（例如eloquent、foxy）构建Nav2 使用快速启动安装脚本在主分支上构建Nav2 在主分支上手动构建Nav2。 为特定ROS 2发行版构建Nav2 安装ROS,请按照您所需发行版的常用构建说明安装ROS 2。 构建Nav2 首先要新建一个工作空间nav2_ws，将NAV2分支克隆到该工作空间中并进行构建。 可以使用rosdep工具获取ROS 2特定发行版中Nav2依赖包的二进制文件。 具体命令如下： mkdir -p ~/nav2_ws/src cd ~/nav2_ws/src git clone https://github.com/ros-planning/navigation2.git --branch <ros2-distro-branch> cd ~/nav2_ws rosdep install -y -r -q --from-paths src --ignore-src --rosdistro <ros2-distro> colcon build --symlink-install 需要将--branch后的<ros2-distro-branch>更改为所选的分支（例如 eloquent-devel、foxy-devel、galactic、humble） 需要将--rosdistro后的<ros2-distro>更改为所选的ROS 2发行版名称（例如 eloquent、foxy、galactic、humble）。 在主分支上快速启动构建Nav2 构建步骤 从ROS 2安装页面安装ROS 2的所有依赖包。 在执行以下步骤之前，请确保终端或.bashrc文件中没有设置ROS环境变量。 mkdir <directory_for_workspaces> cd <directory_for_workspaces> wget https://raw.githubusercontent.com/ros-planning/navigation2/main/tools/initial_ros_setup.sh chmod a+x initial_ros_setup.sh ./initial_ros_setup.sh 主分支上快速启动构建小结： 脚本initial_ros_setup.sh会下载三个ROS 工作空间，然后按照正确的顺序构建它们。 这三个工作空间分别是： ROS 2发行版：为最新的ROS 2发行版，由此处的存储库文件定义； ROS 2依赖包：为一组未包含在ROS 2发行版中的ROS 2软件包。但是需要这些软件包才能构建Nav2。还包括组成ROS 2发行版的一些软件包，因为Nav2要使用这些软件包的不同版本； Nav2：即本存储库。 下载所有工作空间后，运行navigation2/tools/build_all.sh脚本。 脚本build_all.sh使用colcon build --symlink-install命令按照上面列出的顺序构建每个存储库。 脚本initial_ros_setup.sh可以接受以下选项： --no-ros2：这会跳过下载和构建ROS 2发行版。相反，它会使用安装在/opt/ros/<ros2-distro>目录中的二进制软件包和setup.sh脚本； --download-only：这会跳过构建步骤。 在主分支上手动构建Nav2 构建ROS 2主分支 ！警告信息：在从源代码编译构建ROS2时，请确保ros2.repos文件来自主分支。 按照ROS 2文档中提供的构建说明对ROS 2主分支进行编译构建。 构建Nav2依赖项 由于不是为已发布的发行版构建Nav2，因此必须自己构建依赖包而不是使用这些依赖包的二进制文件。 首先，在ROS 2构建工作空间中对setup.bash 脚本文件进行source，命令为： source ~/ros2_ws/install/setup.bash 接着要从Nav2获取underlay.repos文件。 然后，使用vc…

ROS2与Navigation2入门教程-移动机器人导航概念
type: item
date: 2021-10-26T03:13:00+00:00
description: 说明： 介绍移动机器人导航的概念，了解和使用Nav2项目所需的概念 ROS 2 ROS2是用于Nav2的核心中间件。 如果您对ROS 2不熟悉，请在继续本教程之前先访问ROS 2文档。 动作服务器（Action Server） 就像在ROS中一样，动作服务器是控制导航等长时间运行任务的常用方式。Nav2软件堆栈更广泛地使用动作，并且在某些情况下会缺乏简单的话题接口。作为ROS 2的开发人员，了解动作服务器更为重要。一些简单的命令行界面CLI示例可以在ROS 2文档中找到。 动作服务器类似于规范的服务（service）服务器。客户端会请求完成某个任务，除非该任务可能需要很长时间。例如，将铲子从推土机向上移开或者让机器人向右移动10米就是这类任务的示例。 在这种情况下，动作服务器和客户端允许用户在另一个进程或线程中调用长时间运行的任务，并为其结果返回一个future变量。此时允许阻塞线程直到动作完成，但是，用户可能希望偶尔检查动作是否完成并继续在客户端线程中处理工作。由于是长时间运行的，动作服务器也会向其客户端提供反馈。这个反馈可以是任何事物，并且在ROS中使用具有请求和结果类型的.action文件定义。在推土机示例中，请求可能是一个角度，反馈可能是要移动的剩余角度，而结果则是以结束角度表示的成功或失败布尔值。在导航示例中，请求可能是一个位姿，反馈可能是已导航的时间和到达目标位姿的距离，而结果则是以成功或失败表示的布尔值。 通过向动作客户端注册回调函数，可以同步收集反馈和结果消息。也可以通过从共享的future对象异步请求信息来收集反馈和结果消息。两者都需要旋转（spinning）客户端节点来处理回调函数组。 在Nav2软件堆栈中使用动作服务器通过NavigateToPose动作消息与最高级别的行为树BT导航仪（Navigator）进行通信。它们还用于行为树BT导航仪与后续较小的动作服务器通信，以计算路径规划、控制工作和恢复。每个动作服务器都有自己独特的nav2_msgs格式的.action类型，用于与服务器进行交互。 生命周期节点和绑定（bond） 生命周期（或更准确地说是托管）节点是ROS 2独有的。更多相关信息可以在这里找到。它们是包含用于启动和关停（teardown） ROS 2服务器的状态机过渡状态的节点。这有助于确定ROS系统在启动和关闭时的行为。它还有助于用户以合理的方式构建他们的程序以用于商业用途和调试。 当一个节点启动时，它处于未配置（unconfigured）状态，只处理该节点的构造函数，不应包含任何ROS网络设置或参数读取。通过启动系统或提供的生命周期管理器，需要通过配置将这些节点转换过渡到非活动或非激活（inactive）状态。之后，可以通过过渡到激活阶段来激活节点。 激活状态允许节点处理信息并完全设置为运行。配置阶段触发的on_configure()方法会设置所有参数、ROS网络接口以及安全系统的所有动态内存分配。激活阶段触发的on_activate()方法会激活ROS网络接口并设置程序中的任何状态以开始处理信息。 为关闭这些节点，需要过渡到停用（deactivating）、清理、关闭并以最终状态结束。ROS网络接口分别在这些阶段被停用和停止处理、释放内存、干净地退出。 整个Nav2项目中广泛地使用生命周期节点框架，所有服务器都使用它。如果可能，所有ROS系统最好都使用生命周期节点。 Nav2中使用生命周期节点（LifecycleNodes）的封装器nav2_util LifecycleNode。该封装器为典型的应用程序封装了LifecycleNodes的大部分复杂性。该封装器还包括生命周期管理器的绑定（bond）连接，以确保在服务器过渡到激活状态后，它也保持激活状态。如果服务器崩溃，它会让生命周期管理器知道并关闭系统以防止发生严重故障。有关详细信息，请参阅“从Eloquent到Foxy”。 行为树（Behavior Trees） 行为树（BT）在复杂机器人任务中变得越来越普遍。它们是待完成任务的树形结构。行为树为定义多步或多状态应用程序创建了一个更具可扩展性和人类可理解性的框架。行为树与有限状态机（FSM） 相对，后者可能有几十个状态和数百个状态过渡。一个例子是踢足球机器人。将足球比赛的逻辑嵌入到FSM中将非常具有挑战性，并且容易出错，因为有许多可能的状态和规则。此外，诸如从左侧、右侧或中间射门之类的建模选择尤其不清晰。使用行为树则可以为许多行为创建和重用基本原语，如“踢（kick）”、“走（walk）”、“找球（go to ball）”等。更多相关信息可以在这本书中找到。强烈建议阅读该书的第1-3章以更好地理解术语和工作流程。这应该只会花费大约30分钟时间。 Nav2项目使用BehaviorTree …

ROS2与Navigation2入门教程-设置TF
type: item
date: 2021-10-26T03:13:00+00:00
description: 说明： 介绍ROS中的坐标变换，制作TF2静态发布者的简单命令行演示，以查看其运行情况 坐标变换简介 许多ROS软件包需要使用ROS软件包TF2发布机器人的坐标变换树。坐标变换树定义了不同坐标系之间的关系，包括平移、旋转和相对运动。为了更具体地说明这一点，下面以一个简单机器人为例，该机器人具有一个可移动底座，并在其顶部安装了一个激光传感器。 该机器人有两个定义好的坐标系：一个对应于机器人可移动底座的中心点，而另一个对应于安装在该底座顶部的激光器的中心点。可以将依附于可移动底座的坐标系称为base_link，而将依附于激光的坐标系称为base_laser。请注意，下一节将详细讨论这些坐标系的命名和约定。 此时，假设有一些来自激光器的数据，这些数据是来自激光器中心点的距离测量值。换句话说，在base_laser坐标系中有一些数据。 现在，假设想要获取这些数据并用它来帮助可移动底座避开机器人世界中的障碍物。为了成功做到这一点，需要一种方法将 base_laser坐标系中接收到的激光扫描数据变换到base_link坐标系。从本质上说，就是需要定义base_laser和base_link坐标系之间的关系。 在定义这种关系时，假设我们拥有的唯一数据就是激光器安装在可移动底座中心点前方10厘米和上方20厘米处。这为我们提供了对 base_link坐标系与base_laser坐标系进行关联的平移偏移量。具体来说，我们知道要将base_link坐标系中获取的数据变换到base_laser坐标系，必须应用(x: 0.1m, y: 0.0m, z: 0.2m)的平移量，反之，将base_laser坐标系中获取的数据变换到base_link坐标系，则必须应用相反的平移量，即（x：-0.1m，y：0.0m，z：-0.20m）。 可以选择让用户自己管理这种关系，这意味着在必要时存储和应用坐标系之间的适当变换，但是随着坐标系数量的增加，这会变得非常痛苦。幸运的是，我们可以不必自己做这项工作。相反地，可以使用TF2一次性定义base_link和base_laser坐标系之间的关系，并让TF2来管理这两个坐标系之间的坐标变换。这在处理非静态变换时特别有用，例如一组相对于彼此正在移动的坐标系，如在地图（map）坐标系中的机器人底座坐标系。 为了使用TF2定义和存储base_link和base_laser坐标系之间的关系，需要将它们添加到坐标变换树中。从概念上讲，变换树中的每个节点对应一个坐标系，每条边对应于从当前节点移至其子节点所需执行的坐标变换。TF2使用树结构来保证只需一次遍历即可将任何两个坐标系链接起来，并假设树中的所有边都是从父节点指向子节点的。 要为上面的简单示例创建一个坐标变换树，就会创建两个节点：一个用于base_link坐标系，一个用于base_laser坐标系。要在这两个节点之间创建边，首先需要决定哪个节点是父节点，哪个节点是子节点。请记住，这种区别很重要，因为TF2假设所有坐标变换都是从父节点到子节点的变换。 这里选择base_link坐标系作为父级坐标系，因为当其他部件/传感器添加到机器人上时，通过遍历base_link坐标系将它们与base_laser坐标系关联起来最有意义。这意味着与连接base_link和 base_laser的边相关联的坐标变换应该是 (x: 0.1m, y: 0.0m, z: 0.2m)。 设置好这个变换树后，将base_laser坐标系中接收到的激光扫描变换至base_link坐标系就如同调用TF2库一样简单。这样，机器人现在就可以使用这些变换树信息来对base_link坐标系中的激光扫描进行推理，并安全地规划路径绕过机器人环境中的障碍物。 静态坐标变换发布者节点运行演示 现在来尝试使用TF2提供的static_transform_publisher工具发布一个非常简单的坐标变换。 这里将会发布从链接base_link到链接base_laser的变换，平移量为 (x: 0.1m, y: 0.0m, z: 0.2m)。 请注意，这里会构建来自本教程前面图表中的坐标变换。 打开命令行窗口并执行以下命令： ros2 run tf2_ros static_transform_publisher 0.1 0 0.2 0 0 0 base_link base_laser 这样就成功地在TF2中发布了base_link到base_laser的坐标变换。 现在通过tf2_echo来检查它是否正常工作。 打开另一个单独的命令行窗口并执行以下命令： ros2 run tf2_ros tf2_echo base_link base_laser 这样就应该能够看到类似于下面的重复输出： At time 0.0 - Translation…

ROS2与Navigation2入门教程-设置URDF
type: item
date: 2021-10-26T03:14:00+00:00
description: 说明： 介绍如何使用URDF，为该机器人的URDF添加运动学属性 本教程中的完整源代码可以在navigation2_tutorials存储库中的sam_bot_description软件包下找到。 请注意，该存储库包含完成本指南中所有教程后的完整源代码。 URDF和机器人状态发布者（Robot State Publisher）软件包 正如上一教程中所述，Navigation2的要求之一就是从base_link坐标系到各种传感器坐标系和参考坐标系的坐标变换。这个坐标变换树的范围可以是一棵简单的树，从base_link到laser_link只有一个链接，也可以是由位于不同位置上的多个传感器组成的树，每个传感器都有其自己的坐标系。创建多个发布者节点来处理所有这些坐标系变换可能会变得乏味。因此可以使用Robot State Publisher软件包来发布这些坐标变换。 Robot State Publisher是一个ROS 2软件包，该软件包会与tf2软件包进行交互以发布所有必要的坐标变换，这些坐标变换可以直接从机器人的几何形状和结构中推导出来。需要为该软件包提供正确的URDF文件，这样就会自动处理这些坐标变换的发布。这对于复杂的坐标变换非常有用，但仍然建议使用更简单的坐标变换树。 URDF是一种表示机器人模型的XML文件。本教程中URDF主要用于构建与机器人几何体相关的坐标变换树，但URDF还有很多其他用途。一个示例就是URFD如何通过定义材质和网格等视觉组件，在RVIZ（一款用于ROS的3D可视化工具软件）中可视化机器人模型。另一个示例就是如何使用URDF来定义机器人的物理属性。然后将这些物理属性用于物理仿真程序（例如Gazebo），以仿真机器人如何在环境中进行交互。 URDF的另一个主要特性就是它还支持Xacro（XML宏），以帮助用户创建更短且可读的XML文件来帮助定义复杂机器人。可以使用这些宏来消除在URDF中重复一些XML块的需求。Xacro还可用于定义能在整个URDF中重复使用的配置常量。 设置环境 本指南假设您已经熟悉ROS 2以及如何设置您的开发环境，因此可以轻松地完成本节中的各个步骤。 首先来安装本教程中将会使用的一些其它ROS 2软件包。命令为： sudo apt install ros-<ros2-distro>-joint-state-publisher-gui sudo apt install ros-<ros2-distro>-xacro 接下来，为您的项目创建一个目录，初始化一个ROS2工作空间并为您的机器人命名。 对于我们的机器人，我们把它叫做sam_bot。 ros2 pkg create --build-type ament_cmake sam_bot_description 编写URDF 现在已经设置好了项目的工作空间，下面可以直接开始编写URDF。后面将要尝试构建的机器人其图像如下图所示： 首先在src/description目录创建一个名为sam_bot_description.urdf的文件，并输入以下内容作为该文件的初始内容： <?xml version="1.0"?> <robot name="sam_bot" xmlns:xacro="http://ros.org/wiki/xacro"> </robot> *注：下面的代码段应放在标签内。建议按照本教程中介绍的相同顺序添加它们。 这里还包含了一些行号，以让您大致了解在何处输入该代码。 这可能与您正在编写的实际文件不同，具体取决于您对空格的使用。 另请注意，行号假定您正在输入的代码与本指南中显示的代码相同。 接下来，使用XAcro属性定义一些将在整个URDF中重复使用的常量。 代码如下所示： <xacro:property name="base_width" value="0.31"/> <xacro:property name="base_length" value="0.42"/> <xacro:property name="base_height" value="0.18"/> <xacro:property name="wheel_radius" value="0.10"/> <xacro:property name="wheel_width" value="0.04"/> <xacro:property name="wheel_ygap" value="0.025"/> <xacro:property name="wheel_zoff" value="0.05"/> <xacro:property name="wheel_xoff" value="0.12"/> <xacro:property name="caster_xo…

ROS2与Navigation2入门教程-设置里程计（Odometry）
type: item
date: 2021-10-26T03:14:00+00:00
description: 说明： 本教程将会研究如何将机器人的里程计系统与Nav2集成 里程计简介 里程计系统基于机器人的运动提供对机器人位姿和速度的局部准确估计。里程计信息可以从各种来源获得，例如IMU、LIDAR、RADAR、VIO和车轮编码器等。需要注意的一件事情是，IMU会随时间漂移，而车轮编码器会随航行距离漂移，因此它们经常一起使用以抵消各自的负面特性。 坐标系odom及与之相关的坐标变换会使用机器人的里程计系统来发布连续的定位信息，但会随着时间或距离（取决于传感器模式和漂移）变得不那么准确。尽管如此，机器人仍然可以使用该信息在其附近进行导航（例如避免发生碰撞）。为了随时间推移仍获得一致准确的里程计信息，坐标系map会提供用于校正odom坐标系的全局准确信息。 正如在之前的指南和REP 105中所讨论的那样，odom坐标系通过 odom => base_link的坐标变换连接到系统的其余部分和Nav2。这个坐标变换由tf2软件包的广播者节点或者robot_localization等框架发布，这些框架还提供了其他功能。在后面的章节中将会更详细地讨论robot_localization框架。 除了要求的odom => base_link坐标变换之外，Nav2还要求发布nav_msgs/Odometry消息，因为这个消息提供了机器人的速度信息。 详细地说，nav_msgs/Odometry消息包含以下信息： # This represents estimates of position and velocity in free space. # The pose in this message should be specified in the coordinate frame given by header.frame_id # The twist in this message should be specified in the coordinate frame given by the child_frame_id # Includes the frame id of the pose parent. std_msgs/Header header # Frame id the pose is pointing at. The twist is in this coordinate frame. string child_frame_id # Estimated pose that is typically relative to a fixed world frame. geometry_msgs/PoseWithCovariance pose # Estimated linear and angular velocity relative to child_frame_id. geometry_msgs/TwistWithCovariance twist 这个消息会告知机器人的位姿和速度的估计值。header消息会提供给定坐标系中的带时间戳数据。pose消息会提供机器人相对于 header.frame_id中指定的坐标系的位置和方向。twist消息会给出相对于child_frame_id中定义的坐标系的线速度和角速度。 在您的机器人上设置里程计 为您的物理机器人设置Nav2的里程计系统很大程度上取决于机器人上可用的里程计传感器有哪些。归因于您的机器人可能需要大量的配置工作，具体的设置说明超出了本教程的范围。相反地，这里会提供一些基本示例和有用的资源来帮助您在机器人上配置Nav2。 首先会使用一个带有车轮编码器作为其里程计来源的机器人示例。请注意，Nav2并不需要车轮编码器，但它在大多数机器人装置中很常见。设置里程计的目标是计算里程计信息并在ROS 2上发布 nav_msgs/Odometry消息和odom => base_link坐标变换。要计算里程计信息，需要设置一些代码，这些代码会将车轮编码器信息转换为里程计信息. 这些代码类似于以下代码段： linear = (right_wheel_est_vel + left_wheel_est_vel) / 2 angular = (right_wheel_est_vel - left_wheel_est_vel) / wheel_separation; 其中right_wheel_est_vel和left_wheel_est_vel分别是右车轮和左车轮的估计速度，而wheel_separation是这两个车轮之间的距离。 right_wheel_est_vel和left_wheel_est_vel的值可以通过简单地获取车轮关节位置随时间的变化来获得。然后可以使用此信息来发布Nav2的要求。…

ROS2与Navigation2入门教程-使用ROS2进行相机标定
type: item
date: 2021-10-26T03:15:00+00:00
description: 说明： 介绍如何使用ROS2进行相机标定 概述 相机（摄像头）是一种非常精密的光学仪器，对外界环境的感知非常敏感。 由于摄像头内部和外部的一些原因，摄像头采集的图像常常会发生一定的畸变。 如果直接将采集到的图像拿来进行图像处理，会产生很大的问题。 为了避免图像数据源造成的误差，需要对摄像头的相关参数进行标定。 本教程将会说明如何标定单目（monocular）相机，从而获取单目相机的标定参数。 要求 使用操作系统的软件包管理器apt安装相机标定需要用到的以下软件包，命令如下： sudo apt install ros-<ros2-distro>-camera-calibration-parsers sudo apt install ros-<ros2-distro>-camera-info-manager sudo apt install ros-<ros2-distro>-launch-testing-ament-cmake 需要在您的工作空间中从源代码构建Image Pipeline软件包，命令如下： cd ~/dev_ws/src （根据您的工作空间更改成相应的目录） git clone https://github.com/ros-perception/image_pipeline.git cd image_pipeline git checkout ros2 cd ~/dev_ws colcon build --symlink-install --packages-select image_pipeline 如果您的工作空间中只有image_pipeline软件包，则可以不用--packages-select image_pipeline选项，即直接执行colcon build --symlink-install命令即可。 但如果您的工作空间有很多软件包，为节省时间和避免破坏已经构建好的软件包，则应该选择仅构建image_pipeline软件包。 实际上image_pipeline只是一个元软件包，真正起作用的是下面的这几个软件包：camera_calibration、depth_image_proc、image_proc、 image_publisher、image_rotate、image_view、stereo_image_proc。 如果在构建过程中出现错误，提示在您的系统上是否尚未构建camera_calibration、depth_image_proc、image_proc、 image_publisher、image_rotate、image_view、stereo_image_proc软件包，则需要先构建这些软件包. 命令为： colcon build --packages-select camera_calibration depth_image_proc image_proc image_publisher image_rotate image_view stereo_image_proc 构建好这些软件包后再运行colcon build --symlink-install --packages-select image_pipeline命令就可以成功构建该软件包了。 构建好image_pipeline软件包后，需要对该工作空间进行source。 为了避免每次打开终端时都需要设置环境，可以直接运行以下命令来一次性设置好运行环境： echo “source ~/dev_ws/install/setup.bash” >> .bashrc 此外，标定相机还需要依赖其它一些软件包，可以执行以下命令以确保安装了这些软件包： sudo apt install ros-foxy-vision-opencv ros-foxy-image-transport-plugins ros-foxy-image-transport ros-foxy-image-common sudo apt install python3-polled-camera polled-camera-tool libpolled-camera0d sudo apt install libtheora-dev libogg-dev libboost-python-dev sudo apt-get install -y libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev sudo apt-get install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev 如果您的机器上已经安装了这些软件包的最新版本，则会自动跳过，否则会安装这些软件包。 其它要求…

ROS2与Navigation2入门教程-在ROS 2/Nav2中获取错误回溯信息
type: item
date: 2021-10-26T03:15:00+00:00
description: 说明： 介绍如何获取ROS 2和Nav2错误回溯信息的一系列方法 概述 本教程将会说明获取ROS 2和Nav2错误回溯信息的一系列方法。 有很多方法可以实现ROS 2和Nav2错误回溯，但对于没有GDB经验的C++开发人员新手来说，这是一个很好的起点。 下面这些步骤会向ROS 2使用者说明在遇到问题时如何修改 Nav2软件堆栈以从特定服务器获取错误跟踪信息。本教程适用于仿真机器人和物理机器人。 本教程将会涵盖如何使用ros2 run命令从特定节点、使用ros2 launch命令从含有单个节点的启动文件以及更复杂的节点组合中获取错误回溯信息。 在本教程结束时，当遇到ROS 2中的服务器崩溃时，应该就有能力获取其错误回溯信息。 前提条件 GDB（GNU symbolic debugger）是Unix系统上最流行的C++调试器。它可用于确定崩溃的原因并跟踪线程。它还可用于在代码中添加断点（breakpoints）以检查软件中某个特定点在内存中的值。 对于所有使用C/C++的软件开发人员来说，使用GDB都是一项关键技能。许多IDE会内置某种调试器或分析器，但对于ROS，可供选择的IDE很少。 因此，很重要的一点就是要了解如何使用这些可用的原始调试工具，而不是依赖IDE来提供调试工具。 而且，了解这些调试工具是C/C++开发的一项基本技能，如果您更改开发人员的这个角色且不再有能力使用调试工具，或者正在通过ssh会话用远程调试工具进行动态开发，则将调试工具留给IDE可能会出问题。 幸运的是，在掌握了基础知识之后，使用GDB就相当简单了。第一步要将-g添加到要分析/调试的ROS软件包的编译器标志中。这个标志会构建GDB和valgrind（Linux内存调试工具）可以读取的调试符号，以告诉您该项目中失败的具体代码行及失败原因。如果没有设置这个标志，虽然仍可以获取错误回溯信息，但不会提供失败的代码行号。完成调试后请务必删除这个标志，因为在运行时它会降低性能。 将下面这一行代码添加到您项目的CMakeLists.txt文件中应该就可以做到这一点。 如果您的项目中已经有add_compile_options()代码行，则可以简单地向该代码行中添加-g标志即可。 然后简单地用这个软件包运行colcon build --packages-select <package-name>命令来重建您的工作空间。 添加了-g标志后编译可能需要比平时更长的时间。 add_compile_options(-g) 现在您已准备就绪可以调试代码了！如果这是一个非ROS项目，这时可能需要执行下面这条命令。启动一个GDB会话并告诉程序立即运行。一旦程序崩溃，就会返回一个由(gdb)表示的gdb会话提示符。可以在这个提示符下获取您感兴趣的信息。 但是，由于这是一个包含大量节点配置和其他任务的ROS项目，因此对于初学者或那些不喜欢大量命令行工作和了解文件系统的人来说，这并不是一个很好的选择。 gdb ex run --args /path/to/exe/program 下面几节将会描述使用基于ROS 2的系统可能会遇到的3种主要情形。请阅读最符合您所遇问题情形的一节。 从节点进行回溯 就像在刚才那个非ROS项目示例中一样，需要在启动ROS 2节点之前设置GDB会话。 虽然可以在具有ROS 2文件系统的一些知识的情况下通过命令行进行GDB会话设置，但还可以使用Open Robotics的好心人提供的--prefix启动选项。 选项--prefix会在ros2命令之前执行一些代码，允许插入一些信息。 如果尝试执行类似于“前提条件”一节中的示例命令gdb ex run --args ros2 run ，则会发现它找不到ros2命令。 甚至如果您更聪明而尝试对工作空间进行source，还是会发现因类似原因而失败。 实际上，不必回头去查找可执行文件的安装路径并全部重新输入，而是使用--prefix选项。这允许使用您习惯的同一条ros2 run命令，而不必担心GDB的一些细节。具体命令语法如下： ros2 run --prefix 'gdb -ex run --args' <pkg> <node> --all-other-launch arguments 和前面一样，这个前缀会启动一个GDB会话并运行您请求的带有所有附加命令行参数的节点。 现在系统应该会让您的节点运行，并且应该会与一些调试打印信息一起运行。 服务器崩溃，就会看到如下提示符。此时，就可以获取错误回溯信息了。 (gdb) 在这个会话中，键入backtrace命令，这样它就会为您提供一个错误回溯信息。 根据您的需要复制这些错误回溯信息。 下面是一个错误回溯信息的示例： (gdb) backtrace #0 __GI_raise …