ROS 的导航系统架构图
矩形为
节点
椭圆为
内部组件
—-> 启动会自动建立
翻译成人话 —– >
- local_costmap 局部地图
- global_costmap 全局地图
move_base,年轻人的第一次导航
move_base
节点
输入
map_server
- 建立好的地图,由我们手动输入其中
sensor_sources 输入
- 仿真机器人模型自己提供了
sensor transforms
- 仿真机器人给我们提供了
odometry source 里程计
- 仿真机器人给我们提供了
amcl 需要我们来提供
仿真环境
下载项目仓库 catkin_ws/src
相关的依赖
git clone https://github.com/6-robot/wpb_home.git
下载相关的依赖
cd wpb_home/wpb_home_bringup/scripts/
回到 catkin_ws
进行编译
catkin_make
- 开始仿真
roslaunch wpr_simulation wpb_gmapping.launch
- 使用键盘操作
rosrun wpr_simulation keyboard_vel_ctrl
- 建图图后保存地图
rosrun map_server map_saver -f map
将地图复制到
wpr_simulation/maps
文件夹中
导航代码编写
使用launch文件启动
- move_base 导航节点
- map_server 地图服务节点
- amcl 定位节点
nav.launch
<launch>
<!--- Run move_base -->
<node pkg="move_base" type="move_base" name="move_base">
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
<!-- Run map server -->
<node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>
<!--- Run AMCL -->
<node pkg="amcl" type="amcl" name="amcl"/>
<!--- Run rviz -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find wpr_simulation)/rviz/nav.rviz"/>
</launch>
move_base
创建软件包 nav_pkg
catkin_create_pkg nav_pkg roscpp rospy move_base_msgs actionlib
参考的文件为 wpr_simulation/launch/wpb_demo_nav.launch
map_server
<!-- Run map server -->
<node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>
amcl
<!--- Run AMCL -->
<node pkg="amcl" type="amcl" name="amcl"/>
启动
- 启动导航节点
roslaunch nav_pkg nav.launch
- 启动rviz
rviz
全局规划器 global_planner
深度优先
如 A*
算力消耗比较小,虽然不是全局最优
广度优先
- Dijkstra算法
ROS提供给我们的
Dijkstra 和 A* 对于现代的计算机,算力差距不大
默认的 Dijkstra 就能满足了
- Navfn 【史山代码—-> 用 Dijkstra算法没啥】
ROS 默认规划器
- navfn/NavfnROS
- Global_planner 【另起炉灶】 —> 提供了 Dijkstra 和 A*
- global_pplanner/GlobalPlanner
- Carrot_planner
- 这个规划器比较简单
- 作为自定义规划器的模板
AMCL 定位算法
Adaptive Monte Carlo Localiztion 自适应蒙特卡洛定位算法
(使用粒子滤波)
可以做到对雷达数据匹配,降低里程计误差
需要的数据有:
- 里程计
- 雷达数据
红色点都是粒子
AMCL —–> 粒子数量大约在 100-500 个
代价地图
会出现这种情况
没考虑机器人的地盘宽度
- 代价地图
全局代价地图 global_costmap
算的贼慢,然后会出现干扰
Color Scheme 选择 costmap
局部代价地图 loacl_costmap
计算频率高,实时性高
参数解析
代价地图的参数至关重要,直接影响了导航的效果
查看参数
costmap_2d
我们看看 move_base 的参数
<node pkg="move_base" type="move_base" name="move_base">
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
<param name="base_global_planner" value="global_planner/GlobalPlanner" />
<param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
</node>
- costmap_common_params.yaml
- global_costmap_params.yaml
- local_costmap_params.yaml
costmap_common_params.yaml
robot_radius: 0.25
inflation_radius: 0.5
obstacle_range: 1.0
raytrace_range: 6.0
observation_sources: base_lidar // 随便起名的
base_lidar: {
data_type: LaserScan,
topic: /scan,
marking: true,
clearing: true
}
robot_radius
- 绝对不能进来的地方
inflation_radius
- 排斥的力场
- 设置大一点,有的时候会有狭小区域有奇效
obstacle_range
- 一般填写激光雷达的有效距离
observation_sources
- 观测物来源
- data_type 类型
- topic 订阅的话题
- marking 是否将扫描到的物体添加到代价地图
- clearing 是否把扫描范围内的障碍物残影清除掉
global_costmap_params.yaml
global_costmap:
global_frame: map
robot_base_frame: base_footprint
static_map: true
update_frequency: 1.0
publish_frequency: 1.0
transform_tolerance: 1.0
- global_frame
- global_frame 地图的坐标系名称
- robot_base_frame 机器人地盘坐标名称
- static_map 是否将map_server 发来的数据作为基础地图
- update_frequency 地图更新频率,更新到全局代价地图
- publish_frequency 地图发布频率,发给rviz
- transform_tolerance tf超时设置
性能太差会寄
local_costmap_params.yaml
local_costmap:
global_frame: odom
robot_base_frame: base_footprint
static_map: false
rolling_window: true
width: 3.0
height: 3.0
update_frequency: 10.0
publish_frequency: 10.0
transform_tolerance: 1.0
- global_frame
- 地图坐标系
- 选择 odom 变化更平滑
- robot_base_frame
- 坐标系名称
- static_map
- 不使用已经建好的图
- rolling_window
- 局部代价地图的范围
- width
- 宽
- height
- 高
局部代价地图的范围
- update_frequency
- 更新频率
- publish_frequency
- 发布频率
- transform_tolerance
- 超时时间设置
恢复行为 recovery beaviors
完整流程
适合激光雷达有盲区的机器人
设置参数
ros自带的行为类型
- 重置
- 在一定距离内,将超出距离的地图部分全部改为默认地图
设置
这是新的恢复流程
参数设置
reset_distance
清除这个范围以外的所有消息
地图分层结构
史山代码,参数名不同意,有地方需要修改
局部规划器 loacal_planner
局部规划器直接决定了 导航效果
- 开源规划器
推荐 DWA Planner
TEB Planner
Eband Planner
DWA Planner
动态窗口方法
Dynamic
Window
Approach
- 生成一系列的轨迹
- 挑选轨迹
- 综合考量挑选
TEB Planner
TEB
规划器
适用于竞赛,竞速型的机器人
容易倒车入库