nav_msgs::OccupancyGrid数据格式详解

nav_msgs::OccupancyGrid数据格式详解

可以先查看一下ros官网关于nav_msgs::OccupancyGrid数据格式的解释,我应用的时候,感觉还有一些不清楚的地方,所以我自己做了个实验,大家可以参考一下我对下面参数的理解,如有问题请告知。

主要是涉及实际地图与栅格地图单位的问题,实际地图的单位一般为m,栅格地图单位为一格,有些参数没讲清楚。

以比例尺为0.5,地图栅格大小为20×20,地图实际大小为10m×10m的地图举例说明:
nav_msgs::OccupancyGrid组成包括三个部分:

std_msgs/Header header
nav_msgs/MapMetaData info   
int8[] data      一维数组,数组中的数据为对应栅格的占用概率,范围[1,100],概率越大,
                 说明该点越有可能是障碍点,-1表示位置区域,数组元素的序列号计算为:
                 实际地图中某点坐标为(x,y)[单位m],先转换为栅格右上角为原点的坐标,
                 即mx=(x-map.info.origin.x)/map.info.resolution,my=(y-map.info.origin.y)/map.info.resolution
                 对应栅格地图中坐标为[my*map.info.height+mx]。

下面重点讲一下nav_msgs/MapMetaData info数据格式,包括下面几个部分:

time map_load_time   //地图加载所需时间
float32 resolution   //比例尺,代表一个栅格在实际地图中的大小,比例尺为0.5,说明一个栅格长度为0.5m
uint32 width         //地图宽度,这里指的是栅格数量,不是指实际长度,也就是20,不是10
uint32 height        //同地图宽度
geometry_msgs/Pose origin  //地图原点所在位置,单位m

简单讲一下std_msgs/Header header数据格式:

uint32 seq       //帧序列号,会不断增长
time stamp     //时间戳,做数据融合时会用到
string frame_id  //地图参考的坐标系,比如我代码里参考的坐标系是真实地图下的odom坐标系

geometry_msgs/Pose origin 数据格式也有必要做一下说明,包含两个数据:

geometry_msgs/Point position    //栅格地图原点在真实地图下的坐标,x,y,z,
                                  指栅格点对应的实际位置坐标,单位为m,比如我设置的的
                                  原点为-10,0,则栅格原点在真实地图(-10,0)位置,即栅格
                                  地图整体向x轴负方向移动10m,由于比例尺为0.5,实际移动了20个栅格
geometry_msgs/Quaternion orientation  //坐标轴朝向,四元数表示,这个不讲,真实地图和栅格地图一样。

再说明一下rviz中地图的放置方法,栅格地图中有geometry_msgs/Pose origin数据,代表栅格地图原点在string frame_id (地图参考坐标系)下的坐标和朝向。将地图原点放到参考系对应坐标,地图坐标系/map旋转到对应朝向,其他点按栅格地图的位置关系放置。这里要分清给的坐标是相对与栅格地图/map坐标系下的坐标还是相对于真实地图/odom下的坐标。

下面是我的测试代码:

#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
#include "nav_msgs/OccupancyGrid.h"

int main(int argc, char * argv[]) {

  ros::init(argc, argv, "gridMap");

  ros::NodeHandle nh;

  ros::Publisher pub = nh.advertise<nav_msgs::OccupancyGrid>("/gridMap1", 1);
  nav_msgs::OccupancyGrid map;

  map.header.frame_id="odom";
  map.header.stamp = ros::Time::now(); 
  map.info.resolution = 0.5;         // float32
  map.info.width      = 20;           // uint32
  map.info.height     = 20;           // uint32
  map.info.origin.position.x = -10.0;
  map.info.origin.position.y = 0.0;
  map.info.origin.position.z = 0.0;
  map.info.origin.orientation.x = 0.0;
  map.info.origin.orientation.y = 0.0;
  map.info.origin.orientation.z = 0.0;
  map.info.origin.orientation.w = 0.0;


  
  int p[map.info.width*map.info.height] = {-1};   // [0,100]
  p[10] = 100;
  std::vector<signed char> a(p, p+400);
  map.data = a;

  while (ros::ok())
  {
      pub.publish(map);
  }

  ros::shutdown();
  return 0;
}


  • 26
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: nav_msgs::OccupancyGrid是ROS中的一种消息类型,用于表示一个二维的栅格地图,其中每个栅格都有一个占据概率值,表示该栅格被占据的可能性。这种消息类型通常用于机器人导航和路径规划等应用中。 ### 回答2: nav_msgs::occupancygrid是ROS中的一个消息类型,用于表示一个二维的占据栅格地图。在ROS中,占据栅格地图是机器人导航和定位系统中常用的一种表示方式。 nav_msgs::occupancygrid消息包含了以下重要成员变量: - header:用于存储消息的元数据,如时间戳和坐标系信息。 - info:描述了栅格地图的元数据,包括地图的分辨率、宽度、高度、原点位置等。 - data:一个一维int8数组,存储了每个栅格的占据状态。每个栅格的值可以是-1、0或100,分别表示未知、空闲或占据状态。 占据栅格地图是通过将环境划分为一个个离散的方格(即栅格)来表示。每个栅格存储了该区域的占据状态,用于判断机器人在环境中的导航和避障。栅格地图通常被构建为二值化的图像,其中每个栅格要么为空闲,要么被占据。在导航中,栅格地图可以用于规划路径、避障和定位。 nav_msgs::occupancygrid消息可被用于ROS中的多种导航和避障算法,如SLAM(同时定位与地图构建)、路径规划算法等。该消息可通过ROS的发布-订阅模型进行传递,发布方可以将栅格地图发布到特定的话题,订阅方可以通过订阅该话题获取栅格地图数据,从而进行相关的导航和避障计算。 总之,nav_msgs::occupancygrid是ROS中用于表示占据栅格地图的消息类型,可用于机器人导航和避障中的路径规划、避障等算法。 ### 回答3: nav_msgs::OccupancyGrid(地图占据格子)是ROS(机器人操作系统)中的消息类型之一。它提供了一个在机器人导航中广泛使用的二维地图表示。 这个消息类型定义了一个二维网格地图,其中每个单元格表示地图上的一个位置。每个单元格可以包含三个值之一:-1、0或100。-1表示表示该位置是未知的,0表示该位置是自由的,即可通过的,100表示该位置是被占据的,即不可通过的。其可以通过一个多维数组来表示。每个元素代表了一个地图格子上的状态。 nav_msgs::OccupancyGrid还包含有关地图的一些基本信息,例如地图的原点、分辨率和宽度等。原点是地图坐标系的起始点,通过它可以将地图的位置与其他坐标系进行对齐。分辨率表示每个格子的大小,以米为单位。宽度表示地图在水平方向上的格子数量。 通过使用nav_msgs::OccupancyGrid消息,机器人可以获取到其周围环境的地图信息,并根据该信息进行路径规划和导航。当机器人需要行驶时,可以根据当前位置和目标位置,以及地图信息,使用导航算法来计算最佳路径,并在移动过程中检测可能的障碍物。 总之,nav_msgs::OccupancyGrid消息类型是用于表示机器人导航中的二维地图信息的一种常用ROS消息类型,它提供了地图格子的状态信息,并允许机器人进行路径规划和导航。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值