【Nav2中文网】六、插件教程(二)编写新的规划器插件
- 本教程来自:Nav2中文网
- Nav2交流社区:https://fishros.org.cn/forum
- ROS2/Nav2千人交流群:(QQ)139707339
- 更多精彩教程请关注微信公众号:鱼香ROS
- 欢迎添加机器人小伊微信,解锁机器人学习特殊服务
编写新的规划器插件
概述
必要条件
教程步骤
1创建新规划器插件
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_);
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插件
在我们的教程里, nav2_straightline_planner::StraightLine
类被动态加载为 nav2_core::GlobalPlanner
[校准@混沌无形]
#include "pluginlib/class_list_macros.hpp"
PLUGINLIB_EXPORT_CLASS(nav2_straightline_planner::StraightLine, nav2_core::GlobalPlanner)
请注意,它需要pluginlib导出插件的类。Pluginlib将提供作为宏的 PLUGINLIB_EXPORT_CLASS
,它负责所有的导出工作。 [待校准@2167]
把这些行内容放在文件的末尾是很好的做法,但从技术上讲,你也可以写在顶部。 [校准@混沌无形]
- 参数
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>
- 下一步是使用cmake函数
pluginlib_export_plugin_description_file()
导出插件``CMakeLists.txt。此函数将插件描述文件安装到
share` 目录,并设置属性索引以使其可被发现。 [校准@混沌无形]
pluginlib_export_plugin_description_file(nav2_core global_planner_plugin.xml)
- 插件描述文件也应添加到
package.xml
[待校准@2171]
<export><build_type>ament_cmake</build_type><nav2_core plugin="${prefix}/global_planner_plugin.xml" />
</export>
- 编译并注册。接下来,我们将使用这个插件。 [待校准@2172]
3-通过params文件传递插件名称
要启用插件,我们需要将 nav2_params.yaml
文件修改为以下内容,以替换以下参数 [待校准@2174]
注解: 用Galactic或后,
plugin_names
和plugin_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
【Nav2中文网】六、插件教程(二)编写新的规划器插件相关推荐
- 我的世界服务器修改原版血量,我的世界服务器MythicMobs插件教程技能编写血量限制与触发几率...
小编为大家带来了<我的世界>服务器MythicMobs插件教程技能编写血量限制与触发几率,由于这两个太简单了,又都是用来控制[触发器]的,所以就放在一起讲了. 1)血量限制 故名思议,就是 ...
- eclipse 插件教程_编写Eclipse插件教程–第1部分
eclipse 插件教程 Eclipse是三个最受欢迎的Java开发IDE之一. 其成功的原因之一是其可扩展性. 对于任何知道该怎么做并且已经做到的人来说,编写eclipse插件都可以非常轻松快捷. ...
- SolidEdge C#.NET 二次开发系列教程(二) AdvancedInstaller打包安装SolidEdge addin插件
建议看本教程前先看下 SolidEdge二次开发(一)安装部署插件 这里主要介绍添加注册表的部分,不介绍AdvancedInstaller的具体使用 下保存下面注册表的信息为xxx.reg格式到桌面. ...
- html微信播放器,原生js 编写的微信播放器插件(仿微信公众号播放器组件)
Document content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initia ...
- html中左侧播放器插件,简洁实用的html5音乐播放器插件
js代码 window.onload = function(){ MC.music({ hasAjax:false, left:'50%', bottom:'50%', musicChanged:fu ...
- 【Nav2中文网】八、调整指南
本教程来自:Nav2中文网 Nav2交流社区:https://fishros.org.cn/forum ROS2/Nav2千人交流群:(QQ)139707339 更多精彩教程请关注微信公众号:鱼香RO ...
- 【Nav2中文网】四、首次机器人安装指南(六)设置导航插件
本教程来自:Nav2中文网 Nav2交流社区:https://fishros.org.cn/forum ROS2/Nav2千人交流群:(QQ)139707339 更多精彩教程请关注微信公众号:鱼香RO ...
- Htc Vive VR 手势识别插件教程 1.1 版本(附1.0版本教程PDF)
VR手势识别插件教程1.1.1版本 VR手势识别插件教程1.1.1版本内容提纲 Htc Vive VR手势识别插件教程1.1.1版本.................................. ...
- via浏览器如何使用插件 Via浏览器添加使用插件教程
1.尽管Via浏览器的体积小巧,但其中提供的功能可谓是五脏俱全,而想要体验更多服务的话,就需要去安装插件了,这需要大家点击右上角的横杠选项,并且从列表里选择"设置"功能. via浏 ...
最新文章
- WAIC剪影:AI的未来,关乎星辰大海
- [读者调查]新增一个读者调查!
- 在save中重写 AdminModel 方法 和 Signals
- KNN之约会网站测试
- 从企业角度看:网站设计的关键是了解与沟通
- 微信支付.商家转账到零钱案例
- win7\win10加域的电脑不输入密码直接登录登录电脑桌面
- 相似度计算之Jaccard系数
- 使用HttpClient下载图片常用代码,以及下载失败原因
- scada系统集成_设计 SCADA 应用程序软件
- linux基础——sed
- 3分钟用C语言教你写个‘浪漫烟花‘---特别漂亮
- Shell语言基本操作一(Xshell5)
- 【面试系列】手把手教你如何面试,你要的我都有(简历篇)
- 服务器cpu能修复吗,有关服务器cpu使用100%常见的解决方法
- VMware蓝屏问题解决方法
- ubuntu18.04 NFS挂载远程服务器
- Flutter插件(Plugin)开发 - Android视角,flutter安装视频
- 利open×××自带的http-proxy突破防火墙的封锁
- oracle左外连接语法,Oracle 左外连接、右外连接、全外连接小总结
热门文章
- Variable变量
- 【vue】滚动条自动滚动到底部
- 微信卡券JSAPI签名校验算法
- 环状序列(Circular Sequence,ACM/ICPC Seoul 2004,UVa1584)
- 切图?切图!——切图仔htmlcss秃头指南
- Mathtype-如何批量修改公式的字号
- 全网最全的微服务链路追踪实践-SkyWalking(看这一篇就够了)
- RStudio无法成功下载stringi包
- 使用VIRTUALLAB FUSION和ANSYS OPTISLANG进行跨平台光学建模和设计
- 标志寄存器(FLAGS,PSW,FR)简介