爱折腾-创客智造实验室 - ROS与navigation教程
type: channel
link: https://www.ncnynl.com/category/ros-navigation
description: 通过ROS与navigation教程学习，了解如何为机器人整合navigation包，配置TF，实现导航，发布里程，增加传感器等
items: ROS与navigation教程-目录
items: ROS与navigation教程-设置机器人使用TF
items: ROS与navigation教程-基本导航调试指南
items: ROS与navigation教程-安装和配置导航包
items: ROS与navigation教程-结合RVIZ与导航包
items: ROS与navigation教程-发布里程计消息
items: ROS与navigation教程-发布传感器数据
items: ROS与navigation教程-编写自定义全局路径规划
items: ROS与navigation教程-stage仿真
items: ROS与navigation教程-示例-激光发布(C++)

ROS与navigation教程-目录
type: item
date: 2017-08-01T01:47:00+00:00
description: ROS与navigation教程-目录 说明： 介绍如何为机器人整合导航包，实现有效控制和自主导航等功能 目录： ROS与navigation教程-目录 ROS与navigation教程-设置机器人使用TF ROS与navigation教程-基本导航调试指南 ROS与navigation教程-安装和配置导航包 ROS与navigation教程-结合RVIZ与导航包 ROS与navigation教程-发布里程计消息 ROS与navigation教程-发布传感器数据 ROS与navigation教程-编写自定义全局路径规划 ROS与navigation教程-stage仿真 ROS与navigation教程-示例-激光发布(C++) ROS与navigation教程-示例-里程发布(C++) ROS与navigation教程-示例-点云发布(C++) ROS与navigation教程-示例-机器人TF设置(C++) ROS与navigation教程-示例-导航目标设置(C++) ROS与navigation教程-turtlebot-整合导航包简明指南 ROS与navigation教程-turtlebot-SLAM地图构建 ROS与navigation教程-turtlebot-现有地图的自主导航 参考: http://wiki.ros.org/navigation/Tutorials

ROS与navigation教程-设置机器人使用TF
type: item
date: 2017-08-01T01:48:00+00:00
description: ROS与navigation教程-设置机器人使用TF 说明： 介绍如何配置机器人让其使用TF 注意：本教程假设您已完成ROS教程和tf基础教程。 本教程的代码在robot_setup_tf_tutorial包中可用 步骤： (1)变换配置 许多ROS包需要使用tf软件库发布机器人的变换树。在抽象层，变换树根据不同坐标系之间的平移和旋转来定义偏移量。为了使这更具体，考虑一个简单的机器人的例子，它具有安装在其顶部的单个激光器的移动基座。在提及机器人时，我们定义两个坐标系：一个对应于机器人底座的中心点，一个坐标系安装在基座顶部的激光中心点。我们还给他们名字，以供参考。我们将调用附加到移动基础“base_link”的坐标系（对于导航，它重要的是将其放置在机器人的旋转中心），我们也会调用附加到激光“base_laser”的坐标系。有关框架命名约定，请参见REP 105 在这一点上，我们假设激光器的一些数据以与激光中心点的距离的形式来表达。换句话说，我们在“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）。 我们可以选择自己管理这种关系，这意味着在必要时存储和应用帧之间的适当变换，但随着坐标系的数量增加，这成为一个真正的痛苦。幸运的是，我们不用自己做这个工作。相反，我们将使用tf定义“base_link”和“base_laser”之间的关系，并让它管理两个坐标系之间的变换。 要使用tf定义和存储“base_link”和“base_laser”坐标系之间的关系，我们需要将它们添加到一个变换树中。在概念上，变换树中的每个节点对应于坐标系，每个方向对应于需要应用从当前节点移动到其子节点的变换。Tf使用树结构来确保只有一个遍历将任何两个坐标系连接在一起，并假设树中的所有方向都是从父节点引导到子节点。 要为我们的简单示例创建一个变换树，我们将创建两个节点，一个用于“base_link”坐标系，一个用于“base_laser”坐标系。为了创建它们之间的方向，我们首先需要决定哪个节点是父节点，哪些节点是子节点。记住，这种区别很重要，因为tf假定所有转换都从父对象移动到子对象。让我们选择“base_link”坐标系作为父节点，因为随着其他部分/传感器被添加到机器人，通过遍历“base_link”框架，它们将最有意义地与“base_laser”坐标系相关。这意味着连接“base_link”和“base_laser”的变换应为（x：0.1m，y：0.0m，z：0.2m）。使用这个变换树设置，将在“base_laser”坐标系中接收到的激光扫描转换为“base_link”坐标系就像调用tf库一样简单。我们的机器人可以使用这些信息来理解“base_link”框架中的激光扫描，并安全地计划避开环境中的障碍物。 (2)编写代码 希望上面的例子有助于在概念层面了解tf。现在，我们必须使用变换树并用代码创建它。在这个例子中，假设你已熟悉ROS，因此如果任何术语或概念不熟悉，请确保查看ROS文档。 假设我们有一个高级别的任务描述在“base_laser”坐标系中获取点并将其转换为“base_link”坐标系。我们需要做的第一件事是创建一个负责在系统中发布转换的节点。接下来，我们必须创建一个节点来监听通过ROS发布的变换数据，并应用它来转换一个点。我们将首先为源代码创建一个包，然后我们给它一个简单的名字，如“robot_setup_tf”我们将依赖于roscpp，tf和geometry_msgs。 $ cd %TOP_DIR_YOUR_CATKIN_WS%/src $ catkin_create_pkg robot_setup_tf roscpp tf geometry_msgs 请注意，您必须运行上面的命令（例如~/ros，您可能已为之前的教程创建）。 在fuerte，groovy和hydro中的替代方法：在navigation_tut…

