最近在做一個項目被迫要涉及到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圖的結構,我是在仿真環境下跑的
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL61EVNVnRXR2bw5mYopkMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4UzN5ADM1ATM2ETNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一般對實際機器人來說,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)做一點補充。
主要涉及到的有如下四個
其中,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的關系,希望由搞懂的朋友告知一下。