BHuman开始篇:BHuman前锋代码分析

代码执行顺序

机器人比赛执行的策略文件都在Modules/BehaviorControl/BehaviorControl/Options下,Roles 中包含了Bhuman 源码中自带的一个Striker Demo。

①Soccer.h 是 Bhuman 代码执行的根目录,Nao开机后首先就会执行 Soccer.h 中的代码。

ps:在注释中触发实际足球行为的主要状态,这里调用的是Modules/BehaviorControl/BehaviorControl/Options/GameControl/HandlePenaltyState.h,对应的状态为:按一次胸口 Nao 站起来(upright),两次进入惩罚模式(penalized),三个非惩罚(notPenalized)

②根据HandlePenaltyState.h,在HandlePenaltyState.h的最后跟进到 PlayingState.h 中。

③最后根据 PlayingState.h中的代码调用Striker()前锋Demo。
(可添加其他角色在此调用运行)

前锋代码结构

在这里插入图片描述
哎呀集训的时候自己写的,好乱( ̄_ ̄|||),凑合看一下。

前锋代码解析

截不下来图(;´д`)ゞ
option(Striker) //进攻球员
{
initial_state(start) //最先开始状态
{
transition
{
if(state_time > 1000)
goto turnToBall; //如果静止时间超过1000转向turntoball状态(下方)
}
action
{
HeadControlMode(HeadControl::lookForward); //执行底层的向前看动作
Stand();
}
}

state(turnToBall) //turntoball状态代码块
{
transition
{
if(theLibCodeRelease.timeSinceBallWasSeen > theBehaviorParameters.ballNotSeenTimeOut)
goto searchForBall; //如果未看到球时间超过超时时间(定义看到的是7000)
if(std::abs(theBallModel.estimate.position.angle()) < 5_deg)
goto walkToBall; //如果角度小于5转向走向球动作
}
action
{
HeadControlMode(HeadControl::lookForward);
WalkToTarget(Pose2f(50.f, 50.f, 50.f), Pose2f(theBallModel.estimate.position.angle(), 0.f, 0.f));
} //转到定义发现walktotarget对应的有两个传入变量,速度和角度
state(walkToBall)
{
transition
{
if(theLibCodeRelease.timeSinceBallWasSeen > theBehaviorParameters.ballNotSeenTimeOut)
goto searchForBall;
if(theBallModel.estimate.position.norm() < 500.f)
goto alignToGoal;
}
action
{
HeadControlMode(HeadControl::lookForward); //状态跳转之前头朝前站立
WalkToTarget(Pose2f(50.f, 50.f, 50.f), theBallModel.estimate.position);
}
}
state(alignToGoal)
{
transition
{
if(theLibCodeRelease.timeSinceBallWasSeen > theBehaviorParameters.ballNotSeenTimeOut)
goto searchForBall;
if(std::abs(theLibCodeRelease.angleToGoal) < 10_deg && std::abs(theBallModel.estimate.position.y()) < 100.f)
goto alignBehindBall;
}
action
{
HeadControlMode(HeadControl::lookForward);
WalkToTarget(Pose2f(100.f, 100.f, 100.f), Pose2f(theLibCodeRelease.angleToGoal, theBallModel.estimate.position.x() - 400.f, theBallModel.estimate.position.y())); //走到球的后面对准球门
}
}
state(alignBehindBall)
{
transition
{
if(theLibCodeRelease.timeSinceBallWasSeen > theBehaviorParameters.ballNotSeenTimeOut)
goto searchForBall;
if(theLibCodeRelease.between(theBallModel.estimate.position.y(), 30.f, 60.f)
&& theLibCodeRelease.between(theBallModel.estimate.position.x(), 150.f, 180.f)
&& std::abs(theLibCodeRelease.angleToGoal) < 2_deg)
goto kick;
}
action
{
theHeadControlMode = HeadControl::lookForward;
WalkToTarget(Pose2f(80.f, 80.f, 80.f), Pose2f(theLibCodeRelease.angleToGoal, theBallModel.estimate.position.x() - 170.f, theBallModel.estimate.position.y() - 40.f)); //再次对准球门
}
}

state(kick) //射门动作代码
{
transition
{
if(state_time > 3000 || (state_time > 10 && action_done))
goto start;
}
action
{
HeadControlMode(HeadControl::lookForward);
InWalkKick(WalkKickVariant(WalkKicks::forward, Legs::left), Pose2f(theLibCodeRelease.angleToGoal, theBallModel.estimate.position.x() - 160.f, theBallModel.estimate.position.y() - 55.f)); //表示机器人走到球的后方160mm,左方55mm处,朝着angleToGoal方向,使用左脚以forward的方式踢球。
}
}

state(searchForBall)
{
transition
{
if(theLibCodeRelease.timeSinceBallWasSeen < 300)
goto turnToBall;
}
action
{
HeadControlMode(HeadControl::lookForward);
WalkAtRelativeSpeed(Pose2f(1.f, 0.f, 0.f)); //原地旋转寻找球
}
}
}

上面的注释便于理解( ̄︶ ̄)↗

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值