Nao机器人-机器人行为之getUp

在赛场上机器人是很难避免跌倒的(守门员经常会扑倒挡球),在 BHuman 中带了跌倒后站起的行为,这篇文章是记录下最近对此行为运行过程的分析。

HandleGameState.h

在赛场上机器人可能因为各种因素跌倒,所以跌倒的状态判断是全局的,当跌倒后,停止执行后面的动作,转去执行 getUp。可以看到,这里调用了 theFallDownState 模块,下面进到里面看看。

if(theFallDownState.state == FallDownState::fallen)
	  goto getUp;

FallDownState

FallDownState,是一个摔倒状态的结构体,里面有机器人关于跌倒的 6 个 state 和 4 个 direction。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6xhIeJS-1574386448505)(https://ws1.sinaimg.cn/large/006wR0dcly1g1rveodb7ej32la1makjl.jpg)]

这样上面的if语句中的条件就很清楚啦。在HandleGameState.h可以看到,这里跌落后会调到 getUp 的 state。在 getUp 中可以看到调用了GetUp()这个 option,下来进这个里面看看。

handlegamestate

getUp

GetUp.h

在 GetUp 这个 option 中,可以看到直接goto standUp,在 standUp 这个状态执行站起来的动作,并且一直在判断机器人的状态,如果动作执行完毕并且机器娃儿站起来了就goto stand

在 standUp 这个 state 中,在 action 中执行自己的对应动作并且伴随着判断机器人的状态,如果又摔倒了就调到上面的 state(standUp)

standUP

上图指的地方又用到了几个 Representation,下面逐一进去看看:

Activity.h

Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/Output/Activity.h,看到如图的东西,那这个 BehaviorStatus 又有些什么功能呢?

Activity.h

BehaviorStatus.h

Bhuman/BHumanCodeRelease-coderelease2017/Src/Representations/BehaviorControl/BehaviorStatus.h

这个文件声明了一个结构体,其中包含关于当前行为状态的数据。

  ENUM(Activity,
  {,
    unknown,
    blocking,   // 阻塞
    duel,       // 决斗
    dribble,    // 运球
    dribbleDuel,// 
    searchForBall,  // 找球
    searchForBallAtRecentPosition,  // 在附近的位置找球
    goToBall,   // 走向球
    takingPosition, // 取得位置
    kick,   // 踢球
    guardGoal,  // 保护目标
    catchBall,  // 控制住球
    standAndWait,   // 站住 等待
    passing,    // 带球?
    gettingUp,  // 站起来
    turn,   
    walkNextToKeeper,
    kickoff,    // 开球

    waving,
  });

Ok,现在我们退回到 GetUp.h 中继续看。


HeadControlMode.h

进来可以看到,这个文件主要是一些头部的控制 mode,在上面调用了 lookForward。

路径:Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/HeadControl

LookForward.h

/** Pun intended. Looks straight ahead in a way that the Nao V4's cameras cover the area in front of its feet as well as everything else in front of the robot.*/
option(LookForward, (float)(0.38f) tilt, (float)(0.f) pan)
{
  /** Simply sets the necessary angles */
  initial_state(lookForward)
  {
    action
    {
      // 参数:pan 角度 速度
      SetHeadPanTilt(pan, tilt, 150_deg);
    }
  }
}

好了,到这里就基本可以了,最后一句调用了 GetUpEngine(),这个接口在Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/MotionControl/GetUpEngine下,这是一个mini的站立运动引擎,控制各个关节执行一些动作让 Nao 站起来。

到这里 GetUp.h 就做完了。

总结一下

其实这篇文章我就是想记录下来如何一步一步进去,然后再出来。

在 CABSL 行为控制刚开始学习的过程中,我觉得这样的方式还是有助于对代码的理解。

OK,睡觉。


发布了73 篇原创文章 · 获赞 90 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Hanoi_ahoj/article/details/89053857