在赛场上机器人是很难避免跌倒的(守门员经常会扑倒挡球),在 BHuman 中带了跌倒后站起的行为,这篇文章是记录下最近对此行为运行过程的分析。
在赛场上机器人可能因为各种因素跌倒,所以跌倒的状态判断是全局的,当跌倒后,停止执行后面的动作,转去执行 getUp。可以看到,这里调用了 theFallDownState 模块,下面进到里面看看。
if(theFallDownState.state == FallDownState::fallen)
goto getUp;
FallDownState,是一个摔倒状态的结构体,里面有机器人关于跌倒的 6 个 state 和 4 个 direction。
这样上面的if
语句中的条件就很清楚啦。在HandleGameState.h
可以看到,这里跌落后会调到 getUp 的 state。在 getUp 中可以看到调用了GetUp()
这个 option,下来进这个里面看看。
在 GetUp 这个 option 中,可以看到直接goto standUp
,在 standUp 这个状态执行站起来的动作,并且一直在判断机器人的状态,如果动作执行完毕并且机器娃儿站起来了就goto stand
。
在 standUp 这个 state 中,在 action 中执行自己的对应动作并且伴随着判断机器人的状态,如果又摔倒了就调到上面的 state(standUp)
。
上图指的地方又用到了几个 Representation,下面逐一进去看看:
Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/Output/Activity.h
,看到如图的东西,那这个 BehaviorStatus 又有些什么功能呢?
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 中继续看。
进来可以看到,这个文件主要是一些头部的控制 mode,在上面调用了 lookForward。
路径:Bhuman/BHumanCodeRelease-coderelease2017/Src/Modules/BehaviorControl/BehaviorControl/Options/HeadControl
/** 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,睡觉。