ROS与navigation教程-基本导航调试指南
type: item
date: 2017-08-01T01:48:00+00:00
description: ROS与navigation教程-基本导航调整指南 说明： 介绍如何调整机器人上的ROS导航包 步骤： (1) 机器人导航需要那些准备? 在调整新机器人上的导航包时遇到的大部分问题都在本地规划器调谐参数之外的区域。机器人的里程计，定位，传感器以及有效运行导航的其他先决条件常常会出错。所以，我做的第一件事是确保机器人本身正在准备好导航。这包括三个组件检查：距离传感器，里程计和定位。 距离传感器 如果机器人没有从其距离传感器（例如激光器）获取信息，那么导航将不起作用。我将确保我可以在rviz中查看传感器信息，它看起来相对正确，并以预期的速度进入。 里程计 通常我会很难使机器人正确定位。它将不断迷失，我会花费大量的时间调试AMCL的参数，发现真正的罪魁祸首是机器人的测距。因此，我总是运行两个健全检查，以确保我相信机器人的里程计。 第一个测试检查角速度是否合理。我打开rviz，将坐标系设置为“odom”，显示机器人提供的激光扫描，将该主题的衰减时间设置为高（类似20秒），并执行原地旋转。然后，我看看扫描出来的边线在随后的旋转中如何相互匹配。理想情况下，每次扫描将刚好落在相互的顶端，会重叠在一起，但是有些旋转漂移是预期的，所以我只是确保扫描之间误差，不会超过一度或两度以上。 第二个测试检查线速度是否合理。机器人放置在与距离墙壁几米远地方，然后以上面相同的方式设置rviz。接着我将驱动机器人向墙壁前进，从rviz中聚合的激光扫描看看扫描出来边线的厚度。理想情况下，墙体应该看起来像一个扫描，但我只是确保它的厚度不超过几厘米。如果显示扫描边线的分散在半米以上，但有些可能是错误的测距。 其他的测试角速和线速方法： 线速标定：http://www.ncnynl.com/archives/201701/1217.html 角速标定：http://www.ncnynl.com/archives/201701/1218.html 线速标定：http://www.ncnynl.com/archives/201707/1812.html 角速标定：http://www.ncnynl.com/archives/201707/1813.html 定位 假设里程计和激光扫描仪都能合理地执行，建图和调整AMCL通常并不会太糟糕。首先，我将运行gmapping或karto，并操纵机器人来生成地图。然后，我将使用该地图与AMCL，并确保机器人保持定位。如果我运行的机器人的距离不是很好，我会用AMCL的测距模型参数玩一下。对整个系统的一个很好的测试是确保激光扫描和地图可以在rviz的“地图”坐标系中可视化，并且激光扫描与环境地图很好地匹配。 (2)代价地图 一旦我的机器人满足导航的先决条件，我想确保代价地图的设置和配置正确。 我会在如何配置ROS导航教程和costmap_2d文档详细说明，但是我会给出一些我经常做的事情的提示。 如下建议可用来调整代价地图： 确保根据传感器实际发布的速率为每个观测源设置expected_update_rate参数。我通常在这里给出相当的容忍度，把检查的期限提高到我期望的两倍，但是当传感器低于预期速率时，它很容易从导航中接收警告。 为系统适当设置transform_tolerance参数。查看使用tf从“base_link”坐标系到“map”坐标系的转换的预期延迟。我通常使用tf_monitor查看系统的延迟，并将参数保守地设置为关闭。另外，如果tf_monitor报告的延迟足够大，我可能会随时看看导致延迟的原因。这有时会导致我发现关于给定机器人的变换如何发布的问题。 在缺乏处理能力的机器人上，我会考虑关闭map_update_rate参数。然而，在这样做时，我考虑到这将导致传感器数据快速进入代价地图的延迟，这反过来会降低机器人对障碍物的反应速度。 该publish_frequency参数是在rviz可视化costmap有用。然而，特别是对于大型全局地图，该参数可能导致事情运行缓慢。在生产系统中，我考虑降低成本图发布的速度，当我需要可视化非常大的地图时，我确定设置速度真的很低。 是否对代价地图使用voxel_grid或costmap模型的决定在很大程度上取决于机器人具有的传感器套件。调整代价地图为基于3D-based代价地图更多是涉及未知空间的考虑。如果我正在使用的机器人只有一个平面激光，我总是使用costmap模型的地图。 有时，它只能在里程坐标系中运行导航。要做到这一点，我发现最容易做的事情就是我的复制local_costmap_params.yaml文件覆盖global_costmap_params.yaml文件并更改了地图宽度和高度比如10米。如果需要独立的定位性能来调整导航，这是一个简单易行的方法 我倾向于根据机器人的尺寸和处理能…

