在赛场上机器人是很难避免跌倒的(守门员经常会扑倒挡球),在 BHuman 中带了跌倒后站起的行为,这篇文章是记录下最近对此行为运行过程的分析。
HandleGameState.h
在赛场上机器人可能因为各种因素跌倒,所以跌倒的状态判断是全局的,当跌倒后,停止执行后面的动作,转去执行 getUp。可以看到,这里调用了 theFallDownState 模块,下面进到里面看看。
1 | if(theFallDownState.state == FallDownState::fallen) |
FallDownState
FallDownState,是一个摔倒状态的结构体,里面有机器人关于跌倒的 6 个 state 和 4 个 direction。
这样上面的if
语句中的条件就很清楚啦。在HandleGameState.h
可以看到,这里跌落后会调到 getUp 的 state。在 getUp 中可以看到调用了GetUp()
这个 option,下来进这个里面看看。
GetUp.h
在 GetUp 这个 option 中,可以看到直接goto standUp
,在 standUp 这个状态执行站起来的动作,并且一直在判断机器人的状态,如果动作执行完毕并且机器娃儿站起来了就goto stand
。
在 standUp 这个 state 中,在 action 中执行自己的对应动作并且伴随着判断机器人的状态,如果又摔倒了就调到上面的 state(standUp)
。
上图指的地方又用到了几个 Representation,下面逐一进去看看:
Activity.h
Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/Output/Activity.h
,看到如图的东西,那这个 BehaviorStatus 又有些什么功能呢?
BehaviorStatus.h
Bhuman/BHumanCodeRelease-coderelease2017/Src/Representations/BehaviorControl/BehaviorStatus.h
。
这个文件声明了一个结构体,其中包含关于当前行为状态的数据。
1 | ENUM(Activity, |
Ok,现在我们退回到 GetUp.h 中继续看。
HeadControlMode.h
进来可以看到,这个文件主要是一些头部的控制 mode,在上面调用了 lookForward。
1 | 路径:Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/HeadControl |
LookForward.h
1 | /** 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.*/ |
好了,到这里就基本可以了,最后一句调用了 GetUpEngine()
,这个接口在Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/MotionControl/GetUpEngine
下,这是一个mini的站立运动引擎,控制各个关节执行一些动作让 Nao 站起来。
到这里 GetUp.h 就做完了。
总结一下
其实这篇文章我就是想记录下来如何一步一步进去,然后再出来。
在 CABSL 行为控制刚开始学习的过程中,我觉得这样的方式还是有助于对代码的理解。
OK,睡觉。