ROS导航之base_local_planner

本文深入探讨了机器人局部路径规划模块的设计与实现细节,重点介绍了如何根据机器人当前状态及地图信息,采用速度采样和模拟前进的方法生成最优轨迹。

   局部规划模块的设计思路为,根据机器人当前位置(由costmapros提供)和速度(通过订阅odom消息提供),在速度和加速度以及模拟前进时间的限制下进行速度采样,并假设在此速度下行进模拟时长(sim_time)的时间。 然后根据时间间隔计算每一步的位置,根据经历位置的损失值之和计算轨迹的损失值。
   关于损失值的计算,局部规划模块使用了三张图来保存损失值信息,对应三种类型的损失值,分别是pathgrid、goalgrid、costmap, 其中,pathgrid保存的是局部窗口中每一个点到全局路径的距离损失, goalgrid存放的是局部窗口中每一个位置到目标点(全局路径被局部窗口截取的最后一个点)的损失。costmap提供了地图上的障碍物信息了,根据之可以计算每个点的障碍物损失值,具体可详见上一讲。在计算轨迹上每个点的损失时,是按照一定的比例将它们进行加成的,而控制的参数下面会做详细解释。

TrajectoryPlannerROS类

   A ROS wrapper for the trajectory controller that queries the param server to construct a controller.
1. 构造函数
   TrajectoryPlannerROS(std::string name,tf::TransformListener* tf,costmap_2d::Costmap2DROS* costmap_ros);
需要的参数是对坐标系的监听和局部地图。
2. move_base接口
   计算速度函数,主要入口
   bool computeVelocityCommands(geometry_msgs::Twist& cmd_vel);
   传入全局路径,供内部计算更新pathGrid
   bool setPlan(const std::vector<geometry_msgs::PoseStamped>& orig_global_plan);
   检查是否到达目标
   bool isGoalReached();

TrajectoryPlanner类

关键函数:

Trajectory findBestPath(tf::Stamped<tf::Pose> global_pose, tf::Stamped<tf::Pose> global_vel,tf::Stamped<tf::Pose>& drive_velocities);

Trajectory createTrajectories(double x, double y, double theta, double vx, double vy, double vtheta, double acc_x, double acc_y, double acc_theta);

void generateTrajectory(double x, double y, double theta, double vx, double vy, double vtheta, double vx_samp, double vy_samp, double vtheta_samp, double acc_x, double acc_y,double acc_theta, double impossible_cost, Trajectory& traj);

以上三个函数的作用大概就是对速度进行采样,并对采样速度和模拟时间生成轨迹,评价轨迹得分,返回损失最少的轨迹作为返回,同时返回对应的最佳速度(包括线速度和角速度)。

参数详解

/*
   * @param world_model The WorldModel the trajectory controller uses to check for collisions 
   * @param costmap A reference to the Costmap the controller should use
   * @param footprint_spec A polygon representing the footprint of the robot. (Must be convex), 该参数可以从paraserver中读取,也可以从costmap中获得。
   * @param inscribed_radius The radius of the inscribed circle of the robot
   * @param circumscribed_radius The radius of the circumscribed circle of the robot, 机器人内外半径
   * @param acc_lim_x The acceleration limit of the robot in the x direction
   * @param acc_lim_y The acceleration limit of the robot in the y direction
   * @param acc_lim_theta The acceleration limit of the robot in the theta direction
   * 加速度限制,值得注意的是,加速度的设置是配合速度的限制共同起作用的,加入加速度设置的很小,那么在一定时间内无法减速到采样的速度,那么就会以较大的速度继续行进。
   * @param sim_time The number of seconds to "roll-out" each trajectory
   * @param sim_granularity The distance between simulation points should be small enough that the robot doesn't hit things,时间采样间隔,越小说明要计算的轨迹点越多,计算负荷也会随之增加,但是可以增加轨迹损失计算的精确性。
   * @param vx_samples The number of trajectories to sample in the x dimension
   * @param vtheta_samples The number of trajectories to sample in the theta dimension
   * 速度空间的采样样本数,越多的话采样出来的轨迹会越多,但是相应的会增加计算负荷
   * @param pdist_scale A scaling factor for how close the robot should stay to the path, 损失值中到全局路径的损失权重,越大表明更多的靠近全局路径行进
   * @param gdist_scale A scaling factor for how aggresively the robot should pursue a local goal, 到局部目标点的损失权重,不能太小,否则机器人不往前走了。
   * @param occdist_scale A scaling factor for how much the robot should prefer to stay away from obstacles
   *  到障碍物的损失。 具体是对轨迹上每一个点,检查机器人脚印在障碍物图层的损失值,如果脚印与障碍物和unknown区域相交,则返回负值表示轨迹非法,否则返回costmap相应位置损失值的总和。
   * @param heading_lookahead How far the robot should look ahead of itself when differentiating between different rotational velocities
   * @param oscillation_reset_dist The distance the robot must travel before it can explore rotational velocities that were unsuccessful in the past
   * @param escape_reset_dist The distance the robot must travel before it can exit escape mode
   * @param escape_reset_theta The distance the robot must rotate before it can exit escape mode
   * @param holonomic_robot Set this to true if the robot being controlled can take y velocities and false otherwise
   * @param max_vel_x The maximum x velocity the controller will explore
   * @param min_vel_x The minimum x velocity the controller will explore
   * @param max_vel_th The maximum rotational velocity the controller will explore
   * @param min_vel_th The minimum rotational velocity the controller will explore
   * 这几个值不能设置得太小,否则的话转弯的时候很有可能转不过去,只能一直撞墙,这里我吃过大亏的。
   * @param min_in_place_vel_th The absolute value of the minimum in-place rotational velocity the controller will explore
   * @param backup_vel The velocity to use while backing up
   * @param dwa Set this to true to use the Dynamic Window Approach, false to use acceleration limits
   * @param heading_scoring Set this to true to score trajectories based on the robot's heading after 1 timestep
   * @param heading_scoring_timestep How far to look ahead in time when we score heading based trajectories
   * @param meter_scoring adapt parameters to costmap resolution
   * @param simple_attractor Set this to true to allow simple attraction to a goal point instead of intelligent cost propagation
   * @param y_vels A vector of the y velocities the controller will explore
   * @param angular_sim_granularity The distance between simulation points for angular velocity should be small enough that the robot doesn't hit things
   */