ROS与navigation教程-安装和配置导航包
type: item
date: 2017-08-01T01:49:00+00:00
description: ROS与navigation教程-安装和配置导航包 说明： 介绍如何在机器人整合导航包。包括使用TF发送变换，发布里程信息，发布传感器数据以及基本导航包配置。 (1)机器人配置： 机器人配置图 为使用导航包需要机器人以特定方式配置。上图显示了此配置的概述。白色组件是已实现的必需组件，灰色组件是已实现的可选组件，必须为每个机器人平台创建蓝色组件。以下部分提供了导航包的先决条件以及如何满足每个要求的说明。 ROS 导航堆栈假设机器人正在使用ROS。有关如何在机器人上安装ROS的说明，请参阅ROS文档。 变换配置（其他变换） 导航包要求机器人使用tf发布关于坐标系之间的关系的信息。有关设置此配置的详细教程，请参见：变换配置 传感器信息（传感器源） 导航包使用来自传感器的信息来避开地图上的障碍物，它假定这些传感器在ROS上发布 sensor_msgs/LaserScan 或 sensor_msgs/PointCloud消息。有关通过ROS发布这些消息的信息，请参阅“ROS发布传感器流”教程。此外，还有一些传感器已经有相关处理的ROS驱动程序。 支持的传感器及其相应驱动程序的链接如下所示： 符合SCIP2.2标准的Hokuyo激光设备以及Hokuyo型号04LX，30LX- urg_node SICK LMS2xx激光器 - sicktoolbox_wrapper 里程信息（里程计源） 导航包需要使用TF和nav_msgs/Odometry消息来发布里程信息。有关发布测距信息的教程可以在这里找到：在ROS上发布测距信息。 odometry支持的平台及其相应驱动程序的链接如下所示： Videre Erratic: erratic_player PR2: pr2_mechanism_controllers 基本控制器（基本控制器） 导航包假设它向机器人的“cmd_vel”话题，发送geometry_msgs/Twist类型的消息速度命令。这意味着必须有一个订阅“cmd_vel”话题的节点能够执行 (vx, vy, vtheta) <==> (cmd_vel.linear.x, cmd_vel.linear.y, cmd_vel.angular.z) 的速度并将其转换为电机命令以发送到移动基站。 支持的基础控制平台及其相应驱动程序的链接如下： Videre Erratic: erratic_player PR2: pr2_mechanism_controllers 建图（map_server） 导航包不需要地图操作，但为了本教程的目的，我们假设您有一个。有关创建您的环境地图的详细信息，请参阅构建地图教程。 (2)导航包设置 假定上述机器人设置的所有要求已经得到满足。这意味着机器人必须使用TF发布坐标系信息，接收所有能被导航包使用的传感器sensor_msgs/LaserScan或sensor_msgs/PointCloud的消息，并使用tf和nav_msgs/Odometry 发布里程消息，同时也发布速度命令到移动基座。如果您的机器人中没有满足这些要求，请参阅上面的“机器人配置”部分，了解完成它们的说明。 创建包 本教程的第一步是创建一个包，其中我们将存储导航包的所有配置和启动文件。此软件包将依赖于用于满足上述“机器人配置”部分以及包含导航包高级接口的move_base软件包的任何软件包。因此，创建命令为： catkin_create_pkg my_robot_name_2dnav move_base my_tf_configuration_dep my_odom_configuration_dep my_sensor_configuration_dep 此命令将创建一个具有必要依赖关系的包，以便在机器人上运行导航包。 创建机器人配置启动文件 现在我们有一个工作空间用于我们所有的配置和启动文件，我们将创建一个roslaunch文件，它将启动所有硬件和发布机器人需要TF变换。启动您最喜欢的编辑器，并将以下代码段粘贴到名为my_robot_configuration.launch的文件中。当然，您应该随意将文本“my_robot”替换为实际机器人的名称。我们还必须对启动文件进行类似的更改，如下所述，因此请确保您阅读本节的其余部分。 <launch> <node pkg="sensor_node_pkg" type="sensor_node_type" name="sensor_node_name" output="screen"> </node> <node pkg="odom_node_pkg" type="odom_node_type" name="odom_node" output="screen"> </node> <node pkg="…

