我的目标的一些背景知识

我正在构建一个移动自主机器人,该机器人必须在未知区域中导航,必须避开障碍物并接受语音输入以执行各种任务。它还必须识别人脸,物体等。我正在使用Kinect传感器和车轮里程计数据作为其传感器。我选择C#作为主要语言,因为官方驱动程序和sdk随时可用。我已经完成了视觉和NLP模块,并且正在研究导航部分。

我的机器人当前使用Arduino作为通信模块,并在笔记本电脑上将Intel i7 x64位处理器用作CPU。

这是机器人及其概述电子产品:





问题

我实现了一种简单的SLAM算法,该算法可从机器人获取位置编码器,然后将使用kinect(作为3D点云的2D切片)看到的内容添加到地图。

这是我房间当前的地图:



这是我实际房间的粗略表示:



如您所见,它们与众不同真的是很差的地图。


仅使用航位推算是可以预期的吗?
我知道粒子过滤器可以对其进行完善并准备实现,但是有什么方法呢?我可以改善这个结果吗?


更新


我忘了提到我目前的方法(我早些时候却忘记了)。我的程序大致做到了这一点:(我使用哈希表存储动态地图)


Kinect的Grab点云
等待输入的串行里程数据
使用基于时间戳的方法进行同步
使用Wikipedia上的方程式和编码器数据估算机器人姿态(x,y,theta)
获取点云的“切片”
我切片基本上是X和Z参数的数组
然后根据机器人姿势以及X和Z参数绘制这些点。
重复


#1 楼

这是预期的结果吗:原则上是。尽管您可能可以改进里程计模型,但总的来说,仅仅获得一张好的地图是不够的。没有对系统的描述,很难说如何进行改进。在大多数系统上,转换估计比旋转更好。您可以添加陀螺仪并测量旋转。

您可以使用SLAM实现,而不是自己实现粒子过滤器。来自openslam。这样可以节省大量时间,并且很可能会带来更好的结果。

评论


$ \ begingroup $
说出:D会让您感觉更好,但我确实相信自己的里程表非常好(特别是轮换:D)。我添加了一个简短描述系统的更新(如果还不够,我可以给您代码或任何其他信息)。我明天将尝试使用陀螺仪,然后更新结果。我很想使用openslam的算法,但是我使用的是C#(以便可以使用官方的SDK),并且大多数用于此类任务的库都在C ++中或在ROS中提供(仅Linux)。我当然会喜欢使用它们,但是我看不到尖锐的东西!
$ \ endgroup $
– Shreyas Kapur
2013年6月11日14:50



$ \ begingroup $
tinyslam声称使用200行c代码。我想将其移植到C#并不难。
$ \ endgroup $
–雅各布
2013年6月12日15:53



$ \ begingroup $
哇!但是我猜它不使用任何粒子过滤器,并且做我正在做的相同的事情。但是我一定会尝试实现这一点。非常感谢 :-)
$ \ endgroup $
– Shreyas Kapur
2013年6月12日在16:42



#2 楼

我建议您尝试使用粒子过滤器/ EKF。 。

->连续本地化:您大致知道自己在地图上的位置。

如果您没有参考,也不知道自己在地图上的位置,无论采取什么行动,都会发现很难获得完美的地图。
例如:
您在圆形房间里。您一直在前进。您知道您的最后一步。您获得的地图将是类似直箱形结构的地图。除非并且直到您有某种方法可以连续进行定位或准确知道地图上的确切位置,否则这种情况会发生。但是,必须以起点为基准。

评论


$ \ begingroup $
感谢您的回答,确实是一个非常好的示例,我肯定会使用EKF,但是问题是我在数学上并不差,但是也不太好,而且我正在使用C#,所以我没有任何东西库和自己实施它会花费我很多时间。有什么建议吗?
$ \ endgroup $
– Shreyas Kapur
2013年6月12日14:06

$ \ begingroup $
精通数学并学习一些课程,而不是做一些您不了解且无法调试的事情。学习并实施。将来肯定会有用。
$ \ endgroup $
–那雷什
2013年6月12日14:44

$ \ begingroup $
还可以在github上查找C#实现。该作品比看起来更受欢迎。
$ \ endgroup $
–那雷什
2013年6月12日15:02

$ \ begingroup $
感谢您的建议,明天一定会做。我正在努力学习数学,并希望能做到,并确保它将走很长一段路。我今年13岁,这是在这里学习的瓶颈,我们甚至还没有在学校里认识矩阵! :-(
$ \ endgroup $
– Shreyas Kapur
13年6月12日在16:41

$ \ begingroup $
我知道你13岁:)互联网不在乎。您可以从可汗学院(Khan Academy)领取矩阵。概率统计也是如此。
$ \ endgroup $
–那雷什
2013年6月12日16:47



#3 楼

因为您使用的是推算法,所以估算机器人姿势时的错误会及时累积。根据我的经验,过了一会儿,航位推测姿势估计变得毫无用处。如果您使用额外的传感器,例如陀螺仪或加速度计,则姿势估计会有所改善,但是由于您在某些时候没有反馈,因此它会像以前一样发散。结果,即使您有来自Kinect的良好数据,由于姿势估计无效,也难以构建准确的地图。

您需要在尝试同时定位机器人的位置建立您的地图(SLAM!)。因此,在创建地图时,同一地图也用于定位机器人。这样可以确保您的姿势估计不会发散,并且地图质量应该更好。因此,我建议研究一些SLAM算法(即FastSLAM)并尝试实现自己的版本。

评论


$ \ begingroup $
感谢您的回答:-)。我确实认识到航位推算是错误的,但是我建立的地图规模很小。我慢慢地移动机器人,以最大程度地减少错误,机器人没有移动太多。我实际上已经从openslam学习了很多SLAM算法,但是正如我对Naresh所说,“我在数学方面并不差,但是也不太好,而且我正在使用C#,因此我没有任何库并实现它我自己会花我很长时间。”有什么建议吗?
$ \ endgroup $
– Shreyas Kapur
2013年6月12日14:10

$ \ begingroup $
您是否对Kinect数据进行任何后期处理?数据中可能包含一些噪声,如果不对其进行处理,可能会使地图无效。尝试使问题变得简单。让机器人静止不动,并在其前面绘制墙壁。现在如何运作?如果地图清晰可见,则表示问题是由于移动而发生的。如果没有,那么问题就更根本了。
$ \ endgroup $
–德米特
2013年6月13日5:00