• 本教程来自:Nav2中文网
  • Nav2交流社区:https://fishros.org.cn/forum
  • ROS2/Nav2千人交流群:(QQ)139707339
  • 更多精彩教程请关注微信公众号:鱼香ROS
  • 欢迎添加机器人小伊微信,解锁机器人学习特殊服务

编写新的规划器插件

概述

本教程展示了如何创建自己的规划器插件。 [校准@混沌无形]

必要条件

教程步骤

1创建新规划器插件

我们将创建一条简单的直线规划器。本教程中的注释代码可以在 navigation_tutorials 库中找到,因为 nav2_straightline_planner 这个包可以被认为是编写规划器插件的参考。 [校准@混沌无形]

我们的示例插件继承自基类 “nav2_core::GlobalPlanner”。基类提供5种纯虚拟方法来实现规划器插件。该插件将被规划器服务器用来计算轨迹。让我们进一步了解编写规划器插件所需的方法。 [校准@混沌无形]

Virtual method 方法描述 必须重写?
configure() 当规划器服务器进入on_configure状态时,该方法被调用。理想情况下,这个方法应该执行ROS参数的声明和规划器成员变量的初始化。该方法4个输入参数: 指向父节点的共享指针,规划器名称,tf缓冲区指针和指向成本地图的共享指针。 [校准@混沌无形] 是 [校准@小鱼]
activate() [待校准@2110] 当规划器服务器进入on_activate状态时,方法被调用。理想情况下,这个方法应该在规划器进入激活状态之前实现必要的操作。 [校准@混沌无形] 是 [校准@小鱼]
deactivate() 当规划器服务器进入on_deactivate状态时,方法被调用。理想情况下,这个方法应该实现规划器进入非活动状态前的必要操作。 [校准@混沌无形] 是 [校准@小鱼]
cleanup() 当规划器服务器进入on_cleanup状态时,方法被调用。理想情况下,这个方法应该清理为规划器创建的资源。 [校准@混沌无形] 是 [校准@小鱼]
createPlan() 当规划器服务器要求为指定的起始和目标姿势提供全局规划时,该方法被调用。该方法返回携带全局规划的 “nav_msgs::msg:: path”。这个方法需要两个输入参数:起始位姿和目标位姿。 [校准@混沌无形] 是 [校准@小鱼]

对于本教程,我们将使用方法 StraightLine::configure()StraightLine::createPlan() 创建直线规划器。 [待校准@2159]

在规划器中, configure() 方法必须从ROS参数和任何需要的初始化中设置成员变量。 [校准@混沌无形]

node_ = parent;
tf_ = tf;
name_ = name;
costmap_ = costmap_ros->getCostmap();
global_frame_ = costmap_ros->getGlobalFrameID();// Parameter initialization
nav2_util::declare_parameter_if_not_declared(node_, name_ + ".interpolation_resolution", rclcpp::ParameterValue(0.1));
node_->get_parameter(name_ + ".interpolation_resolution", interpolation_resolution_);

这里, name_ + ".interpolation_resolution" 获取ROS参数 interpolation_resolution,这是我们规划器所持有的。Navigation2 允许加载多个插件,为了保持组织性,每个插件都被映射到一些ID/名称。现在如果我们想检索特定插件的参数,我们使用 <mapped_name_of_plugin>.<name_of_parameter> ,如上面的片段。例如,示例规划器映射名称 “GridBased” 并检索 interpolation_resolution 参数,这是特定于"GridBased" 的,我们使用 Gridbased.interpolation_resolution 。换句话说, GridBased 作为命名空间插件特定参数。当我们讨论参数文件 (或params文件) 时,我们将看到更多有关此的信息。 [校准@小鱼]

