python - 让机器人指向正确的方向
问题描述
我正在用无线电从基站指挥机器人。基站使用机器人上的 AR 标签(使用 openCV)从头顶摄像头获取位置/方向信息。此外,base 根据位置信息计算机器人到达目标所需的路径(A*,每个网格在相机中为 30 x 30 像素)。我的机器人只能左/右(在其中心点)和前进/后退。机器人包括一个带有两个乐高 NXT 电机的 Arduino Uno。
我使用以下代码让机器人指向正确的方向。然而,当机器人接近它应该行进的角度时,它不会停止前进,而是试图无限地固定它的方向。
def correctOrientation(self, rx: int, ry: int):
#returns direction robot needs to point.
direction = self.getDirection((self.sx, self.sy), (rx, ry))
#method to stop robot.
self.comms.stop()
anglediff = (self.angle - direction + 180 + 360) % 360 - 180
while not (abs(anglediff) < 15):
#Decides which way to turn.
if self.isTurnLeft(self.angle, direction):
self.comms.turnLeft()
else:
self.comms.turnRight()
#Put sleeps because there is a delay in camera feed. Allows it to get the location right
time.sleep(0.3)
self.comms.stop()
#Updates position
self.getPos()
time.sleep(1)
#Calculates orientation of robot and updates it
self.angle = self.calcOrientation()
anglediff = (self.angle - direction + 180 + 360) % 360 - 180
print(anglediff)
time.sleep(1)
我使用的辅助函数。我通过使用机器人上已知的两个点并在这两个点之间画一条线来计算机器人的方向。因此,线变得与方向平行。
def isTurnLeft(self, angle, touchAngle):
diff = touchAngle - angle
if diff < 0:
diff += 360
if diff < 180:
return False
else:
return True
def calcOrientation(self) -> float:
return self.getDirection(self.marker[0], self.marker[3])
def getDirection(self, source: Tuple[int], target: Tuple[int]) -> float :
return (math.degrees(math.atan2(target[1] - source[1], target[0] - source[0]))+360)%360
我不知道我的代码在逻辑上是否有问题。如果是这样,我该怎么办?如果代码没问题并且问题是系统的延迟/设置,我可以控制机器人的其他方法是什么?
感谢您的帮助。
解决方案
通过更改AR标签识别的图像库解决了这个问题。我们为一台机器人使用了 2 个标签。它明显较慢并且容易检测到两个标签。将其更新为只有一个标签。此外,从基于角度的计算切换到基于矢量的计算,这更容易理解。
推荐阅读
- python - Pytorch CNN 训练中的“RuntimeError: expected scalar type Double but found Float”
- python - 如何压缩非迭代
- image - 在谷歌表格中插入图片数量是否有限制
- flutter - 如何使 Card() 在颤动中领先、标题、尾随固定位置
- angular - 警告:清理不安全的 URL 值数据:text/html;base64,
- python - Pytorch nn.Linear RuntimeError: mat1 dim 1 必须匹配 mat2 dim 0
- laravel - 多对多数据透视表上的自定义范围
- flutter - 断言失败:第 19 行第 16 行:'纬度!= null':不正确。颤振错误
- javascript - 我可以用更新的 Object.fromEntries(new FormData(form)) 替换表单元素循环解析吗?
- sql-server - SQL Server:连接到服务器时出现错误 26