ROS与navigation教程-结合RVIZ与导航包
type: item
date: 2017-08-01T01:49:00+00:00
description: ROS与navigation教程-结合RVIZ与导航包 说明： 介绍如何结合rviz来使用导航包，包括初始化位态，将目标发送给机器人以及查看导航包可视化信息 概观： rviz是一个强大的可视化工具，可以用于许多不同的目的。本教程至少对rviz进行了一些熟悉，可以在这里找到rviz文档。 设置rviz 以下视频显示如何设置rviz以使用导航包。这包括为amcl定位系统设置机器人的姿态，显示导航包提供的所有可视化信息，以及使用rviz将目标发送到导航包。navstack发布的每个可视化话题的讨论可以在下面找到。 截图： 视频：(此为youtbe视频，请翻墙查看) 2D导航目标/2D Nav Goal 话题：move_base_simple/goal 类型：geometry_msgs/PoseStamped 说明：允许用户设置机器人目标位姿，并发送到导航包。 2D姿势估计/2D Pose Estimate 话题：initialpose 类型： geometry_msgs/PoseWithCovarianceStamped 说明：允许用户设置机器人的初始化位姿。 静态地图/Static Map 话题：map 类型：nav_msgs/GetMap 类型：nav_msgs/OccupancyGrid 说明：显示由map_server提供的静态地图（如果存在） 粒子云/Particle Cloud 话题：particlecloud 类型：geometry_msgs/PoseArray 说明：显示机器人定位系统中使用的粒子云。粒子云的分布代表了定位系统对机器人姿态评估的不确定性。一个非常分散的粒子云层反映了很高的不确定性，而一个浓缩的粒子云代表着低的不确定性。换句话说越集中定位越准。 机器人本体/Robot Footprint 话题：local_costmap/robot_footprint 类型：geometry_msgs/PolygonStamped 说明：显示机器人的占用空间 障碍/Obstacles 话题：local_costmap/obstacles 类型：nav_msgs/GridCells 说明：显示导航包在其本地代价地图中看到的障碍。为了使机器人避免碰撞，机器人本体绝不应与包含障碍物的单元相交。 障碍膨胀区/Inflated Obstacles 话题：local_costmap/inflated_obstacles 类型：nav_msgs/GridCells 说明：在导航包的代价地图中显示由机器人与障碍区之间一个内切半径范围的空间。为了机器人避免碰撞，机器人的中心点不应与障碍膨胀区重叠。 未知空间/Unknown Space 话题：local_costmap/unknown_space 类型：nav_msgs/GridCells 说明：显示导航包的costmap_2d中包含的任何未知空间。 全局规划/Global Plan 话题：TrajectoryPlannerROS/global_plan 类型：nav_msgs/Path 说明：代价地图中显示达到目标的全局规划路径 本地规划/Local Plan 话题：TrajectoryPlannerROS/local_plan 类型：nav_msgs/Path 说明：代价地图中显示达到目标本地规划的路径。 规划器规划/Planner Plan 话题：NavfnROS/plan 类型：nav_msgs/Path 说明：显示由全局规划器计算出机器人的完整规划。 当前目标/Current Goal 话题：current_goal 类型：geometry_msgs/PoseStamped 说明：显示导航包尝试实现的目标位势

