navigation 功能包属于元功能包,元功能包中由于没有src目录,因此无需添加任何依赖项,因为这个功能包没有自己的专属功能,它的功能是借助其他功能包的功能实现的。
元功能包中2个重要的文件:
(1) CMakelist.txt 文件
用于指定功能包之间的依赖关系
(2)package.xml文件
用于声明元功能包所依赖的其他功能包
catkin
rospy
tf
geometry_msgs
nav_msgs
sensor_msgs
slam_gmapping
cartographer
cartographer_ros
slam_karto
hector_slam
amcl
move_base
map_server
dwa_local_planner
teb_local_planner
global_planner
navfn
其中,
代表这个功能包是元功能包。
系统:Ubuntu18.04
ros:melodic
cd ~/catkin_ws/src
git clone https://github.com/ros-planning/navigation/tree/melodic-devel
cd ..
catkin_make -DCATKIN_WHITELIST_PACKAGES='map_server'
catkin_make -DCATKIN_WHITELIST_PACKAGES='amcl'
catkin_make -DCATKIN_WHITELIST_PACKAGES='move_base'
编译过程中遇到的问题:
(1) 编译报错“Could NOT find SDL(missing: SDL_LIBRARYSDL_INCLUDE_DIR)”,执行指令:
sudo apt-get install libsdl1.2-dev
(2)编译报错“Could NOT find SDL_image(missing:SDL_IMAGE_LIBRARIES SDL_IMAGE_INCLUDE_DIRS)”,执行指令:
sudo apt-get install libsdl-image1.2-dev
(3)编译报错“Could not find a package configuration file provided by “base_local_planner” with any of the following names”,执行命令:
sudo apt-get install ros-melodic-base-local-planner
navigation可以通过源码安装,也可以通过二进制安装:
sudo apt install ros--navigation
sudo apt install ros--gmapping
sudo apt install ros--map-server
注意:/opt/ros/melodic/share
和 /opt/ros/melodic/lib
是ros中两个重要的路径,是二进制安装路径
(1)加载地图
navigation通过map_server加载现有地图,地图包含两部分,地图文件和地图描述yaml, YAML 格式:
image: testmap.pgm
resolution: 0.1
origin: [0.0, 0.0, 0.0]
occupied_thresh: 0.65
free_thresh: 0.196
negate: 0
image : 照片路径,绝对路径或者YAML文件所在的相对路径
resolution : 分辨率,米/像素
origin :图片最左下角像素在地图中的2d位置 (x,y,yaw),yaw为逆时针偏转,当yaw=0时没有偏转,许多系统会忽略yaw。
occupied_thresh:大于这个阀值的占用概率的像素被认为occupied
free_thresh:小于这个阀值的占用概率的像素被认为是free
negate :是否对white/black free/occupied定于的语义进行翻转,对occupied_thresh/free_thresh无影响
map_server加载地图:
rosrun map_server map_server xxx/xx/mapName.yaml
rosrun map_server map_saver -f mapName ## 保存地图
(2)AMCL定位
ros的定位是amcl包实现的,最为核心的是include目录和src目录,map自然是处理地图的了,pf就是算法的核心粒子滤波(particle filter),sensors就是处理雷达跟里程计传感器的,在这些之上还有一个amcl_node.cpp,用来实现功能的聚合,对外提供简洁的接口。
amcl定位:可以估算机器人在地图坐标系/map下的位姿信息,提供/base、/odom、/map之间的TF变换。
amcl包的输入输出:
输入:地图,雷达数据,里程计
输出:小车pose (x, y, w)
更多详情链接:WIKI
(3) move_base路径规划
move_base为导航的核心框架,主要的配置文件:local_costmap_params.yaml、global_costmap_params.yaml和costmap_common_params.yaml
全局路径规划(gloable_planner):使用 Dijkstra 或 A* 算法进行全局路径规划;局部路径规划(local_planner):DWA 或者 TEB
更多详情链接:WIKI
cd ~catkin_ws/src
git clone https://github.com/LFZ1994/robot_navigation.git
carkin_make
地图已经提前建好,新建导航launch文件:
更多详情参考ROS导航安装及实现
编译遇到的问题:
问题1: Couldn’t transform from base_laser_link to base_footprint, even though the message notifier is in use
解决:amcl_params.yaml 中base_frame_id 和车体保持一致base_link
问题2: Timed out waiting for transform from base_footprint to map to become available before running costmap, tf error: canTransform: source_frame base_footprint does not exist… canTransform returned after 0.100814 timeout was 0.1.
解决:costmap_param.yaml中:robot_base_frame: base_link (原因同上)
问题3: global_costmap: Pre-Hydro parameter “static_map” unused since “plugins” is provided
解决:local_costmap_param.yaml global_costmap_param.yaml 删除掉或者注释:static_map 因为ROS中已经提供了这两个的插件,我们又在move_base的参数文件中设置了但没用到,只需要删除掉即可
问题4:Failed to create the dwa_local_planner/DWAPlannerROS planner, are you sure it is properly registered and that the containing library is built? Exception: Could not find library corresponding to plugin dwa_local_planner/DWAPlannerROS. Make sure the plugin description XML file has the correct name of the library and that the library actually exists.
解决:sudo apt-get install ros-melodic-dwa-local-planner
参考资料:
Wiki
机器人SLAM与自主导航