天天看點

ROS:move_base參數解析

最近在做一個項目被迫要涉及到navigation的源碼,作為一個調包俠的我真是頭大,本着甲方就是爸爸的原則硬着頭皮來啃源碼。

第一步就是move_base了,

一般需要這三個包navigation,navigation_msgs,rbx1,直接上github搜就行,如果要利用arbotix仿真的話,安裝指令

sudo apt-get install ros-kinetic-arbotix*
           

編譯可能會出現找不到一些庫的情況,參考https://blog.csdn.net/banzhuan133/article/details/88998433 

首先來看一下rqt_graph圖的結構,我是在仿真環境下跑的 

ROS:move_base參數解析

一般對實際機器人來說,map_server是與slam一起的,來建立全局或者局部的地圖,/tf和/odom都是用來做坐标變換的,簡單來說就是move_base這個節點訂閱map,tf,goal來完成路徑規劃,并釋出cmd_vel,footprint是機器人的輪廓,一般是固定的。

關于move_base的源碼講解,這個老哥講得很清楚,就不重複造輪子了 

http://www.cnblogs.com/sakabatou/p/8297479.html

大緻了解move_base的原理之後呢,就可以上手跑仿真實驗了,

roslaunch rbx1_bringup fake_turtlebot.launch

roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch

rosrun rviz rviz -d `rospack find rbx1_nav`/nav_obstacles.rviz 
           

在rviz下,直接用滑鼠標明2D navigation goal就可以指定目标了,但是,你可能會發現效果不太好,比如,瘋狂原地打轉,走S型,繞大圈等現象,這個時候,别急着看源碼,因為我看完源碼才發現,咱們這點問題,完全通過調參就可以解決,而且參數接口人家都開放好了。當然,讀源碼對了解整個move_base架構是很有幫助的。這裡主要對幾個參數配置文檔(yaml)做一點補充。

主要涉及到的有如下四個

ROS:move_base參數解析

其中,costmap的三個大同小異,看字面意思大概就能了解什麼意思,而且一般也不做改動,咱們主要來看兩個planner

controller_frequency: 3.0
recovery_behavior_enabled: false
clearing_rotation_allowed: false

TrajectoryPlannerROS:
   max_vel_x: 0.5
   min_vel_x: 0.1
   max_vel_y: 0.0  # zero for a differential drive robot
   min_vel_y: 0.0
   max_vel_theta: 1.0
   min_vel_theta: -1.0
   min_in_place_vel_theta: 0.4
   escape_vel: -0.1
   acc_lim_x: 3.5 #1.5
   acc_lim_y: 0.0  # zero for a differential drive robot
   acc_lim_theta: 4.2 #1.2

   holonomic_robot: false
   yaw_goal_tolerance: 0.15 #0.1 # about 6 degrees
   xy_goal_tolerance: 0.05  # 5 cm
   latch_xy_goal_tolerance: false
   pdist_scale: 0.4 #0.4
   gdist_scale: 0.8 #0.8
   meter_scoring: true

   heading_lookahead: 0.325
   heading_scoring: false
   heading_scoring_timestep: 0.8
   occdist_scale: 0.05
   oscillation_reset_dist: 0.05
   publish_cost_grid_pc: false
   prune_plan: true

   sim_time: 3.5 #1.0
   sim_granularity: 0.1 #0.05
   angular_sim_granularity: 0.1
   vx_samples: 8
   vy_samples: 0  # zero for a differential drive robot
   vtheta_samples: 20
   dwa: true
   simple_attractor: false
           

機器人自身參數部分

max_vel_x, min_vel_x, max_vel_y, min_vel_y, max_vel_theta, min_vel_theta, acc_lim_x, acc_lim_y, acc_lim_theta:線速度,角速度,加速度的最大最小值

min_in_place_vel_theta:原地最大角速度

escape_vel:逃逸速度,必須是負值,這個速度可以了解為機器人陷入死胡同的回退速度

holonomic_robot:是否為全向機器人

yaw_goal_tolerance,xy_goal_tolerance:目标精度,實際肯定不可能以點為精度,到達目标某個範圍内視作到達目标

latch_xy_goal_tolerance:一般都為false,如果為true是什麼意思呢?就是當進入xy_goal_tolerance範圍内後會設定一個鎖,此後即使在旋轉調整yaw的過程中跳出xy_goal_tolerance,也不會進行xy上的調整。

前向仿真部分

contriller_frequency:控制器更新頻率,一般設為3~5之間,越高對計算機負載要求越高。

sim_time:前向仿真時間

sim_granularity, angular_sim_granularity:前向仿真時間步長(米),角速度前向步長(弧度)

vx_samples, vy_samples, vtheta_samples:速度采樣數

評價函數部分

cost的計算邏輯如下

cost = 
  pdist_scale * (distance to path from the endpoint of the trajectory in map cells or meters depending on the meter_scoring parameter) 
  + gdist_scale * (distance to local goal from the endpoint of the trajectory in map cells or meters depending on the meter_scoring parameter) 
  + occdist_scale * (maximum obstacle cost along the trajectory in obstacle cost (0-254))
           

pdist_scale,gdist_scale:path和goal的權重,前者大更靠近全局路徑,後者大更靠近全局目标

meter_scoring:計算系數時統一上面那兩個參數的機關為米,一般都是true,false時機關為cells

occdist_scale:避障系數

heading_lookhead:對不同的旋轉角,最多向前看幾米。

heading_scoring_timestep:對不同的軌迹,每次前向仿真時間步長

dwa:是否選擇DWA,false的話會選擇Trajectory Rollout

publish_cost_grid_pc:是否釋出計算後的cost話題

知道了這些參數的意思,我們再回到最初的話題,怎麼來調參

比如跑大圓是什麼原因呢?

因為上述計算cost采用的是endpoint,是以,如果前向仿真時間過長的話,endpoint就會比較遠,圓弧半徑就會比較大。

同理,如果過小,會造成走S型,甚至來回震蕩的情況。一般來說,如果地形越複雜,sim_time大一些(一般不超過5.0)效果比較好。

再比如說,增大pdist_scale和gdist_scale可以更快地讓機器人靠近全局路徑和目标,但同樣的,陷入局部陷阱後也更難跳出來。

還有一些參數是理論上是越精細越好,但是同樣的對算力的要求越高,比如vx_sample,vth_samples,sim_granularity。

關鍵還是控制變量+多實驗+多分析。

這裡其實我還有一個問題沒解決,就是sim_time和heading_scoring_timestep的關系,希望由搞懂的朋友告知一下。