我已经能够计算出极坐标直方图,如本文所述,以及消除噪音的平滑功能。该变量存储在一个名为
self.Hist
的numpy数组中。在极坐标直方图中,其障碍物密度低于某个阈值)不包含完整圆圈的部分,即与computeTheta
对应的扇区。 如果直方图在
360º
和330º
之间的角度中包含一个峰值,而其他直方图为谷值,则将正确计算转向方向。但是,如果峰值位于
30º
和30º
之间,那么谷值将从60º
开始,一直超过60º
,直到360º
结束,并且转向方向计算不正确,因为这单个山谷将被视为两个山谷leys,一个在30º
和0º
之间,另一个在30º
和60º
之间。 />我该如何解决这个问题?有没有办法将直方图视为圆形? 谢谢您的宝贵时间。
#1 楼
我很难遵循您的代码,部分是因为我不了解Python,但主要是因为我不确定我是否理解您的变量。就是说,我想我确实了解您的问题。我要解决的方法是在评估之前先“扭曲”数据,然后做出决定,然后“扭曲”输出。例如,考虑下面的伪代码:希望我已经清楚了这一点;请参见下面的伪代码。基本上,调整数据的方向,使您始终从高峰开始。这样可以确保山谷始终以<= 360度结束。然后,一旦找到标题,就根据您将数据开始移动的距离进行移动。
评论
$ \ begingroup $
作为评论,我假设标题将是一个标志或类似的位/字节数组,与您的直方图变量对应1:1。如果只是角度,则需要根据步数乘以直方图字段中的点之间的角度步数进行转换。
$ \ endgroup $
–卡盘
16-2-17在14:51
$ \ begingroup $
因此,我使用numpy.roll()函数进行了尝试,围绕密度最高的索引旋转了直方图,并且成功了!非常感谢你! :D
$ \ endgroup $
–银行C.
16年2月19日在15:25
#2 楼
因为您使用的是Python的arctan2函数(返回值在$ [-\ pi,\ pi] $之间),所以我不明白为什么需要使用if target_sector < 0:
target_sector += 360
评论
$ \ begingroup $
你说的很好。这基本上是“调试糖”;我做了一些事情,以使我在运行时更容易读出外壳上的角度。我可能会在最终版本中将其删除。
$ \ endgroup $
–银行C.
16-2-17在15:17
$ \ begingroup $
这不是引起您算法错误的原因,当您从较大的山谷角开始搜索时,该算法会导致您向期望的方向旋转360度?
$ \ endgroup $
– SteveO
16年2月17日在16:54
$ \ begingroup $
我尝试删除此部分并进行了相关更改,但仍然基本相同。这些线基本上仅将负角度(例如-30度)转换为正角度(例如330度)。当我删除这行代码时,实际上发生的事情是我使用诸如self.Hist [-1]之类的结构访问了数组。圆度仍然是一个问题。
$ \ endgroup $
–银行C.
16-02-17 '17:47
评论
请问每次极坐标直方图的执行时间有多快?