我正在大学学习机器人技术,我必须实现自己的 SLAM 算法。为此,我将使用 ROS、Gazebo 和 C++。
我对必须使用什么数据结构来存储 map (以及我要存储什么,但这是另一个故事)有疑问。
我曾想过将 map 表示为 2D 网格,机器人的起始位置是 (0,0)。但我不知道我必须绘制 map 的机器人到底在哪里。它可能在左上角,在世界的中间,或者在世界上任何其他未知的位置。
网格的每个单元格均为 1x1 米。我将使用激光来知道障碍物在哪里。使用当前机器人的位置,我将在代表障碍物的所有单元格上设置为 1。例如,它激光检测到机器人前方2米处的障碍物,我将把(0,2)处的单元设置为1。
使用 vector 或二维矩阵,这是一个问题,因为 vector 和矩阵索引从 0 开始,并且机器人后面可能有更多空间可以映射。该房间将在 (-1,-3) 处有一个障碍物。
在这个数据结构上,我需要存储有障碍物的单元格和我知道它们是自由的单元格。
我必须使用哪种数据结构?
更新:
存储 map 的过程如下:
- 机器人从 (0,0) 单元格开始。它将检测障碍物并将其存储在 map 中。
- 机器人移动到 (1,0) 单元格。再次检测并存储 map 中的障碍物。
- 继续移动到空闲单元并存储它发现的障碍。
机器人将检测其前方和两侧的障碍物,但不会检测其后方的障碍物。
当机器人检测到负单元格上的障碍物(例如(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/