小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
对局部避障的动态窗口法(dynamic window approach)的理解
-
算法原理
对算法原理的学习主要参考下面两个链接的文章:
机器人局部避障的动态窗口法(dynamic window approach) 讲解了DWA的算法原理
一个DWA学习专题 基于原理讲解了代码是如何实现的对主要工程文件的分析
costmap_model.cpp中CostmapModel类的footprintCost方法用于获取机器人外轮廓是否与障碍物重叠的cost值,cost为负数表明有异常。
// returns: // -1 if footprint covers at least a lethal obstacle cell, or // -2 if footprint covers at least a no-information cell, or // -3 if footprint is [partially] outside of the map, or // a positive value for traversable space
footprint_helper.cpp中FootprintHelper的getFootprintCells方法返回footprint在costmap中的所有cell坐标。
latched_stop_rotate_controller.cpp中的LatchedStopRotateController类提供判断机器人是否已经到达目标点的函数,以及到达目标点的旋转操作,保证角度误差在设定的范围内。
local_planner_util.cpp中LocalPlannerUtil类提供getLocalPlan函数来根据当前机器人位置截取一段全局规划路径。
map_cell.cpp中定义了map中cell的数据结构。
map_grid_cost_function.cpp中的MapGridCostFunction继承了TrajectoryCostFunction虚基类,并实现了基于路径上栅格cost值给局部路径评分的函数scoreTrajectory。在该文件中, 因目的不同(为让轨迹尽可能接近全局路径,为让机器人朝着局部目标前进,还有为让机器人的头保持指向局部目标),最终执行的代价函数因配置不同而不同。
map_grid.cpp中定义了地图的数据结构。
obstacle_cost_function.cpp中的ObstacleCostFunction类TrajectoryCostFunction虚基类,并实现了基于footprint轮廓范围内最大栅格cost值给局部路径评分的函数scoreTrajectory。
odometry_helper_ros.cpp中OdometryHelperRos类用于获取里程计得到的速度。
oscillation_cost_function.cpp中的OscillationCostFunction类TrajectoryCostFunction虚基类,并实现了基于是否出现震荡给局部路径评分的函数scoreTrajectory。当机器人从标记震荡的位置处离开一定距离就会复位震荡标志位。
prefer_forward_cost_function.cpp中的PreferForwardCostFunction类TrajectoryCostFunction虚基类,并实现了基于是否尽量直行评分的函数scoreTrajectory。
simple_scored_sampling_planner.cpp中实现的findBestTrajectory函数调用了各评分函数选出了评分最小的局部轨迹。
trajectory.cpp中定义了局部轨迹的数据结构。其中xv_,xy_,thetav_存储该轨迹采样的速度。
dwa_planner_ros.cpp中的computeVelocityCommands函数就是move_base调用来生成最终执行速度的函数。
simple_trajectory_generator.cpp中SimpleTrajectoryGenerator类的initialise函数根据加速度参数采样了所有可行的速度。generateTrajectory函数根据采样的速度和当前机器人位置生成采样的路径。
twirling_cost_function.cpp中的TwirlingCostFunction类TrajectoryCostFunction虚基类,并实现了基于旋转速度评分的函数scoreTrajectory。
注意:可以自己编写继承于TrajectoryCostFunction虚基类的cost_function文件来基于不同功能给局部仿真路径评分,从而选出适合场景的轨迹。输入轨迹到评分函数scoreTrajectory(Trajectory &traj)中, 该函数会输出轨迹评价分数。如果输出负分数意味着轨迹无效;如果输出正直,对于代价函数来说值越小越好。每个代价函数有一个比例因子,与其它代价函数比较时候,可以通过调节比例因子调节代价函数的影响程度。
参考:
http://wiki.ros.org/dwa_local_planner
python实现的DWA仿真代码
dwa_planner vs. base_local_planner这里描述了一些dwa_planner 和 base_local_planne的差异