c++ - 存储网格的数据结构(将具有负索引)

标签 c++ data-structures ros robotics

我正在大学学习机器人技术,我必须实现自己的 SLAM 算法。为此,我将使用 ROS、Gazebo 和 C++。

我对必须使用什么数据结构来存储 map (以及我要存储什么,但这是另一个故事)有疑问。

我曾想过将 map 表示为 2D 网格,机器人的起始位置是 (0,0)。但我不知道我必须绘制 map 的机器人到底在哪里。它可能在左上角,在世界的中间,或者在世界上任何其他未知的位置。

网格的每个单元格均为 1x1 米。我将使用激光来知道障碍物在哪里。使用当前机器人的位置,我将在代表障碍物的所有单元格上设置为 1。例如,它激光检测到机器人前方2米处的障碍物,我将把(0,2)处的单元设置为1。

使用 vector 或二维矩阵,这是一个问题,因为 vector 和矩阵索引从 0 开始,并且机器人后面可能有更多空间可以映射。该房间将在 (-1,-3) 处有一个障碍物。

在这个数据结构上,我需要存储有障碍物的单元格和我知道它们是自由的单元格。

我必须使用哪种数据结构?

更新:

存储 map 的过程如下:

  1. 机器人从 (0,0) 单元格开始。它将检测障碍物并将其存储在 map 中。
  2. 机器人移动到 (1,0) 单元格。再次检测并存储 map 中的障碍物。
  3. 继续移动到空闲单元并存储它发现的障碍。

机器人将检测其前方和两侧的障碍物,但不会检测其后方的障碍物。

当机器人检测到负单元格上的障碍物(例如(0,-1))时,我的问题就出现了。如果我之前只将障碍物存储在“正”单元格上,我不知道如何存储该障碍物。所以,也许是“偏移”,它不是这里的解决方案(或者也许我错了)。

最佳答案

您可以在此处编写来帮助您:

class RoboArray 
{
     constexpr int width_ = ...
     constexpr int height_ = ...
     Cell grid_[width_ * 2][height_ * 2];
     ...
 public:
     ...
     Cell get(int x, int y) // can make this use [x][y] notation with a helper class
     {
           return grid_[x + width_][y + height];
     }
     ...
}

关于c++ - 存储网格的数据结构(将具有负索引),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57675404/

相关文章:

python - ROS python 错误 "The manifest (with format version 2) must not contain the following tags: run_depend"

linux - 在 Raspberry Pi 中使用 bcm2835 库作为非 root 的 PWM

c++ - 使用异步 C++ 进行 vector 的并行乘法

data-structures - 无缓存数据结构和动态语言——有效吗?

c++ - 赋值运算符是否调用复制构造函数?

data-structures - Rust 中的数据结构

C中的循环缓冲区实现

c++ - 使用 pcl::ExtractIndices(pcl、ROS、catkin)在 main 之前出现段错误

c++ - 如何将 char* 转换为 char 数组

c++ - 初始化 asio::ip::address_v6() 的最快方法?