【Nao机器人】机器人行为之getUp

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

守门员扑球

HandleGameState.h

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

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

FallDownState

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

falldownstate

这样上面的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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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。

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

LookForward.h

1
2
3
4
5
6
7
8
9
10
11
12
13
/** 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,睡觉。