導航、路徑規劃、SLAM
主要涉及到3個基本包
- 用於讓機器人在制定框架內移動到目標位置的move_base包。
- 用於從鐳射掃描器、深度攝像機來繪製地圖的gmapping包。
- 用於在現有的地圖中定位的amcl包。
move_base
move_base包是使用MoveBaseActionGoal訊息型別來指定目標的。
[email protected]:~/catkin_ws/src/my_robot_name_2dnav$ rosmsg show MoveBaseActionGoal
[move_base_msgs/MoveBaseActionGoal]:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
actionlib_msgs/GoalID goal_id
time stamp
string id
move_base_msgs/MoveBaseGoal goal
geometry_msgs/PoseStamped target_pose
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Pose pose
geometry_msgs/Point position
float64 x
float64 y
float64 z
geometry_msgs/Quaternion orientation
float64 x
float64 y
float64 z
float64 w
看上去很複雜,實際使用中指定move4base目標時只需要設定某幾個項就可以了。
在move_base節點執行前需要四個配置檔案。定義了野果障礙物的代價、機器人半徑、路徑規劃時要考慮未來多長的路、移動速度等等。在rbx1_nav包的config子目錄下可以找到:
base_local_planner_params.yaml
costmap_common_params.yaml
global_costmap_params.yaml
local_costmap_params.yaml
配置檔案
以下的引數直接可以在wiki上搜索對應的檔名。
base_local_planner_params
- controller_frequency: 3.0 每3秒一次重新規劃路徑
- max_vel_x: 0.3 機器人的最大線速度
- min_vel_x: 0.05機器人的最小線速度
- max_rotation_vel: 1.0最大旋轉速度
- min_in_place_vel_theta: 0.5最小旋轉速度
- escape_vel: 機器人逃時速度。必須為負數,這樣才能反向移動。
- acc_lim_x: 2.5 x方向上的最大加速度
- 等等
costmap_common_params.yaml
- robot_radius: 0.165--對於圓形機器人這個時機器人的半徑,單位時米。對於非圓形機器人來說,你可以用到接下來說到的footprint引數。
- footprint:[[x0, y0], [x1, y1], [x2, y2], [x3, y3], etc]列表中的每一個座標代表機器人的邊上的一點,機器人的中心設為[0, 0]。單位時米。按照順時針活著逆時針排列。
- inflateon_radius:0.3 --地圖上的障礙物的半徑,單位為米。如果你的機器人不能很好地通過窄門或其他狹窄的地方,則稍微減少這個值。相反的,如果經常碰撞,則增大這個值。
global_costmap_params.yaml
- global_frame:/map --對於全域性代價地圖,我們用map框架作為global框架。
- robot_base_frame:/base_footprint --這個通暢不是/base_link就是/base_footprint。對於TurtleBot應設為/base_footprint。
- update_frequency:1.0--根據感測器資料,全域性地圖更新的瓶綠,單位為赫茲。這個數值越大你的計算機cpu負擔就會越重。特別對於全域性地圖,通常會設定一個相對較小、在1.0到5.0之間的值。
- 等等
local_costmap_params.yaml
- global_frame:/odom--對於本地代價地圖來說,我們使用odometry框架來作為global框架。
- robot_base_frame:/base_foot_print--這個通常不是/base_link就是/base_footprint。對於TurtleBot應設為/base_footprint。
- 等等
簡單的測試move_base。
執行如下命令
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -drospack find rbx1_nav
/nav.rviz
會在螢幕上出現
這裡我們構建了一張沒有障礙物的地圖。我們想傳送如下命令讓機器人前進,並回到原點。
rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ‘{ header: { frame_id: “map” }, pose: { position: { x: 1, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }’
rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped ‘{ header: { frame_id: “map” }, pose: { position: { x: 0, y: 0, z: 0 }, orientation: { x: 0, y: 0, z: 0, w: 1 } } }’
這裡我遇到了一個問題
執行的過程中出現如下警告。
[ WARN] [1482245396.760593833]: Map update loop missed its desired rate of 3.0000Hz… the loop actually took 0.8265 seconds
[ WARN] [1482245396.767846009]: Control loop missed its desired rate of 3.0000Hz… the loop actually took 0.8340 seconds
網上的解釋是配置檔案配置過高,活著機器cpu能力不足。我使用的是mac 13寸標準版,配置檔案並未改過。
這樣執行的結果是機器人一直在目標點附近打轉,始終無法停下來。我思考的原因,可能是由於計算能力不足,運動控制器無法在合適的時間來及時停止機器人或改變角度,所以總會出現運動偏差。
所以,我將控制頻率降低為1,並將移動速度與旋轉速度都降低,想來彌補cpu能力不足的問題,然後問題得到了緩解,但是依然無法滿足要求,問題主要出在旋轉上,只要有運動中旋轉的,機器人總是無法自己停下來。如圖。
比較困惑,感覺move_base沒有想象中的那麼智慧。
後面還有一個跨越障礙物的demo,存在同樣的問題。先放一下。回頭再仔細研究。
補充
取得了一些進展,引數還是原始引數,我調大了virtual box的cpu數量到2和記憶體大小到3gb。
取得雖然機器人還會亂轉,但收斂速度變快了。
然後準備開啟virtualbox的3d加速,但是開啟時,執行rviz時報錯了。
OpenGL Warning: No pincher, please callcrStateSetCurrentPointers() in your SPU
Segmentation fault (core dumped)
但是如果不開啟,虛擬機器顯示流暢性大大降低。
嘗試了幾次發現,更新到最新版本的virtualbox並在啟動後安裝虛擬機器增強工具,該報錯就會消失。但是重啟又會出現。
使用move_base走正方形
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_move_base_blank_map.launch
rosrun rviz rviz -drospack find rbx1_nav
/nav.rviz
rosrun rbx1_nav move_base_square.py
使用move_base 執行避開障礙物
使用ctrl+c停止之前的執行
並執行以下命令
roslaunch rbx1_bringup fake_turtlebot.launch
rosparam delete /move_base
roslaunch rbx1_nav fake_move_base_map_with_obstacles.launch
rosrun rviz rviz -drospack find rbx1_nav
/nav_obstacles.rviz
rosrun rbx1_nav move_base_square.py
執行效果如下圖,還不錯。
gmapping
用一張地圖地圖和amcl來導航與定位
roslaunch rbx1_bringup fake_turtlebot.launch
roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml
rosrun rviz rviz -drospack find rbx1_nav
/amcl.rviz
效果如下圖,機器人有點喝醉了,目前我認為還是與機器效能有關。