ROS与navigation教程-发布里程计消息
type: item
date: 2017-08-01T01:49:00+00:00
description: ROS与navigation教程-发布里程计消息 说明： 介绍导航包发布里程信息的示例。 它涵盖了通过ROS发布nav_msgs/Odometry消息，以及从“odom”坐标系到tf上的“base_link”坐标系的变换。 (1)发布里程信息 导航包使用TF来确定机器人在地图中的位置，并将传感器数据与静态地图相关联。然而，TF不提供关于机器人的速度的任何信息。因此，导航包要求任何里程源都通过ROS发布TF变换和nav_msgs/Odometry消息。本教程解释了nav_msgs/Odometry消息，并提供了用于发布消息并通过ROS和tf进行变换的示例代码。 (2)nav_msgs/Odometry消息 nav_msgs/Odometry消息存储了在自由空间中机器人的位置和速度的估计值： # This represents an estimate of a 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 Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist 该消息中的pose对应于机器人在坐标系中的估计位置以及用于该位态估计的确定性的可选协方差。该消息中的twist对应于机器人在子坐标系中的速度，通常是移动基站的坐标系，以及用于该速度估计的确定性的可选协方差。 (3)使用tf发布Odometry变换 如变换配置教程中所述，“TF”软件库负责管理与机器人相关的变换树的各坐标系之间的关系。因此，任何里程源都必须发布有关其管理的坐标系的信息。 (4)编写代码 在本节中，我们将编写一些用于通过ROS发布 nav_msgs/Odometry 消息的示例代码，并使用tf进行变换，这种变换只是在一个循环中驱动的仿真的机器人。我们首先将代码全部显示出来，下面是一个一个一个的解释。 将依赖关系添加到包的manifest.xml中 <depend package="tf"/> <depend package="nav_msgs"/> 示例代码： #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <nav_msgs/Odometry.h> int main(int argc, char** argv){ ros::init(argc, argv, "odometry_publisher"); ros::NodeHandle n; ros::Publisher odom_pub = n.advertise<nav_msgs::Odometry>("odom", 50); tf::TransformBroadcaster odom_broadcaster; double x = 0.0; double y = 0.0; double th = 0.0; double vx = 0.1; double vy = -0.1; double vth = 0.1; ros::Time current_time, last_time; current_time = ros::Time::now(); last_time = ros::Time::now(); ros::Rate r(1.0); while(n.ok()){ ros::spinOnce(); // check for incoming messages current_time = ros::Time::now(); //compute odometry in a typical way given the velocities of the robot double dt = (current_time - last_time).toSec(); double delta_x = (vx * cos(th) - vy * sin(th)) * dt; double delta_y = (vx * sin(th) + vy * cos(th)) * dt; double delta_th = vth * dt; x += delt…

