SBPL Lattice规划算法
sbpl全局规划算法是由迈克尔·菲利普斯开发的一中实验性质的全局规划器,适用于ROS环境下的导航包,并适配nav_core中指定的nav_core::BaseGlobalPlanner接口。因此该规划器可用作move_base的全局规划器。该规划器会通过一系列的“运动基元”来生成从机器人当前位置到所需的目标位置的路径。规划包括x、y、theta三个维度,所以生成出的路径相对平滑。该规划器可选用ARA*(Anytime Repairing A*)规划器和AD*(Dynamic A*)规划器来生成路径。
如何部署sbpl_lattice_planner
SBPL库安装
首先我们先要安装算法所依赖的外部库SBPL,从github上下载后,可通过apt的方式
sudo apt-get install ros-indigo-sbpl
若要通过离线安装包的方式可以先从 https://github.com/sbpl/sbpl.git 上下载SBPL Library
或者使用
git clone https://github.com/sbpl/sbpl.git
打开下载下来的文件的根目录,用彼岸准的CMake命令的方式构建SBPL库:
mkdir build && cd build
cmake .. && make
安装结束后,可以把sbpl库设置到你的ubuntu环境中去,方便调用:
sudo make install
以上就完成了sbpl库的安装。
安装SBPL_Lattice_Planner
通过github下载好ros-planning/navigation_experimental的项目,即为SBPL路径规划器了
下载好的package navigation_experimental-indigo-devel放入工作空间中的src文件夹,使用catkin_make进行编译
安装完后,source 工作空间下的 devel/setup即可。可以通过
rospack plugins --attrib=plugin nav_core
进行查看,可以看到现编已经成功的添加了sbpl规划器相关的组件了。
如何配置规划器参数及launch启动文件
参数解释
-
planner_type
参数类型:string
默认:ARAPlanner
描述:指定要使用的规划器,可以再ARA和AD Planner之间切换选择。 -
allocated_tome
参数类型:double
默认值:10
描述:基于规划器解决路径问题的时间。如果规划器在指定时间内找到相应的路径后仍有剩余时间,规划器将用剩余的时间来改进解决方案,直到其达到最优解或知道时间用完(以先到者为准)。 -
initial_epsilon
参数类型:double
默认:3.0
描述:启发式的值在第一次搜索时按比例缩放。此值必须大于或等于 1。此值越大,搜索越容易找到解决方案(如果 epsilon 大于 1,则可能是次优的结果)。在第一次搜索之后,规划器会继续减少 epsilon 值,直到它为 1(最优搜索)。 -
environment_type
参数类型:string
默认:XYThetaLattice
描述:正在搜索的环境类型。目前,XYThetaLattice 是唯一受支持的环境。 -
forward_search
参数类型:bool
默认:false
描述:搜索的方向。如果您使用 AD*,您应该使用反向搜索来加快重新计划时间。对于 ARA*,使用哪个方向并不重要。false:正向;true:反向 -
primitive_filename
参数类型:string
默认:
描述:运动图元文件的路径。必须由用户指定,以便规划器工作。SBPL 包中的 matlab/mprim/pr2.mprim 中有一个示例运动原语文件。如果想生成自己的运动原语文件以匹配机器人的运动学或地图分辨率,SBPL 包中的 matlab/mprim/ 中有个 genmprim*.m 脚本可以用于生成自定义的运动基元文件。 -
force_scratch_limit
参数类型:int
默认:500
描述:该参数仅在使用 AD* 时才生效。自上次生成规划以来至少有设置的值得数量的地图单元发生了变化,则规划器将不会再继续使用以前的搜索信息,而是从头开始规划搜索。 -
nominalvel_mpersecs
参数类型:double
默认值:0.4
描述:机器人的线速度,以米/秒为单位 -
timetoturn45degsinplace_secs
参数类型:double
默认值:0.6
描述:机器人在原地转 45 度所需的时间(以秒为单位)。 -
lethal_obstacle
参数类型:无符号字符
默认值:20
描述:规划器的代价地图中障碍物的代价。成本图中的所有其他值都会相应地缩放。障碍物成本在 costmap2d 中最大,因此通过将此参数设置为低于其障碍物阈值的值,我们可以获得不那么苛刻且更合理的障碍物填充。这将使规划器更有可能选择穿过更狭窄的区域,例如门口。
nav_comme_param.yaml配置
controller_frequency: 25.0
planner_frequency: 0.0
planner_patience: 0.01
recovery_behavior_enabled: false
clearing_rotation_allowed: false
base_local_planner: pose_follower/PoseFollower
base_global_planner: SBPLLatticePlanner
Launch启动文件设置
<launch>
<param name="/use_sim_time" value="true"/>
<!-- sbpl map server -->
<node name="map_server" pkg="map_server" type="map_server" args="$(find move_robot)/map/navigation.yaml" output="screen" />
<!-- include file="$(find amcl)/examples/amcl_diff.launch" /-->
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
<!-- sbpl params -->
<param name="SBPLLatticePlanner/primitive_filename" value="$(find move_robot)/matlab/mprim/pr2.mprim" />
<rosparam file="$(find sbpl_lattice_planner)/launch/move_base/sbpl_global_params.yaml" command="load" />
<!-- normal params -->
<rosparam file="$(find move_robot)/launch/nav_common_params.yaml" command="load" />
<rosparam file="$(find move_robot)/launch/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find move_robot)/launch/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find move_robot)/launch/local_costmap_params.yaml" command="load" />
<rosparam file="$(find move_robot)/launch/global_costmap_params.yaml" command="load" />
<rosparam file="$(find move_robot)/launch/base_local_planner_params.yaml" command="load" />
<rosparam file="$(find move_robot)/launch/global_planner_params.yaml" command="load" />
</node>
</launch>