二维占据栅格内存模型
更多...
#include <rmvl/nav/map.hpp>
|
| | 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::OccupancyGrid & | message () 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< Cell > | worldToMap (double world_x, double world_y) const noexcept |
| | 将世界坐标转换为栅格坐标
|
| std::optional< msg::Point > | mapToWorld (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::OccupancyGridUpdate > | pendingUpdate () const |
| | 获取尚未清除的本地地图增量
|
| void | clearPendingUpdate () noexcept |
| | 清除本地增量记录,不修改地图内容和版本
|
二维占据栅格内存模型
- 数据采用 row-major 布局,索引为 y * width + x
- 栅格值 -1 表示未知,0 表示空闲,100 表示占据
- 世界坐标转换支持带平移和偏航角的地图原点
- 每次成功且实际改变地图内容的本地 API 调用视为一次修改,版本递增 1
- 一次调用即使修改多个栅格也只递增一次版本
- 合并矩形增量时采用消息携带的目标版本
- 注解
- 该类不提供内部同步。跨线程访问时由调用方加锁。
◆ GridMap() [1/3]
| rm::nav::GridMap::GridMap |
( |
| ) |
|
◆ GridMap() [2/3]
◆ GridMap() [3/3]
◆ apply()
◆ at()
| std::optional< int8_t > rm::nav::GridMap::at |
( |
uint32_t | x, |
|
|
uint32_t | y ) const |
|
noexcept |
获取指定栅格值
- 参数
-
- 返回
- 不存在或地图无效时返回 std::nullopt,否则返回栅格值
◆ clearPendingUpdate()
| void rm::nav::GridMap::clearPendingUpdate |
( |
| ) |
|
|
noexcept |
◆ contains()
| bool rm::nav::GridMap::contains |
( |
uint32_t | x, |
|
|
uint32_t | y ) const |
|
noexcept |
判断栅格坐标是否在地图范围内
- 参数
-
- 返回
- 栅格坐标是否在地图范围内
◆ 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 ) |
融合一条世界坐标射线
清除射线途经栅格。当 hit 为 true 且终点位于地图内时,将终点更新为占据。 射线允许从地图外进入或离开地图,并会自动裁剪至地图边界。
- 参数
-
| [in] | start_x | 射线起点的世界坐标 X,单位为米 |
| [in] | start_y | 射线起点的世界坐标 Y,单位为米 |
| [in] | end_x | 射线终点的世界坐标 X,单位为米 |
| [in] | end_y | 射线终点的世界坐标 Y,单位为米 |
| [in] | hit | 终点是否观测到障碍 |
| [in] | free_probability | 射线途经栅格为空闲的观测概率 |
| [in] | occupied_probability | 射线终点被占据的观测概率 |
- 返回
- 地图操作状态
◆ mapToWorld()
| std::optional< msg::Point > rm::nav::GridMap::mapToWorld |
( |
uint32_t | x, |
|
|
uint32_t | y ) const |
|
noexcept |
获取栅格中心的世界坐标
- 参数
-
- 返回
- 栅格有效时返回世界坐标,否则返回 std::nullopt
◆ message()
◆ pendingUpdate()
获取尚未清除的本地地图增量
- 返回
- 存在本地修改时返回覆盖全部修改的最小矩形增量,否则返回 std::nullopt
- 注解
- 增量范围从上次全量装载、远端增量合并或 clearPendingUpdate() 之后开始累计。
◆ reset() [1/2]
◆ reset() [2/2]
移动装载并校验一张全量地图
- 参数
-
- 返回
- 地图装载状态
◆ 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 表示占据 |
- 返回
- 地图操作状态
◆ 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]\) |
- 返回
- 地图操作状态
◆ 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