调试pdsit,gdist,以及occdist的参数时,可以将publish_cost_grid参数设置为true,这样就可以愉快地在rviz中观察设置的合理与否了。
<think>我们正在处理一个关于ROS中`wpbh_local_planner`包缺失的问题。根据之前的错误信息,ROS无法加载`wpbh_local_planner/WpbhLocalPlanner`插件,并提示该插件未注册或未构建。解决方案的核心步骤包括:1.**确认插件描述文件存在且正确**:检查`wpbh_local_planner`包中是否有`wpbh_planner_plugin.xml`(或类似名称的插件描述文件),并且该文件正确声明了插件类。2.**检查插件注册宏**:在C++源代码中,必须使用`PLUGINLIB_EXPORT_CLASS`宏注册插件。3.**验证包已正确编译**:确保`wpbh_local_planner`包已编译,并且生成了共享库(.so文件)。4.**检查ROS插件索引**:使用`rospack`命令检查插件是否已正确注册到ROS系统中。5.**确认`move_base`参数配置**:在运行`move_base`节点时,参数`base_local_planner`必须设置为`wpbh_local_planner/WpbhLocalPlanner`。下面详细说明每一步:###1.检查插件描述文件在`wpbh_local_planner`包的根目录下,应该有一个XML文件(通常命名为`<package_name>_plugins.xml`或类似)。例如,`wpbh_planner_plugin.xml`,其内容应该类似于:```xml<librarypath="lib/libwpbh_local_planner"><classname="wpbh_local_planner/WpbhLocalPlanner"type="wpbh_local_planner::WpbhLocalPlanner"base_class_type="nav_core::BaseLocalPlanner"><description>Alocalplannerpluginforthenavigationstack.</description></class></library>```同时,在`package.xml`中,必须将该文件导出为`nav_core`的插件:```xml<export><nav_coreplugin="${prefix}/wpbh_planner_plugin.xml"/></export>```###2.检查C++源代码中的插件注册宏在实现`WpbhLocalPlanner`类的C++源文件中(例如`wpbh_local_planner.cpp`),必须有如下宏调用:```cpp#include<pluginlib/class_list_macros.h>...PLUGINLIB_EXPORT_CLASS(wpbh_local_planner::WpbhLocalPlanner,nav_core::BaseLocalPlanner)```###3.验证包的编译确保`wpbh_local_planner`包已经成功编译,并且在`devel/lib`目录(或`install/lib`目录)下生成了共享库文件`libwpbh_local_planner.so`。可以尝试重新编译该包:```bashcatkin_make--only-pkg-with-depswpbh_local_planner```###4.检查ROS插件索引使用以下命令查看`nav_core`插件中是否包含`wpbh_local_planner`:```bashrospackplugins--attrib=pluginnav_core```输出中应该包含一行指向`wpbh_planner_plugin.xml`的路径。如果没有,可以尝试刷新ROS的插件缓存:```bashrospackprofile```###5.检查move_base参数配置在启动`move_base`节点的launch文件或参数文件中,确保设置了正确的本地规划器插件名称。例如,在参数文件中:```yamlbase_local_planner:"wpbh_local_planner/WpbhLocalPlanner"```或者在launch文件中设置参数:```xml<paramname="base_local_planner"value="wpbh_local_planner/WpbhLocalPlanner"/>```###6.常见问题及解决-**问题1:插件描述文件路径错误**检查`package.xml`中`export`标签的路径是否正确。-**问题2:库名称不匹配**插件描述文件中`library`标签的`path`属性指定的库名称(如`libwpbh_local_planner`)必须与`CMakeLists.txt`中`add_library`指定的名称一致(不包括`lib`前缀和`.so`后缀)。-**问题3:未实现所有虚函数**`WpbhLocalPlanner`类必须实现`nav_core::BaseLocalPlanner`的所有纯虚函数。否则,编译会通过,但加载时会失败。###验证步骤1.重新编译包:```bashcatkincleanwpbh_local_plannercatkin_make--only-pkg-with-depswpbh_local_planner```2.检查插件注册:```bashrospackplugins--attrib=pluginnav_core|grepwpbh```3.如果上述命令没有输出,尝试手动注册插件:```bashrospackprofile```4.测试加载插件(可选):可以编写一个测试节点来尝试加载该插件,或者使用`pluginlib`工具:```bashroslib=nav_core;rospackfind$roslib;grep-r"wpbh_local_planner"$(rospackfind$roslib)/plugin_description.xml```5.运行`move_base`节点,查看错误是否消失。如果问题仍然存在,请检查ROS版本是否匹配(如Noetic使用C++14/17,而Melodic使用C++11),并确保所有依赖项已安装。希望这些步骤能帮助你解决问题。§§相关问题§§1.如何创建自定义的ROS本地规划器插件?2.ROS导航栈中`nav_core::BaseLocalPlanner`接口必须实现哪些方法?3.ROS插件系统(pluginlib)的工作原理是什么?4.如何调试ROS插件加载失败的问题?5.在ROSNoetic中,插件注册有哪些变化?</think>### ROS `wpbh_local_planner` 包缺失解决方案 #### 1. **验证插件注册文件** 检查包中是否存在正确的插件描述文件(如 `wpbh_planner_plugin.xml`),确保包含以下内容: ```xml <library path="lib/libwpbh_local_planner"> <class name="wpbh_local_planner/WpbhLocalPlanner" type="wpbh_local_planner::WpbhLocalPlanner" base_class_type="nav_core::BaseLocalPlanner"> </class> </library> ``` 在 `package.xml` 中必须有导出声明: ```xml <export> <nav_core plugin="${prefix}/wpbh_planner_plugin.xml" /> </export> ``` 路径错误是插件加载失败的常见原因[^1]。 #### 2. **检查源代码注册** 在 C++ 实现文件中确认插件注册宏: ```cpp // 必须包含的头文件 #include <pluginlib/class_list_macros.h> // 在文件末尾添加注册宏 PLUGINLIB_EXPORT_CLASS(wpbh_local_planner::WpbhLocalPlanner, nav_core::BaseLocalPlanner) ``` 宏中的类名必须与 XML 文件完全一致[^1]。 #### 3. **验证编译结果** 检查构建系统是否生成共享库: ```bash # 查看是否生成 .so 文件 ls devel/lib/libwpbh_local_planner.so # 重新编译特定包 catkin_make --only-pkg-with-deps wpbh_local_planner ``` 若未生成 `.so` 文件,检查 `CMakeLists.txt`: ```cmake add_library(wpbh_local_planner src/wpbh_local_planner.cpp # 其他源文件... ) target_link_libraries(wpbh_local_planner ${catkin_LIBRARIES}) ``` #### 4. **更新插件缓存** 刷新 ROS 插件数据库: ```bash rospack profile # 更新包索引 rospack plugins --attrib=plugin nav_core # 验证注册 ``` 输出应包含: ``` wpbh_local_planner /path/to/wpbh_planner_plugin.xml ``` #### 5. **检查运行时配置** 在 `move_base` 参数文件中确认名称匹配: ```yaml base_local_planner: "wpbh_local_planner/WpbhLocalPlanner" ``` 错误名称如 `wpbh_planner`(缺少 `_local_`)会导致加载失败[^2]。 #### 6. **解决依赖问题** 安装核心依赖: ```bash sudo apt-get install ros-$ROS_DISTRO-nav-core rosdep install --from-paths src --ignore-src -y ``` #### 7. **调试技巧** - **检查类继承**:确保类正确定义: ```cpp class WpbhLocalPlanner : public nav_core::BaseLocalPlanner ``` - **验证符号表**: ```bash nm -gC devel/lib/libwpbh_local_planner.so | grep WpbhLocalPlanner ``` 应显示 `typeinfo for wpbh_local_planner::WpbhLocalPlanner` #### 8. **常见修复方案 | 问题类型 | 解决方案 | |---------|----------| | XML 路径错误 | 检查 `package.xml` 的 `<export>` 路径 | | 未实现虚函数 | 实现所有 `nav_core::BaseLocalPlanner` 纯虚函数 | | ROS 版本冲突 | 使用 `catkin clean` 清除旧构建 | > **验证脚本**:快速检测插件状态 > ```python > import rospkg, os > r = rospkg.RosPack() > try: > path = r.get_path('wpbh_local_planner') > print(f"✅ 包存在于: {path}") > print(f"✅ 插件文件: {'存在' if os.path.exists(path+'/wpbh_planner_plugin.xml') else '缺失'}") > print(f"✅ 共享库: {'存在' if os.path.exists(path+'/../../devel/lib/libwpbh_local_planner.so') else '未构建'}") > except rospkg.ResourceNotFound: > print("❌ 包未安装或不在ROS_PACKAGE_PATH中") > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值