最近去搞nao机器人了,写bhuman的人真是牛啊~~~
模块的作用
一个bhuman模块分为表征(representation)和modules两个部分,这两个部分分别存放于src目录的两个不同的地方(与他们名字相同的两个文件夹),其中representation提供数据,在有这个模块依赖(比如REQUIRES(TeamData)就是把teamdata的表征实例化,这个模块里就可以以theTeamData的形式访问到表征里的具体数据)的地方实例成“the(表征名字)”形式的对象。Modules时时刻刻的在更新表征里的数据(通过update函数)。
The(名字)这里面的名字取决于STEAMABLE的名字,这里还是以teammatedata举例
STREAMABLE(Teammate, COMMA public MessageHandler
一个表征里可以有多个steamable,在模块需要时两个流都会被实例化,以不同的名字访问存在于不同流中的数据。
如何创建
大体上我们通过把别的模块里面的东西挖掉然后改成自己的来实现
首先我们需要一个provider 注意codelite要手工在src里建立,在ide里放的东西会莫名其妙的出现在其他目录里
建议根据用途放在对应的文件夹里/src/modules
下面是一个叫handsomeprovider.h的模块模板,只保留了最基本的东西以便参考
这里Libcoderelese不是必要的 只是展示如何去引入别的模块提供的表征,来帮助你的模块计算出你想要的数据。
#include "Representations/BehaviorControl/Handsome.h"
#include "Representations/BehaviorControl/Libraries/LibCodeRelease.h" <- Demo
#include "Tools/Math/Eigen.h"
#include "Tools/Math/Transformation.h"
#include "Tools/Module/Module.h"
MODULE(HandsomeProvider,
{ ,
REQUIRES(LibCodeRelease),
PROVIDES(Handsome),
});
class HandsomeProvider : public HandsomeProviderBase
{
public:
HandsomeProvider();
private:
/**
* This method is called when the representation provided needs to be updated.
* @param theHandsome The representation updated.
*/
void update(Handsome& theHandsome);
};
模块的主体部分handsomeprovider.h
注意在没有把表征实例化后的对象引用传给update函数调用的其他函数时,该函数是没有办法修改表征对象的值。
#include "HandsomeProvider.h"
MAKE_MODULE(HandsomeProvider, behaviorControl)
HandsomeProvider::HandsomeProvider(){} //do noting
void HandsomeProvider::update(Handsome& theHandsome) <-注意调用其他函数其他函数的参数列表里必须要有这个
{
theHandsome.demo=8;
}
表征Handsome.h
#pragma once
#include "Tools/Function.h"
#include "Tools/Math/Pose2f.h"
#include "Tools/Math/Eigen.h"
#include "Tools/Math/Transformation.h"
STREAMABLE(Handsome,
{ , <-注意这里必须有一个逗号
(int) demo,
});
到这里你的模块就基本成型了,现在就要想办法让bhuman调用和编译你的模块
1》修改soccer.h的依赖让他依赖上你的表征
在/src/modules/behaviorcontrol/behaviorcontrol/soccer.h
加入
#include "Representations/BehaviorControl/Handsome.h"
REQUIRES(Handsome),
2> 修改modules.cfg 让provider和表征对应上
在/config/Scenarios/Default/modules.cfg
加入
{representation = Handsome; provider = HandsomeProvider;},
本文深入解析bHuman模块的构成及工作原理,包括表征和Modules两大部分,并详细介绍了如何创建自定义模块及其与主程序的集成过程。
1581

被折叠的 条评论
为什么被折叠?



