我有一个使用IR和Sonar传感器测量距离的机器人。我建立一个占用地图/网格。 到目前为止,我使用一个简单的基于整数的系统来“计算”一个单元被占用的概率。如果传感器命中,则为+1,对于0和传感器读数-1之间的所有呼叫,为-1。如果一个单元格的数组中的数字超过阈值,则单元格被计为已占用,而另一个单元格未被占用。所有之间都在不确定。 (有点复杂,但基于这个想法)
我现在想知道是否值得使用基于贝叶斯定理的解决方案(下面的第一个代码片段)。由于大多数人这样做,答案很可能是肯定的: - )。
在这个具体的例子中p1和p2是什么意思 - 比如说红外距离传感器?我理解定理解释时的例子。但不知何故,我无法将它们转换为红外传感器的情况。 (我的思绪有点卡在这里) 我不知道如何估计我应该放在那里的值以及如何将它们应用到我的数组/地图中。
如果有人可以开导我会很好:-) 如果以某种方式可能使用一些伪代码。
下面是我当前地图处理的课程。
由于 罗伯特
贝叶斯函数 - 但如何应用?
def pos(p0, p1, p2):
return (p0 * p1)/(p0 * p1 + (1-p0) * (1-p2))
def neg(p0, p1, p2):
return (p0 * (1-p1))/(p0 * (1-p1) + (1-p0) * p2)
我当前的Map类:
templateData = {
'MapWidth' : 800,
'MapHeight': 600,
'StartPosX' : 500,
'StartPosY' : 300,
'StartTheta' : 0,
'Resolution' : 5,
'mapThresholdFree' : 126,
'mapThresholdOcc' : 130,
'EmptyValue' : 128,
'mapMaxOcc' : 255,
'mapMaxFree' : 0,
'ServoPos' : 0,
'CurrentPosX' : 0,
'CurrentPosY' : 0,
'CurrentTheta' : 0
}
templateData["MapHeight"] = templateData["MapHeight"] / templateData["Resolution"]
templateData["MapWidth"] = templateData["MapWidth"] / templateData["Resolution"]
templateData["StartPosX"] = templateData["StartPosX"] / templateData["Resolution"]
templateData["StartPosY"] = templateData["StartPosY"] / templateData["Resolution"]
#map
map=robotmap.NewRobotMap(templateData["MapWidth"],templateData["MapHeight"], templateData["Resolution"], templateData["StartPosX"],templateData["StartPosY"], templateData["StartTheta"], templateData["ServoPos"],templateData["mapMaxOcc"],templateData["mapMaxFree"],templateData["EmptyValue"])
map.clear()
class NewRobotMap(object):
def __init__(self, sizeX, sizeY, Resolution, RobotPosX, RobotPosY, RobotTheta, ServoPos, mapMaxOcc, mapMaxFree, EmptyValue):
self.sizeX = sizeX
self.sizeY = sizeY
self.RobotPosX = int(RobotPosX)
self.RobotPosY = int(RobotPosY)
self.mapResolution = int(Resolution)
self.StartPosX = int(RobotPosX)
self.StartPosY = int(RobotPosY)
self.RobotTheta = float(RobotTheta)
self.EmptyValue = EmptyValue
self.ServoPos = ServoPos
self.mapMaxOcc = mapMaxOcc
self.mapMaxFree = mapMaxFree
def clear(self):
self.RobotMap = [[self.EmptyValue for i in xrange(self.sizeY)] for j in xrange(self.sizeX)]
def updateMap(self ,x ,y , Val):
oldval = self.RobotMap[x][y]
self.RobotMap[x][y]=self.RobotMap[x][y] + Val
if self.RobotMap[x][y] > self.mapMaxOcc:
self.RobotMap[x][y] = self.mapMaxOcc
elif self.RobotMap[x][y] < self.mapMaxFree:
self.RobotMap[x][y] = self.mapMaxFree
return oldval, self.RobotMap[x][y]
def updateRobot(self,theta,x,y):
self.RobotTheta = float(theta)
self.RobotPosX = int(round(self.StartPosX + float(int(x)/self.mapResolution), 0))
self.RobotPosY = int(round(self.StartPosY - float(int(y)/self.mapResolution),0))
def getRobotPos(self):
return self.RobotPosX, self.RobotPosY
def display(self):
s = [[str(e) for e in row] for row in self.RobotMap]
lens = [len(max(col, key=len)) for col in zip(*s)]
fmt = '\t'.join('{{:{}}}'.format(x) for x in lens)
table = [fmt.format(*row) for row in s]
print '\n'.join(table)
def updateServoPos(self, newServoPos):
self.ServoPos = newServoPos
答案 0 :(得分:0)
在pos
:
p0
是对象存在的先验概率。这可能需要事先知道地图中物体的密度。p1
是传感器命中的概率,因为物体在那里(IOW是真正的阳性)p2
是没有传感器命中的概率,因为物体不在那里(真正的负面)因此,1 - p2
是传感器命中的概率,因为物体不存在(误报)。此外,1 - p0
是没有对象存在的概率。如果我们将这些值插入贝叶斯规则,我们得到:
Pr(Object|Hit) = Pr(Hit|Object)Pr(Object) / ( Pr(Hit|Object)Pr(Object) + Pr(No Hit|Object)Pr(No Object)
= p1 * p0 / ( p1 * p0 + (1 - p2) * (1 - p0) )
您提供的pos()
功能。
注意:如果您事先不知道地图中对象的密度,可以使用p0 = 0.5
,在这种情况下,等式简化为:
Pr(Hit|Object) / ( Pr(Hit|Object) + Pr(No Hit|Object) )
= p1 / (p1 + (1-p2))