createPlan() 法中,我们需要创建一条从给定的开始到目标位姿的路径。 [](http://dev.nav2.fishros.com/doc/plugin_tutorials/docs/writing_new_nav2planner_plugin.html#id1)StraightLine::createPlan()使用起始姿势和目标姿势来求解全局路径规划问题。成功后,它将路径转换为 “nav_msgs::msg:: path” 并返回到规划器服务器。下面的注释展示了此方法的实现。 [校准@混沌无形]

nav_msgs::msg::Path global_path;// Checking if the goal and start state is in the global frame
if (start.header.frame_id != global_frame_) {RCLCPP_ERROR(node_->get_logger(), "Planner will only except start position from %s frame",global_frame_.c_str());return global_path;
}if (goal.header.frame_id != global_frame_) {RCLCPP_INFO(node_->get_logger(), "Planner will only except goal position from %s frame",global_frame_.c_str());return global_path;
}global_path.poses.clear();
global_path.header.stamp = node_->now();
global_path.header.frame_id = global_frame_;
// calculating the number of loops for current value of interpolation_resolution_
int total_number_of_loop = std::hypot(goal.pose.position.x - start.pose.position.x,goal.pose.position.y - start.pose.position.y) /interpolation_resolution_;
double x_increment = (goal.pose.position.x - start.pose.position.x) / total_number_of_loop;
double y_increment = (goal.pose.position.y - start.pose.position.y) / total_number_of_loop;for (int i = 0; i < total_number_of_loop; ++i) {geometry_msgs::msg::PoseStamped pose;pose.pose.position.x = start.pose.position.x + x_increment * i;pose.pose.position.y = start.pose.position.y + y_increment * i;pose.pose.position.z = 0.0;pose.pose.orientation.x = 0.0;pose.pose.orientation.y = 0.0;pose.pose.orientation.z = 0.0;pose.pose.orientation.w = 1.0;pose.header.stamp = node_->now();pose.header.frame_id = global_frame_;global_path.poses.push_back(pose);
}global_path.poses.push_back(goal);return global_path;

其余的方法没有被使用,但必须覆盖它们。按照规定,我们覆盖了所有的方法,但把它们留成空白。 [校准@混沌无形]

2-导出planner插件

既然我们已经创建了我们的自定义规划器,我们需要导出我们的规划器插件,以便它对规划器服务器可见。插件在运行时加载,如果它们不可见,那么我们的规划器服务器将无法加载它。在ROS 2中,导出和加载插件由 pluginlib 处理。 [校准@混沌无形]

在我们的教程里, nav2_straightline_planner::StraightLine 类被动态加载为 nav2_core::GlobalPlanner [校准@混沌无形]

  1. 为了导出规划器,我们需要提供两行信息 [校准@混沌无形]
#include "pluginlib/class_list_macros.hpp"
PLUGINLIB_EXPORT_CLASS(nav2_straightline_planner::StraightLine, nav2_core::GlobalPlanner)

请注意,它需要pluginlib导出插件的类。Pluginlib将提供作为宏的 PLUGINLIB_EXPORT_CLASS ,它负责所有的导出工作。 [待校准@2167]

把这些行内容放在文件的末尾是很好的做法,但从技术上讲,你也可以写在顶部。 [校准@混沌无形]

  1. 下一步将是在软件包的根目录下创建插件的描述文件。例如,我们的教程包中的 global_planner_plugin.xml 文件。此文件包含以下信息 [校准@混沌无形]
  • 参数library path:插件的库名和它的位置。 [待校准@2134]
  • 参数class name:类的名称。 [校准@混沌无形]
  • 参数class type:类的类型 [待校准@2136]
  • 参数base class:基类的名称。 [待校准@2137]
  • 参数description:插件的描述。 [待校准@2138]
<library path="nav2_straightline_planner_plugin"><class name="nav2_straightline_planner/StraightLine" type="nav2_straightline_planner::StraightLine" base_class_type="nav2_core::GlobalPlanner"><description>This is an example plugin which produces straight path.</description></class>
</library>
  1. 下一步是使用cmake函数pluginlib_export_plugin_description_file()导出插件``CMakeLists.txt。此函数将插件描述文件安装到 share` 目录,并设置属性索引以使其可被发现。 [校准@混沌无形]
pluginlib_export_plugin_description_file(nav2_core global_planner_plugin.xml)
  1. 插件描述文件也应添加到 package.xml [待校准@2171]
<export><build_type>ament_cmake</build_type><nav2_core plugin="${prefix}/global_planner_plugin.xml" />
</export>
  1. 编译并注册。接下来,我们将使用这个插件。 [待校准@2172]

3-通过params文件传递插件名称

要启用插件,我们需要将 nav2_params.yaml 文件修改为以下内容,以替换以下参数 [待校准@2174]

注解: 用Galactic或后, plugin_namesplugin_types 替换单个 plugins string载体插件名称。类型现在定义在 plugin_name 命名空间 ‘‘plugin: field (e.g. 插件: MyPlugin: Plugin’’)。内联注释代码块将帮助您通过这个。 [待校准@2091]

planner_server:
ros__parameters:planner_plugin_types: ["nav2_navfn_planner/NavfnPlanner"] # For Eloquent and earlierplanner_plugin_ids: ["GridBased"] # For Eloquent and earlierplugins: ["GridBased"] # For Foxy and lateruse_sim_time: TrueGridBased:plugin: nav2_navfn_planner/NavfnPlanner # For Foxy and latertolerance: 2.0use_astar: falseallow_unknown: true

与 [待校准@2175]

planner_server:
ros__parameters:planner_plugin_types: ["nav2_straightline_planner/StraightLine"] # For Eloquent and earlierplanner_plugin_ids: ["GridBased"] # For Eloquent and earlierplugins: ["GridBased"] # For Foxy and lateruse_sim_time: TrueGridBased:plugin: nav2_straightline_planner/StraightLine # For Foxy and laterinterpolation_resolution: 0.1

在上面的片段中,你可以观察到我们的nav2_straightline_planner/StraightLine规划器与它的id GridBased``的映射。为了传递插件特定的参数,我们使用了 ``<plugin_id>.<plugin_specific_parameter> 。 [校准@混沌无形]

4-运行直线插件

运行Turtlebot3模拟器,启用navigation 2。如何制作它的详细说明写在 入门 。下面是该命令的快捷方式: [校准@混沌无形]

$ ros2 launch nav2_bringup tb3_simulation_launch.py params_file:=/path/to/your_params_file.yaml

然后转到RViz,点击顶部的 “2D Pose Estimate” 按钮,在地图上指出位置,就像 入门 中描述的那样。机器人将在地图上定位,然后点击 “Navigation2 goal” ,点击你想让你的规划器考虑目标位姿。之后,规划器将规划路径,机器人将开始向目标移动。 [校准@混沌无形]

【Nav2中文网】六、插件教程(二)编写新的规划器插件相关推荐

  1. 我的世界服务器修改原版血量,我的世界服务器MythicMobs插件教程技能编写血量限制与触发几率...

    小编为大家带来了<我的世界>服务器MythicMobs插件教程技能编写血量限制与触发几率,由于这两个太简单了,又都是用来控制[触发器]的,所以就放在一起讲了. 1)血量限制 故名思议,就是 ...

  2. eclipse 插件教程_编写Eclipse插件教程–第1部分

    eclipse 插件教程 Eclipse是三个最受欢迎的Java开发IDE之一. 其成功的原因之一是其可扩展性. 对于任何知道该怎么做并且已经做到的人来说,编写eclipse插件都可以非常轻松快捷. ...

  3. SolidEdge C#.NET 二次开发系列教程(二) AdvancedInstaller打包安装SolidEdge addin插件

    建议看本教程前先看下 SolidEdge二次开发(一)安装部署插件 这里主要介绍添加注册表的部分,不介绍AdvancedInstaller的具体使用 下保存下面注册表的信息为xxx.reg格式到桌面. ...

  4. html微信播放器,原生js 编写的微信播放器插件(仿微信公众号播放器组件)

    Document content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initia ...

  5. html中左侧播放器插件,简洁实用的html5音乐播放器插件

    js代码 window.onload = function(){ MC.music({ hasAjax:false, left:'50%', bottom:'50%', musicChanged:fu ...

  6. 【Nav2中文网】八、调整指南

    本教程来自:Nav2中文网 Nav2交流社区:https://fishros.org.cn/forum ROS2/Nav2千人交流群:(QQ)139707339 更多精彩教程请关注微信公众号:鱼香RO ...

  7. 【Nav2中文网】四、首次机器人安装指南(六)设置导航插件

    本教程来自:Nav2中文网 Nav2交流社区:https://fishros.org.cn/forum ROS2/Nav2千人交流群:(QQ)139707339 更多精彩教程请关注微信公众号:鱼香RO ...

  8. Htc Vive VR 手势识别插件教程 1.1 版本(附1.0版本教程PDF)

    VR手势识别插件教程1.1.1版本 VR手势识别插件教程1.1.1版本内容提纲 Htc Vive VR手势识别插件教程1.1.1版本.................................. ...

  9. via浏览器如何使用插件 Via浏览器添加使用插件教程

    1.尽管Via浏览器的体积小巧,但其中提供的功能可谓是五脏俱全,而想要体验更多服务的话,就需要去安装插件了,这需要大家点击右上角的横杠选项,并且从列表里选择"设置"功能. via浏 ...

最新文章

  1. WAIC剪影:AI的未来,关乎星辰大海
  2. [读者调查]新增一个读者调查!
  3. 在save中重写 AdminModel 方法 和 Signals
  4. KNN之约会网站测试
  5. 从企业角度看:网站设计的关键是了解与沟通
  6. 微信支付.商家转账到零钱案例
  7. win7\win10加域的电脑不输入密码直接登录登录电脑桌面
  8. 相似度计算之Jaccard系数
  9. 使用HttpClient下载图片常用代码,以及下载失败原因
  10. scada系统集成_设计 SCADA 应用程序软件
  11. linux基础——sed
  12. 3分钟用C语言教你写个‘浪漫烟花‘---特别漂亮
  13. Shell语言基本操作一(Xshell5)
  14. 【面试系列】手把手教你如何面试,你要的我都有(简历篇)
  15. 服务器cpu能修复吗,有关服务器cpu使用100%常见的解决方法
  16. VMware蓝屏问题解决方法
  17. ubuntu18.04 NFS挂载远程服务器
  18. Flutter插件(Plugin)开发 - Android视角,flutter安装视频
  19. 利open×××自带的http-proxy突破防火墙的封锁
  20. oracle左外连接语法,Oracle 左外连接、右外连接、全外连接小总结

热门文章

  1. Variable变量
  2. 【vue】滚动条自动滚动到底部
  3. 微信卡券JSAPI签名校验算法
  4. 环状序列(Circular Sequence,ACM/ICPC Seoul 2004,UVa1584)
  5. 切图?切图!——切图仔htmlcss秃头指南
  6. Mathtype-如何批量修改公式的字号
  7. 全网最全的微服务链路追踪实践-SkyWalking(看这一篇就够了)
  8. RStudio无法成功下载stringi包
  9. 使用VIRTUALLAB FUSION和ANSYS OPTISLANG进行跨平台光学建模和设计
  10. 标志寄存器(FLAGS,PSW,FR)简介