【问题标题】:How to simulate a person in pepper emulator?如何在辣椒模拟器中模拟一个人?
【发布时间】:2021-05-23 12:09:36
【问题描述】:

我正在尝试让胡椒机器人听基本的语音命令。问题是该语言不受支持,我必须为此使用谷歌语音转文本而不是机器人的默认识别库。 用模拟器测试会更方便,而不是每次都安装在真正的机器人上。但我找不到任何关于如何在模拟器中模拟出现在机器人面前的人的信息。如果这是不可能的,也许有一些解决方法?

override fun onRobotFocusGained(qiContext: QiContext) {
    this.qiContext = qiContext
    Utils.defaultHolderBuilder(qiContext).build().async()?.release()

    qiContext.humanAwareness?.addOnHumansAroundChangedListener { humansAround ->
        if (humansAround.isNotEmpty()) {
            listenToHuman(qiContext, humansAround)
        }
    }
}

也许我可以只调用提供给addOnUpdatedListener 的那个函数,但是我应该如何调用它呢?也许从程序中模拟一些测试广播? listenToHuman 函数:

private fun listenToHuman(qiContext: QiContext, humansAround: MutableList<Human>) {
    val actuation: Actuation = qiContext.actuation
    val robotFrame: Frame = actuation.robotFrame()

    val closestHuman = ...get closest human

    closestHuman?.headFrame?.addOnUpdatedListener {
        val distance: Double = ...computeDistance

        if (availableForListening) {
            availableForListening = false

            Qi.onUiThread {
                mLastResultTextView.text = "Listening"
                mSpeechRecognizer.startListening(speechIntent)
            }
        }
    }
}

【问题讨论】:

    标签: android kotlin pepper


    【解决方案1】:

    Pepper 模拟器周围没有模拟人类的工具。 但是,您的测试可以自动化,并且可以模拟 Qi SDK 中的类。

    解决方案 1

    this public sample 中,模拟LookAt 操作用于测试代码在成功或失败时是否正常运行。它使用Mockk 来执行此操作。

    考虑到这一点,您也可以模拟HumanAwareness 类,在调用getHumansAround 时提供模拟Human,并触发listener of the humans around property 的调用。这是一项相当多的工作,尤其是当您知道这是 Java 对更简单的对象系统 libQi 的包装时。

    解决方案 2

    所以我写了a helper class to create Qi Objects directly in Kotlin(对不起Java),我用它来更容易地创建模拟:

    abstract class FakeHumanAwareness: QiObjectImpl() {
    
        val humansAround = Property<List<Human>>(listOf())
        val recommendedHumanToApproach = Property(Human::class.java)
        val recommendedHumanToEngage = Property(Human::class.java)
    
        abstract fun makeEngageHuman(robotContext: RobotContext, human: Human): EngageHuman
    
        override fun advertise(objectBuilder: DynamicObjectBuilder): DynamicObjectBuilder {
            objectBuilder.advertiseProperty(this, FakeHumanAwareness::humansAround)
            objectBuilder.advertiseProperty(this, FakeHumanAwareness::recommendedHumanToApproach)
            objectBuilder.advertiseProperty(this, FakeHumanAwareness::recommendedHumanToEngage)
            objectBuilder.advertiseMethod(this, FakeHumanAwareness::makeEngageHuman)
            return objectBuilder
        }
    }
    

    然后我可以模拟它,并将其转换为 HumanAwareness 对象:

    val fakeHumanAwareness: FakeHumanAwareness = spyk()
    val humanAwareness: HumanAwareness = qiObjectCast(fakeHumanAwareness)
    

    您可以对Human 执行相同操作(此处不包括FakeHuman 类),模拟它并直接设置HumanAwareness.humansAround

    val fakeHuman: FakeHuman = spyk()
    val human: Human = qiObjectCast(fakeHuman)
    fakeHumanAwareness.humansAround.setValue(listOf(human))
    

    设置值后,自动调用监听器,getHumansAround 将返回该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多