ROS自学实践(11):利用map_server功能包创建自己的地图

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

  • 11
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值