navigation stack

part0

现实中想要移动平台移动到指定地点,机器人运动控制系统架构包括了如下几个层次:

最底层是机器人的底盘控制部分,驱动器接收的是机器人的期望速度(Twist),将速度解算为左右轮的期望速度,并根据期望速度对左右轮分别进行PID驱控速,输出电机的转速。

这部分ROS社区已经有针对Arduino封装好的Package——rosserial_arduino。

中间层是通信层,电脑端发布速度指令给平台,同时接收平台发布的当前速度,然后发布/odom topic,让其他节点订阅。

最上层是决策层,也就是导航规划层,goal、localization(matching&里程计)、path planner以及最终输出速度指令,这一部分都在navigation stack里面。

part1 packages

navigation stack是ROS提供的导航方案,内部集成了很多个package,模块之间完全解耦,可以个性化选择提供的方法。

官网上给出了导航栈宏观的结构描述:

move_base中主要包含三个部分,global_plan、local_plan以及recovery behavior。对应的插件有:

  • global_plan:global_planner(实现了dijkstra和A*算法),carrot_planner,navfn
  • local_plan:base_local_planner(实现了Trajectory Rollout和DWA算法),dwa_local_planner
  • recovery:clear_costmap_recovery,move_slow_and_clear,rotate_recovery

nav_core是一个接口插件,包含了以上插件基类的头文件,move_base中的方法都是在其规则上扩展的。

两个灰色的插件map_server和amcl表示可选可不选:

  • 可以使用meta package提供的map_server节点来进行代价地图管理,也可以使用其他节点(例如直接使用gmapping的输出)。
  • 可以使用meta package提供的amcl节点来进行自定位,也可以使用其他算法包(例如ROS里面还有一个robot_pose_ekf节点)。

costmap_2d将不同传感器的输入处理成统一的栅格地图格式。以层的概念来组织图层,用户可以根据需要自己配置(通过Social Costmap Layer、Range Sensor Layer等开源插件),默认的层有:

  • static_layer:静态地图层,(通过订阅map_server的/map主题)来生成。
  • obstacle_layer:障碍地图层,根据动态的传感器信息来生成。
  • inflation_layer:膨胀层,将前两个图层的信息综合进行缓冲区扩展。

voxel_grid是三维代价地图。

fake_localization用来做定位仿真,内含/base_pose_ground_truth话题。

part2 params

  1. move_base_params.yaml:
    • planner_frequency:全局规划的执行频率,如果设置为0.0则全局规划器仅在接受到新目标点或者局部规划器报告路径堵塞时才会重新执行。
  2. global_planner_params.yaml:
    • default_tolerance:当设置的目的地被占据时,以该参数为半径的范围内选取最近的点作为新目标点。
  3. dwa_local_planner_params.yaml:
    • latch_xy_goal_tolerance:如果设置为true,达到xy_goal_tolerance以内机器人就会原地旋转,即使会转出容错圈外。
    • sim_granularity:间隔尺寸,轨迹上采样点步长。
    • scaling_speed:启动机器人底盘的速度。
  4. global_costmap_params.yaml:

    • raytrace_range:实时清除代价地图上障碍物的最大范围,清除的是obstacle_layer的数据。

part3 topics

  1. move_base & move_base_simple:

    1
    2
    3
    4
    5
    6
    7
    8
    ros::NodeHandle action_nh("move_base");
    action_goal_pub_ = action_nh.advertise<move_base_msgs::MoveBaseActionGoal>("goal", 1);

    //we'll provide a mechanism for some people to send goals as PoseStamped messages over a topic
    //they won't get any useful information back about its status, but this is useful for tools
    //like nav_view and rviz
    ros::NodeHandle simple_nh("move_base_simple");
    goal_sub_ = simple_nh.subscribe<geometry_msgs::PoseStamped>("goal", 1, boost::bind(&MoveBase::goalCB, this, _1));

    之前查看节点图的时候发现这两个节点都提供goal,一直没想通两者的关系,发现代码注释里面有,move_base继承了actionlib,有状态反馈(详见wiki 1.1.2 ActionAPI),move_base_simple就是一个publisher(topic可以来自rviz/cmd line)。

    /result 记录了Goal reached

    /feedback 记录了每个时刻机器人的位姿

    /status 记录了任务进程(goal accepted、failed、aborting)

    /cancel 没echo出信息,应该与上层对接

    【定点巡航】另外,定点巡航的时候将global_path的buffer设置为n就可以显示多条路径了。

  2. DWAPlanner的global_plan & local_plan:

    local_plan就是DWA算法每个时刻计算的最优预期路径。global_plan是整个局部代价地图上的路径,它是全局路径的crop,因为局部动态环境不会影响全局路径,我们只研究落在localmap以内这一段路径是否需要矫正。