ROS与navigation教程-发布传感器数据
type: item
date: 2017-08-01T01:50:00+00:00
description: ROS与navigation教程-发布传感器数据 说明： 介绍如何通过ROS发送两种类型的传感器数据， 分别是sensor_msgs/LaserScan消息和sensor_msgs/PointCloud消息。 发布传感器数据 通过ROS从传感器正确发布数据对于导航包安全运行非常重要。如果导航包没有收到来自机器人传感器的信息，那么它将被盲目地驾驶，并且很有可能会撞到东西。有许多传感器可为导航包提供信息：激光器，相机，声纳，红外线，碰撞传感器等。但是，当前的导航包只接受使用sensor_msgs/LaserScan消息类型或sensor_msgs/PointCloud消息类型。以下教程将提供两种类型消息的典型设置和使用示例。 ROS消息头 像其他类型消息一样， sensor_msgs/LaserScan和sensor_msgs/PointCloud消息包含TF坐标系和时间关联的消息。为了标准化此信息的发送方式， Header消息类型用作所有消息中的字段 Header类型中有三个字段如下所示。seq字段对应于标识符的消息由发布者发送时候自动增加。stamp字段存储与数据相关联的时间信息。以激光为例，stamp可能对应于扫描发生时的时间。frame_id字段存储与数据相关联的TF坐标系的消息。以激光为例，应该是设置为进行扫描的坐标系。 #Standard metadata for higher-level flow data types #sequence ID: consecutively increasing ID uint32 seq #Two-integer timestamp that is expressed as: # * stamp.secs: seconds (stamp_secs) since epoch # * stamp.nsecs: nanoseconds since stamp_secs # time-handling sugar is provided by the client library time stamp #Frame this data is associated with # 0: no frame # 1: global frame string frame_id 发布激光消息 LaserScan消息 对于具有激光扫描仪的机器人，ROS在sensor_msgs包提供特殊的消息类型，叫LaserScan，用于保存有关扫描的信息。主要从扫描仪返回的数据可以格式化成这种消息类型，就可以使代码更容易处理。在谈论如何生成和发布这些消息之前，让我们来看看消息规范： # # Laser scans angles are measured counter clockwise, with 0 facing forward # (along the x-axis) of the device frame # Header header float32 angle_min # start angle of the scan [rad] float32 angle_max # end angle of the scan [rad] float32 angle_increment # angular distance between measurements [rad] float32 time_increment # time between measurements [seconds] float32 scan_time # time between scans [seconds] float32 range_min # minimum range value [m] float32 range_max # maximum range value [m] float32[] ranges # range data [m] (Note: values < range_min or > range_max should be discarded) float32[] intensities # intensity data [device-specific units] 上面的注释就能明白字段表达的意思，为了更直观认识，写一个简单的激光扫描发布器来进行演示。 编写代码发布激光/LaserScan消息 通过ROS发布LaserScan消息是相当简单的。我们将首先提供下面的示例代码，然后逐行解释代码。 #include <ros/ros.h> #include <sensor_msgs/LaserScan.h> int main(int argc, char** argv){ ros::init(argc, argv…

