我目前正在研究一个Pepper机器人。该项目旨在欢迎实验室的访客,并引导他们到他想看的办公室/老师。 要做到这一点,我需要让Pepper创建她的环境地图并定位自己。
我遇到了两个问题:
- 地图的质量,
- 使用此地图进行导航。
一个好的导航意味着一个好的地图,但即使周围只有可用空间,Pepper也无法在上面导航。
我使用软银的:
- 齐图书馆(http://doc.aldebaran.com/2-4/dev/python/install_guide.html),
- 函数(http://doc.aldebaran.com/2-5/naoqi/motion/alnavigation-api.html)
以下是我拥有的地图(请注意地板反射光线):黑色是自由空间 - 白色是障碍物
- 当灯亮起时, 开灯的环境
- 当灯熄灭时 关灯的环境
为了更好的地图,我进入了一个房间,地板上没有反射(地毯地板),这是我的地图 地毯地板 地毯地板灯亮着 (环境变了,但有一些想象力可以安静地识别)
目前我无法在地毯地板上测试导航,但在前两张地图上,Pepper 的移动是完全不正确的。此外,定位给了我椭圆误差 2 米宽,3 米长,在 5 米的勘探中。
所以我的问题是:
- 我做错了什么吗? 我
- 怎样才能解决我的问题?
- 这是我第一次体验导航,我期望太多了吗? 还是软银的功能效率不高?
我的代码探索:
PepperSpeech = session.service("ALTextToSpeech")
PepperSpeech.say("Connexion")
PepperNavig = session.service("ALNavigation")
PepperMvt = session.service("ALMotion")
PepperMvt.wakeUp()
PepperSpeech.say("Lancement de l'exploration")
state = PepperNavig.explore(5.0)
print(state)
PepperSpeech.say("Exploration terminee")
time.sleep(2)
PepperNavig.stopExploration()
path = PepperNavig.saveExploration()
print(path)
time.sleep(2)
PepperSpeech.say("sauvegarde terminee")
loadingsuccess = PepperNavig.loadExploration(path)
print(loadingsuccess)
CurrentMap = PepperNavig.getMetricalMap()
fichier = open("Map5m312Obst.txt", "w")
print(type(CurrentMap))
print(type(CurrentMap[0]))
formatted = [format(v) for v in CurrentMap]
fichier.write(str(formatted))
fichier.close()
我的导航代码:
adress = str("/home/nao/.local/share/Explorer/2018-01-18T084351.874Z.explo")
etat = PepperNavig.loadExploration(adress)
print("etat load :")
print(etat)
Map = PepperNavig.getMetricalMap()
PepperNavig.startLocalization()
PepperNavig.relocalizeInMap([0, 0, 0])
id = PepperNavig.navigateToInMap([0, -1, 0])
PepperNavig.wait(id)
pose1 = PepperNavig.getRobotPositionInMap()
print("pose1 = " + str(pose1))
time.sleep(5)
id = PepperNavig.navigateToInMap([0, 0, 0])
PepperNavig.wait(id)
pose2 = PepperNavig.getRobotPositionInMap()
print("pose2 = " + str(pose2))
time.sleep(5)
id = PepperNavig.navigateToInMap([-1, 0, 0])
PepperNavig.wait(id)
pose2 = PepperNavig.getRobotPositionInMap()
print("pose2 = " + str(pose2))
time.sleep(5)
id = PepperNavig.navigateToInMap([0, -1, 0])
PepperNavig.wait(id)
pose3 = PepperNavig.getRobotPositionInMap()
print("pose3 = " + str(pose3))
time.sleep(5)
您似乎以正确的顺序调用了正确的 API。 但是,如果机器人周围有有效的自由空间,则地图应该是全白色的,而不是黑色的。 你说"黑色是自由空间——白色是障碍物",通常恰恰相反。 像素的颜色表示区域自由的概率: - 1.0(或此处为 100)表示自由区域 - 0.0(或0)表示不是自由区域,所以障碍物 您可以在此处找到工作代码示例: https://github.com/aldebaran/naoqi_navigation_samples
"椭圆误差2米宽3米"表示您的机器人丢失了。可能是重新定位InMap([0.0, 0.0, 0.0])进展不顺利。 机器人在呼叫前是否正确放置在 (0.0, 0.0) 位置?
如果您还没有,更新到 NAOqi 2.7 应该可以改善导航 http://doc.aldebaran.com/2-7/news/2.7/whatsnew2.7.html#navigation-abilities-improved