1.前言
在进行路径规划与仿真时,往往需要对我们的算法进行验证,有很多方式来进行,比如利用QT可视化界面进行仿真,如下图是自己利用QGraphicsview建立的一个仿真环境。也可以利用ROS中的地图工具来进行,本文尝试使用ROS的map_server工具包进行地图的建立。
2.流程
(1)安装navigation功能包,或者单独安装map_server功能包
安装功能包时如果找不到功能包,添加一下中科大的镜像站,然后再下载
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-get update
sudo apt-get install ros-kinetic-navigation
(2)用画图软件创建一个地图
Ubuntu下Pinta图片编辑器是一款比较好用的画图截图软件,推荐大家使用,这里我存储的是png文件,命令map.png
(3)创建ros功能包,添加map文件夹
常规创建ros功能包,这里不再赘述
在根目录下新建ROS工作空间,命名pathplanning,并建立子文件夹src
mkdir -p pathplanning/src
进入src文件目录,初始化工作空间
cd src
catkin_init_workspace
退回pathplanning目录,编译工作空间
cd ..
catkin_make
设置环境变量
source devel/setup.bash
创建laser_receive功能包
catkin_create_pkg pathplanning std_msgs roscpp rospy
进入到pathplanning/src/pathplanning目录下
mkdir map
将map.png文件放到map文件夹下
(4)配置map.yaml文件
在map文件夹下创建map.yaml文件添加[1]
image: testmap.png
resolution: 0.1
origin: [0.0, 0.0, 0.0]
occupied_thresh: 0.65
free_thresh: 0.196
negate: 0
- image:指定包含occupancy data的image文件路径; 可以是绝对路径,也可以是相对于YAML文件的对象路径 。
- resolution:地图分辨率,单位是meters/pixel 。
- origin:图中左下角像素的二维位姿,如(x,y,yaw),yaw逆时针旋转(yaw=0表示没有旋转)。系统的很多部分现在忽略yaw值。注意fix_frame是map
- occupied_thresh:像素占用率大于这个阈值则认为完全占用。
- free_thresh:像素占用率比该阈值小被则认为完全自由。
- negate:无论白色或黑色,占用或自由,语义应该是颠倒的(阈值的解释不受影响)。
- negate : Whether the white/black free/occupied semantics should be
reversed (interpretation of thresholds is unaffected)
(5)显示地图
在map文件夹下打开终端
rosrun map_server map_server map.yaml
如果遇到闪退,一般是,map.yaml文件里面加了多余的换行和或空格,删掉即可。
启动rviz
看来800×600图片不小啊,在进行路径规划的时候,太大的地图对算法的实时性要求会很高。
(6)简单地接收一下地图
#include <ros/ros.h>
#include "nav_msgs/OccupancyGrid.h"
void callback(const nav_msgs::OccupancyGridConstPtr& map)
{
int height = map->info.height;
int width = map->info.width;
std::cout << "receive map!" <<"height: " << height << " width: "<<width<<std::endl;
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "map_receiver");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("map",100,callback);
std::cout << "hahah" << std::endl;
ros::spin();
return 0;
}
参考文献:
[1]https://www.ncnynl.com/archives/201708/1897.html600
版权声明:本文为qq_43066145原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。