Bhuman應用篇——帶球及踢球

Bhuman應用篇——帶球及踢球

帶球走位

  • \Config\WaklKicks 目錄下有一些cfg文件,記錄了動作的信息。foward中爲機器人小碎步向前踢球; turnOut爲機器人向旁邊踢球,以便於能夠繞開擋在前面的敵方機器人。
  • \Src\Modules\BehaviorControl\BehaviorControl\Options\Output\MotionRequest目錄下有一個文件InWalkKick.h ,提供了機器人使用那些cfg文件的動作的接口。調用示例如下:
#表示機器人走到球的後方160mm,左方55mm處,朝着angleToOpponentKeeperLeft方向,使用右腳以forward的方式踢球。
InWalkKick(WalkKickVariant(WalkKicks::forward, Legs::right), Pose2f(theLibCodeRelease.angleToOpponentKeeperLeft, theBallModel.estimate.position.x() - 160.f, theBallModel.estimate.position.y() + 55.f))
  • 我們打開InWalkKick.h文件,發現裏面使用了theMotionRequest和WalkKickVariant
    打開 \Src\Representations\MotionControl\MotionRequest.h,在使用InWalkKick時,Motion設置爲walk。Alt
    上面有一個include WalkRequest.h和KickRequest.h。同樣打開此目錄下的WalkRequest.h文件。我們可以看到WalkKickVariant和include部分
    Alt
    根據include的提示,可以找到WalkKicks.h文件。裏面可以找到:
    Alt
  • 在此處可以添加一些其他的動作,並在第一步的目錄下添加對應的cfg文件。

大力射門

在上面的MotionRequest.h文件中有一個名爲kickMotion
同樣在**\Src\Modules\BehaviorControl\BehaviorControl\Options**目錄下並未找到關於Kick Motion的API。因此我們需要自己編寫。

  • 在**\Src\Modules\BehaviorControl\BehaviorControl\Options\Output\MotionRequest**目錄下創建一個文件,例如KickBigFoot.h
  • 在**\Src\Modules\BehaviorControl\BehaviorControl**下的Option.h文件中添加
#include "Options/Output/MotionRequest/KickBigFoot.h"
  • 打開上面的MotionRequest.h中提到的KickRequest.h,有一個名爲KickRequest的STREAMABLE對象。裏面有一些成員,其中有個ENUM對象,其中包含kickForward。
    Alt
    這個kickForward對應着 \Config\KickEngine 下面的kickForward.kmc文件。
  • 根據以上說明,我們可以模仿 \Src\Modules\BehaviorControl\BehaviorControl\Options\Output\MotionRequest 中的SpecialAction.h編寫KickBigFoot.h文件,讓機器人踢得更遠。代碼如下:
#ifndef KICKBIGFOOT_H
#define KICKBIGFOOT_H
/**
 * The option executes a kick generated by the KickEngine.
 */
option(KickBigFoot, ((KickRequest)KickMotionID)id, (bool)(false) mirror)
{
  /** Set the motion request / kickType. */
  initial_state(setRequest)
  {
    transition
    {
      if(theMotionInfo.motion == MotionRequest::kick && theMotionInfo.kickRequest.kickMotionType == id && theMotionInfo.kickRequest.mirror == mirror)
        goto requestIsExecuted;
    }
    action
    {
      theMotionRequest.motion = MotionRequest::kick;
      theMotionRequest.kickRequest.kickMotionType = id;
      theMotionRequest.kickRequest.mirror = mirror;
    }
  }

  /** Executes the kick */
  state(requestIsExecuted)
  {
    transition
    {
      if(theMotionInfo.motion == MotionRequest::kick || theMotionInfo.kickRequest.kickMotionType == id || theMotionInfo.kickRequest.mirror == mirror)
        goto setRequest;
    }
    action
    {
      theMotionRequest.motion = MotionRequest::kick;
      theMotionRequest.kickRequest.kickMotionType = id;
      theMotionRequest.kickRequest.mirror = mirror;
    }
  }
}

#endif /* KICKBIGFOOT_H */
  • 調用時,格式如下:
KickBigFoot(KickRequest::kickForward)

其中kmc文件是記錄踢球時動作的關鍵幀文件,在更早的Bhuman版本(比如2016)中,提供了一個製作kmc文件的模塊。在此版本中可能需要手動調哪個文件了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章