RMVL  2.5.0-dev
Robotic Manipulation and Vision Library
载入中...
搜索中...
未找到

二维占据栅格内存模型 更多...

#include <rmvl/nav/map.hpp>

rm::nav::GridMap 的协作图:

Public 成员函数

 GridMap ()
 构造空地图
 GridMap (const msg::OccupancyGrid &grid)
 使用全量占据栅格构造地图
 GridMap (msg::OccupancyGrid &&grid)
 使用全量占据栅格移动构造地图
MapStatus reset (const msg::OccupancyGrid &grid)
 装载并校验一张全量地图
MapStatus reset (msg::OccupancyGrid &&grid)
 移动装载并校验一张全量地图
bool valid () const noexcept
const msg::OccupancyGridmessage () const noexcept
uint32_t width () const noexcept
uint32_t height () const noexcept
std::string_view frameId () const noexcept
double resolution () const noexcept
uint64_t revision () const noexcept
bool contains (uint32_t x, uint32_t y) const noexcept
 判断栅格坐标是否在地图范围内
std::optional< CellworldToMap (double world_x, double world_y) const noexcept
 将世界坐标转换为栅格坐标
std::optional< msg::PointmapToWorld (uint32_t x, uint32_t y) const noexcept
 获取栅格中心的世界坐标
std::optional< int8_t > at (uint32_t x, uint32_t y) const noexcept
 获取指定栅格值
MapStatus set (uint32_t x, uint32_t y, int8_t value) noexcept
 设置指定栅格值
MapStatus updateProbability (uint32_t x, uint32_t y, double probability) noexcept
 使用一次占据概率观测更新指定栅格
MapStatus integrateRay (double start_x, double start_y, double end_x, double end_y, bool hit=true, double free_probability=0.3, double occupied_probability=0.7)
 融合一条世界坐标射线
MapStatus apply (const msg::OccupancyGridUpdate &update)
 合并矩形地图增量
std::optional< msg::OccupancyGridUpdatependingUpdate () const
 获取尚未清除的本地地图增量
void clearPendingUpdate () noexcept
 清除本地增量记录,不修改地图内容和版本

友元

class Costmap

详细描述

二维占据栅格内存模型

  • 数据采用 row-major 布局,索引为 y * width + x
  • 栅格值 -1 表示未知,0 表示空闲,100 表示占据
  • 世界坐标转换支持带平移和偏航角的地图原点
  • 每次成功且实际改变地图内容的本地 API 调用视为一次修改,版本递增 1
  • 一次调用即使修改多个栅格也只递增一次版本
  • 合并矩形增量时采用消息携带的目标版本
    注解
    该类不提供内部同步。跨线程访问时由调用方加锁。

构造及析构函数说明

◆ GridMap() [1/3]

rm::nav::GridMap::GridMap ( )

构造空地图

◆ GridMap() [2/3]

rm::nav::GridMap::GridMap ( const msg::OccupancyGrid & grid)
explicit

使用全量占据栅格构造地图

参数
[in]grid全量占据栅格消息
备注
输入无效时构造为空地图,可使用 valid() 检查。

◆ GridMap() [3/3]

rm::nav::GridMap::GridMap ( msg::OccupancyGrid && grid)
explicit

使用全量占据栅格移动构造地图

参数
[in]grid全量占据栅格消息
备注
输入无效时构造为空地图,可使用 valid() 检查。
函数调用图:

成员函数说明

◆ apply()

MapStatus rm::nav::GridMap::apply ( const msg::OccupancyGridUpdate & update)

合并矩形地图增量

参数
[in]update待合并的矩形增量消息
返回
地图操作状态
备注
合并成功后采用 update 携带的目标版本。
合并失败时保持地图数据和版本不变。
函数调用图:

◆ at()

std::optional< int8_t > rm::nav::GridMap::at ( uint32_t x,
uint32_t y ) const
noexcept

获取指定栅格值

参数
[in]x栅格横向索引
[in]y栅格纵向索引
返回
不存在或地图无效时返回 std::nullopt,否则返回栅格值
函数调用图:

◆ clearPendingUpdate()

void rm::nav::GridMap::clearPendingUpdate ( )
noexcept

清除本地增量记录,不修改地图内容和版本

函数调用图:

◆ contains()

bool rm::nav::GridMap::contains ( uint32_t x,
uint32_t y ) const
noexcept

判断栅格坐标是否在地图范围内

参数
[in]x栅格横向索引
[in]y栅格纵向索引
返回
栅格坐标是否在地图范围内
函数调用图:

◆ frameId()

std::string_view rm::nav::GridMap::frameId ( ) const
noexcept
返回
占据地图所属坐标系,无效地图返回空字符串
函数调用图:

◆ height()

uint32_t rm::nav::GridMap::height ( ) const
noexcept
返回
地图高度,单位为格
函数调用图:

◆ integrateRay()

MapStatus rm::nav::GridMap::integrateRay ( double start_x,
double start_y,
double end_x,
double end_y,
bool hit = true,
double free_probability = 0.3,
double occupied_probability = 0.7 )

融合一条世界坐标射线

清除射线途经栅格。当 hittrue 且终点位于地图内时,将终点更新为占据。 射线允许从地图外进入或离开地图,并会自动裁剪至地图边界。

参数
[in]start_x射线起点的世界坐标 X,单位为米
[in]start_y射线起点的世界坐标 Y,单位为米
[in]end_x射线终点的世界坐标 X,单位为米
[in]end_y射线终点的世界坐标 Y,单位为米
[in]hit终点是否观测到障碍
[in]free_probability射线途经栅格为空闲的观测概率
[in]occupied_probability射线终点被占据的观测概率
返回
地图操作状态
备注
一次调用可能修改多个栅格,但只作为一次地图修改,版本最多递增 1。
函数调用图:

◆ mapToWorld()

std::optional< msg::Point > rm::nav::GridMap::mapToWorld ( uint32_t x,
uint32_t y ) const
noexcept

获取栅格中心的世界坐标

参数
[in]x栅格横向索引
[in]y栅格纵向索引
返回
栅格有效时返回世界坐标,否则返回 std::nullopt
函数调用图:

◆ message()

const msg::OccupancyGrid & rm::nav::GridMap::message ( ) const
noexcept
返回
当前全量地图消息的常引用
函数调用图:

◆ pendingUpdate()

std::optional< msg::OccupancyGridUpdate > rm::nav::GridMap::pendingUpdate ( ) const

获取尚未清除的本地地图增量

返回
存在本地修改时返回覆盖全部修改的最小矩形增量,否则返回 std::nullopt
注解
增量范围从上次全量装载、远端增量合并或 clearPendingUpdate() 之后开始累计。
函数调用图:

◆ reset() [1/2]

MapStatus rm::nav::GridMap::reset ( const msg::OccupancyGrid & grid)

装载并校验一张全量地图

参数
[in]grid全量占据栅格消息
返回
地图装载状态
备注
校验失败时保持原地图不变。
函数调用图:

◆ reset() [2/2]

MapStatus rm::nav::GridMap::reset ( msg::OccupancyGrid && grid)

移动装载并校验一张全量地图

参数
[in]grid全量占据栅格消息
返回
地图装载状态
备注
校验失败时保持原地图不变。
函数调用图:

◆ resolution()

double rm::nav::GridMap::resolution ( ) const
noexcept
返回
地图分辨率,单位为米/格
函数调用图:

◆ revision()

uint64_t rm::nav::GridMap::revision ( ) const
noexcept
返回
当前地图版本
函数调用图:

◆ set()

MapStatus rm::nav::GridMap::set ( uint32_t x,
uint32_t y,
int8_t value )
noexcept

设置指定栅格值

当栅格值实际发生变化时,本次调用作为一次地图修改,版本递增 1。

参数
[in]x栅格横向索引
[in]y栅格纵向索引
[in]value栅格值,-1 表示未知,0 表示空闲,100 表示占据
返回
地图操作状态
备注
value 与原值相同时不修改地图,版本保持不变。
函数调用图:

◆ updateProbability()

MapStatus rm::nav::GridMap::updateProbability ( uint32_t x,
uint32_t y,
double probability )
noexcept

使用一次占据概率观测更新指定栅格

未知栅格以 0.5 为先验,使用赔率相乘完成贝叶斯更新

参数
[in]x栅格横向索引
[in]y栅格纵向索引
[in]probability本次观测为占据的概率,范围为 \([0,\,1]\)
返回
地图操作状态
备注
仅当融合结果改变栅格值时,地图版本递增 1。
函数调用图:

◆ valid()

bool rm::nav::GridMap::valid ( ) const
noexcept
返回
地图是否已装载且有效
函数调用图:

◆ width()

uint32_t rm::nav::GridMap::width ( ) const
noexcept
返回
地图宽度,单位为格
函数调用图:

◆ worldToMap()

std::optional< Cell > rm::nav::GridMap::worldToMap ( double world_x,
double world_y ) const
noexcept

将世界坐标转换为栅格坐标

参数
[in]world_x世界坐标 X,单位为米
[in]world_y世界坐标 Y,单位为米
返回
坐标位于地图内时返回离散栅格,否则返回 std::nullopt
函数调用图:

◆ Costmap

friend class Costmap
friend