【问题标题】:Webots NAO controller sequence not workingWebots NAO 控制器序列不工作
【发布时间】:2020-05-07 11:21:44
【问题描述】:

我正在使用 linux (ubuntu 18) 上最新版本的 webbots 的 NAO_demo_python 控制器来闪烁 LED 并打开/关闭手。

但是,仅执行序列的最后一部分,而不是在单个模拟运行中。

例如如果我要求只打开手并点亮 LED,则在 1 次运行后,灯将亮起,在主 while 循环运行 5 次后,它将打开 - 非常缓慢 -。但是,如果我问点亮的 LED,打开手然后关闭手未点亮的 LED,那么模拟只会关闭手和未点亮的 LED。 该代码应该可以工作,它在另一个人的计算机上。如果你想要它在这里(它真的很基本,它是对 nao-demo-python.py 的轻微修改):

def run(self):
    while robot.step(self.timeStep) != -1:
        self.setAllLedsColor(0xff0000) #red leds on
        self.setHandsAngle(0.96)   #open hand
        #rospy.sleep(5)  #originally i am to use webots and nao with ros
        print("done") #to check how many runs are made
        self.setHandsAngle(0.0) #close hand
        self.setAllLedsColor(0x000000) #red leds off

另外,还有一些有趣的事情:如果我要求打开关闭手 N 次并且每次打印一些东西,所有的打印都会一次打印,并且模拟时间从 0:0:0 跳转到 0:0 :20 每次主循环运行后(每次运行+20),否则,即使模拟运行时间不流动,它也会跳转。

我尝试更新我的驱动程序,以消除模拟中的所有阴影和东西,正如 webbots 建议的那样。没办法。我在 Softbank 上找不到任何东西,我再也找不到关于 nao 和 webbots 的活跃论坛...

我有一台 i5 第 9 代和一台 GTX1050Ti。

问题可能是模拟时间不是 1.0 倍?但最多 0.05 倍? (在去掉阴影、灯光效果、所有对象、使用 1 个线程等之后,如下所述:https://www.cyberbotics.com/doc/guide/speed-performance

摘要:仅执行控制器的最后一个序列,如果是运动,则需要几个主循环才能完全执行。同时,每次主循环运行后,时间从 0 秒跳到 +20 秒。

请有人帮我完成所有序列的模拟工作:)

【问题讨论】:

    标签: python controller nao-robot webots naos-project


    【解决方案1】:

    一次打印所有的照片

    只执行控制器的最后一个序列

    听起来setHandsAngle 函数可能是异步的(在运行下一段代码之前不等待手移动到该点)?这可能至少是您遇到的一些问题的原因。在这种情况下,rospy.sleep(5) 应该替换为robot.step(5000),这样模拟器就有时间在发送下一个命令之前移动手。

    【讨论】:

    • 我使用 rospy.sleep 没有成功(即使等待时间很长)。但是我不知道robot.step 哪个有效!!!谢谢!现在动作已完全执行。会不会是Ros和webbots同步错误的问题?
    • 感谢@David Mansolino 提供有关使用robot.step() 暂停的信息。是的,基本上只有当您调用robot.step() 时模拟才会进行。理想情况下,更好的工作流程是感知手何时到达目标位置,然后才继续执行代码。像while handNotAtGoalAngle(): robot.step(self.timeStep) 这样的东西。您可以找到有关时间步长(尤其是同步)here 的更多信息。
    • 非常感谢您提供这个有用的链接!但是,如果 motion.isOver() 确实是最佳的(但似乎移动的手不是运动而是机器人运动?)我不能使用它。我不知道如何检查运动的完成!你能告诉我更多吗?
    • 我不确定(是否有指向您正在使用的 webots pepper API 的链接?)。但是你能通过一个函数来获得手的位置,还是有一个传感器呢?在这种情况下,您只需等到手的位置在您设定的目标的某个容差范围内。
    • 我发现我可以用self.OpenHand = Motion('../namefile.motion') 创建一个动作然后打开你需要使用LPhalanx1(到8)的结尾,另一只手也一样。然后您可以调用动议并使用isOver() 检查动议是否结束。现在才知道指骨的名称(碰巧,我在 webbots 上找不到所有 NAO 电机的完整列表!)。我目前正在使用 webbots API,NAO API 似乎无法被 webbots (python SDK) 识别!
    【解决方案2】:

    感谢您的指示,这行得通:

    self.CloseHand = Motion('../../motions/closeHand.motion') 
    
    def startMotion(self, motion): 
    
        if self.currentlyPlaying: #interrupt current motion 
            self.currentlyPlaying.stop() 
    
        motion.play() #start new motion 
        self.currentlyPlaying = motion 
    
    
    self.startMotion(self.CloseHand) 
    while not self.CloseHand.isOver(): 
        robot.step(self.timeStep)
    

    在 CloseHand.motion 中:

    #WEBOTS_MOTION,V1.0,LPhalanx1,RphalanxN (until 9)
    00:00:000,Pose1,0.00,0.00 etc
    

    执行时刻为 00:00:000,手的角度为 0.00(方阵接方阵)。

    非常感谢!没有你的建议,我不可能意识到这一点。

    同步 webots/ros 仍未解决,但我最初的问题是。谢谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2015-02-08
      • 2015-12-06
      • 2012-12-28
      相关资源
      最近更新 更多