ROS与navigation教程-编写自定义全局路径规划
type: item
date: 2017-08-08T02:10:00+00:00
description: ROS与navigation教程-编写自定义全局路径规划 说明： 介绍在ROS中编写和使用全局路径规划器的步骤，提供从编写路径计划程序类开始直到将其部署为插件的所有步骤。 简介： 首先要知道的是，为了向ROS添加一个新的全局路径规划器，新的路径规划器必须遵守nav_core包中定义的nav_core::BaseGlobalPlanner C ++接口。一旦编写了全局路径规划器，它必须作为插件添加到ROS中，以便它可以被move_base包使用。 我将使用Turtlebot作为机器人的一个例子来部署新的路径规划器。有关如何将真正的GA规划程序集成为ROS插件的教程，参考在ROS中添加遗传算法全局路径规划器作为插件。此链接中还提供了视频教程 (1)编写路径规划类 Class Header/类头文件 第一步是为遵循nav_core::BaseGlobalPlanner的路径规划器编写一个新类。在carrot_planner.h中可以找到一个类似的例子作为参考。为此，您需要创建一个将在本例中调用的global_planner.h头文件。我将介绍添加插件的最小代码，这是添加任何全局规划程序的必要和常见步骤。 最小头文件global_planner.h定义如下： /** include the libraries you need in your planner here */ /** for global path planner interface */ #include <ros/ros.h> #include <costmap_2d/costmap_2d_ros.h> #include <costmap_2d/costmap_2d.h> #include <nav_core/base_global_planner.h> #include <geometry_msgs/PoseStamped.h> #include <angles/angles.h> #include <base_local_planner/world_model.h> #include <base_local_planner/costmap_model.h> using std::string; #ifndef GLOBAL_PLANNER_CPP #define GLOBAL_PLANNER_CPP namespace global_planner { class GlobalPlanner : public nav_core::BaseGlobalPlanner { public: GlobalPlanner(); GlobalPlanner(std::string name, costmap_2d::Costmap2DROS* costmap_ros); /** overridden classes from interface nav_core::BaseGlobalPlanner **/ void initialize(std::string name, costmap_2d::Costmap2DROS* costmap_ros); bool makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal, std::vector<geometry_msgs::PoseStamped>& plan ); }; }; #endif 解释头文件的不同部分 #include <ros/ros.h> #include <costmap_2d/costmap_2d_ros.h> #include <costmap_2d/costmap_2d.h> #include <nav_core/base_global_planner.h> #include <geometry_msgs/PoseStamped.h> #include <angles/angles.h> #include <base_local_planner/world_model.h> #include <base_local_planner/costmap_model.h> 需要包含路径规划器所需的核心ROS库。路径规划器需要使用<costmap_2d/costmap_2d_ros.h>和<costmap_2d/costmap_2d.h>, 而costmap_2d::Costmap2D类作为输入的地图类。当定义为插件时，路径规划器类将自动访问此地图。没有必要订阅costmap2d来获取ROS的代价地图。<nav_core/base_global_planner.h> 用于导入接口nav_co…

ROS与navigation教程-stage仿真
type: item
date: 2017-08-08T02:11:00+00:00
description: ROS与navigation教程-stage仿真 说明： 介绍如何在stage仿真器下使用navigation包 代码： https://github.com/ros-planning/navigation_tutorials 简介： 这个代码包含launch文件，用于在stage中运行navigation包 launch/move_base_amcl_10cm.launch: 在分辨率为10CM的地图运行导航包并带有amcl launch/move_base_amcl_5cm.launch: 在分辨率为5CM的地图运行导航包并带有amcl launch/move_base_amcl_2.5cm.launch: 在分辨率为2.5CM的地图运行导航包并带有amcl launch/move_base_fake_localization_10cm.launch:在分辨率为10CM的地图运行导航包并带有fake_localization launch/move_base_fake_localization_5cm.launch:在分辨率为5CM的地图运行导航包并带有fake_localization launch/move_base_fake_localization_2.5cm.launch: 在分辨率为10CM的地图运行导航包并带有fake_localization launch/move_base_multi_robot.launch: 运行导航包并带有多个机器人 launch/move_base_gmapping_5cm.launch: 在分辨率为5CM的地图运行导航包并带有gmapping 参考： http://wiki.ros.org/navigation_stage

ROS与navigation教程-示例-激光发布(C++)
type: item
date: 2017-08-08T02:11:00+00:00
description: ROS与navigation教程-示例-激光发布(C++) 说明： 介绍如何实际编程发布激光数据 代码： 参考github仓库 安装： 新建目录 $ mkdir -p ~/catkin_ws/src 下载并编译 $ cd ~/catkin_ws/src $ git clone https://github.com/ros-planning/navigation_tutorials $ cd .. $ catkin_make 测试 新终端，执行roscore $ roscore 新终端，执行 $ rosrun laser_scan_publisher_tutorial laser_scan_publisher