当我们创建新的文件(新函数)时,文件中可同时包含多个函数(option),但其中一个函数的命名必须与文件名相同,如:Striker.h中包含了Striker(即option(Striker))函数。
在BHuman中,函数的描述必须被写于option以内
option(函数名)
option(函数名,(形参1类型)形参1名称,(形参2类型)形参2名称,...)
BHuman中,创建的函数大多为了实现某个行为,如扭头、踢球等。例如,扭头又可以分为细致的几个动作:向左80°->向前看->向右80°->向前...根据这样特点,我们可以把扭头这个动作分为几个State
第一个执行的"state"
最后一个执行的"state"
在把一个动作分为细致的几个动作并建立相应的state后,需要把每个state要求作出的动作函数写在以"action"开头的复合语句中。
一个"state"中需要把条件语句写在以"transition"开头的复合语句中,进行"state"的跳转;若每个"state"都需要执行相同的条件语句,可以把这些条件语句新建一个"common_transition"的复合语句。
在执行action中复合语句同时,transition中复合语句也在执行;当transition中某个条件满足时,就会跳入此条件语句指定的state。
action的执行情况可用以下关键字告知transition进行转换:option_time 整型数据,表示当前option执行了多长时间;state_time 整型数据,表示当前state执行了多长时间!以上二者单位为ms,即1000=1saction_done bool型数据,默认为false,表示action中最后一个调用的函数语句是否已经执行到target_state;△ 若不涉及target_state,则无法跳出!action_absorted bool型数据,与aborted_state对应。aborted_state应用于当一个state执行的函数的行为受到干扰,则可添加aborted_state提供相应的措施。
此文件包含相机控制,led控制,手部控制,头部控制,运动控制
☆ BehaviorControl.h定义了BehaviorControl模块,通过头文件获取很多参数,这个模块可提供接口数据: PROVIDES(ActivationGraph)--激活图 PROVIDES(ArmMotionRequest)--手臂动作 PROVIDES(BehaviorLEDRequest)--led控制 PROVIDES(MotionRequest)--运动控制 PROVIDES(BehaviorStatus)--行为状态 PROVIDES(HeadMotionRequest)--头部运动 PROVIDES(SPLStandardBehaviorStatus)--标准平台状态 △ 2015版的BehaviorControl}2015.h 定义了一个命名空间Behavior2015,声明了类behaviorControlData,该类声明了多个成员 并调用他们的默认构造函数实时传递参数修改,以下是他包含的重要成员: 1、BehaviorStatus& theBehaviorStatus; BehaviorStatus流类给角色赋初值striker. ((Role) RoleType)(Role::striker) role, Role流类定义了(RoleType)(striker) role, 给出一个draw()函数,该函数在role.cpp有实现,用于调试。 给出枚举RoleType ENUM(RoleType, {, undefined, keeper, striker, defender, supporter, none,}); 2、MotionRequest&theMotionRequest; MotionRequest流类定义了: (Motion)(specialAciton)motion, (SpecialAcitonRequest)specialActionRequest, (WalkRequest)walkRequest, (KickRequest)kickRequest, 还定义了motion枚举变量,并定义了printout函数,该函数根据motion情况进行字符串输出,在represtation/motionRequest.cpp有定义
☆ #include"Options/Soccer.h"① 默认开始played状态,关闭所有关节② 随后开始standup状态,站起来,进入playsoccer状态③ 开始执行HandlePenaltyState(); HeadControl();胸键变颜色,按三次蹲下,并且进入playdead状态,胸键变色△ #include"Option/GameControl/HandleGameState.h"控制游戏状态☆ #include"Options/GameControl/HandlePenaltyState.h"控制惩罚状态△ #include"Options/GameControl/PlayingState.h"正在运行的决策状态☆ #include"Options/GameControl/ReadyState.h"准备状态△ #include"Options/HeadControl/HeadControl/h头部状态
☆ #include "Options/Output/Annotation.h" 发送注释信息 △ #include "Options/ Output/ArmMotionRequest/KeyFrameArms.h" 执行手部动作 ☆ #include "Options/Output/HeadMotionRequest/SetHeadPanTilt.h" △ #include "Options/Output/HeadMotionRequest/SetHeadTarget.h" ☆ #include "Options/Output/HeadMotionRequest/SetHeadTargetOnGround.h" 执行头部动作 △ #include "Options/Output/MotionRequest/GetUpEngine.h" 站起来 ☆ #include "Options/Output/MotionRequest/InWalkKick.h" 边走边踢 theMotionRequest.walkRequest.mode = WalkRequest::targetMode; △ #include "Options/Output/MotionRequest/PathToTarget.h" 目标路径执行 ☆ #include "Options/Output/MotionRequest/SpecialAction.h" 执行特殊动作 △ #include "Options/Output/MotionRequest/Stand.h" 站起来 ☆ #include "Options/Output/MotionRequest/WalkAtSpeed.h" 走路速度 △ #include "Options/Output/MotionRequest/WalkAtSpeedPercentage.h" 走路百分比速度 ☆ #include "Options/Output/MotionRequest/WalkToTarget.h" 走路目标模式 △ #include "Options/Output/PlaySound.h" 播放声音 ☆ #include "Options/Roles/Striker.h" 前锋决策 Start--- turnToBall searchForBall walkToBall 走向球 alignToGoal 机器人与球保持保持一条直线 alignBehindBall 机器人在球后面 kick 踢球 △ #include "Options/Skills/ArmContact.h" 手部动作 ENUM(PushDirection, {,N, /**< Arm is being pushed to the front */S, /**< Arm is being pushed to the back */W, /**< Arm is being pushed to the left */E, /**< Arm is being pushed to the right */NW, /**< Arm is being pushed to the front and the left */NE, /**< Arm is being pushed to the front and the right */SW, /**< Arm is being pushed to the back and the left */SE, /**< Arm is being pushed to the back and the right */NONE, /**< If no contact is detected */}), △ #include "Options/Skills/GetUp.h" 倒下站起来 ☆ #include "Options/Tools/ButtonPressedAndReleased.h" 胸前按钮
负责对config/mof下的特殊动作进行解释执行
walk走路,kick踢球,DynamicMotionPrimitive Kick动态踢球
ArmKeyFrame 手臂动作运动,getup起立,headmotion头部运动控制CalibrationStand站立运动,specialAction特殊动作等
FrictionLearner 摩擦力学习AutomaticCameraCailbrator 相机自动校准JointCalibrator 关节校准CognitionConfigurationDataProvider 提供认知配置数据MotionConfigurationDataProvider 提供运动配置数据
Ballperceptor球的视觉识别球的位置视觉识别身体轮廓位置视觉识别摄像头矩阵,用于创建坐标系图像。坐标系视觉识别场地边线视觉识别白线点识别障碍物识别点球标记识别球员识别潜在线点识别真实球识别机器人相机矩阵,用于计算身体轮廓whiteGaolperceptor白球门识别
路由器默认自动分配的IP地址在 192.168.1.100~192.168.1.199
如 192.168.3.2
如 192.168.3.199
因此时子网掩码为255.255.255.0,故路由器分配的合法IP必须为192.168.1.*格式更改掩码为255.255.0.0,即可重新配置DHCP服务器中地址池结束地址
在network下,更改:ssid="无线网名称",psk="无线网密码"
编辑新以太网,在IPv4设置-手动,地址:10.0.7.8,子网掩码:16
模块分为两个部分:requirements和representations一个模块包含一个或多个requirements和representations一个representations只能由一个模块更新
定义每个模块都分别使用宏命令REQUIRES和PROVIDES
motion (运动系统) 或cognition(感知系统) 的moduleMangager::update主要作用就是将providers构造出来,即属于motion(或者cognition)的模块创建出来
函数"calcShared"(部分提取)作用: 1、传递到sortProvider中作为算法输入 2、在使用simulatot进行模块的调试时,不同进程中的模块通信通过stream进行传递, 机器人程序是线程的,因此不需要考虑shared中的stream (注:在机器人和simulator中,motion和cognition都只是作为线程运行的)函数"sortProvider"作用: 将providers进行排序,解决模块之间的依赖关系 e.g A模块提供(PROVIDERS)给B模块(representation), 而 A模块需要(REQUIRES)C模块的提供(PROVIDERS)repreentation 即C→A→B以上俩个重点函数仅仅是motion(或cognition)中的模块之间的依赖关系;模块的顺序,是依靠representation的依赖关系来决定的。PS:以上可以参考BHuman文档中的模块关系图,再对照Modules中的每个具体模块,查看模块定义的部分。
motion与cognition是作为线程运行的,通过timeStamp同步进行,模块之间通过shared交流。motion运行速度为10ms运行一次,cognition为是33ms运行一次。二者并发进行,当motion需要用到cognition中的模块一定最新的,不需要考虑更新顺序。
提供信息 标志点 目标 边界线 球的位置和速度算法策略 颜色表 NAO形体轮廓 分段与区域构建 区域辨别 边界检测 目标检测 球检测 其他NAO机器人检测
自我定位 球的跟踪障碍物建模(视觉判断、超声波定位、胳臂碰触定位、对方模型定位
CABSL Option Library 角色(Roles)身体控制 头部控制 路径规划
行走 特殊动作 爬起 跟球 动作合并 头部控制 胳臂控制
Bush(查看机器人的当前情况) Copyfiles(把代码拷进相应的机器人上)
一个共享库,用来与GameController通讯
Robots Enviroemnt Simulates Sensor Readings Executes Commands
展示 交互
描述环境 描述上下文 描述机器人采用XML(RoSiML)描述,而不是代码描述
1 | $ hexo new "My New Post" |
More info: Writing
1 | $ hexo server |
More info: Server
1 | $ hexo generate |
More info: Generating
1 | $ hexo deploy |
More info: Deployment
]]>