一维弦EwayOS培训材料课件_第1页
一维弦EwayOS培训材料课件_第2页
一维弦EwayOS培训材料课件_第3页
一维弦EwayOS培训材料课件_第4页
一维弦EwayOS培训材料课件_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一维弦·EwayOS一维弦·EwayOS介绍1、LowLevelAI2、Sensor3、HighLevelAI4、Sensor介绍介绍:如图所示,EwayOS基于Linux内核进行的机器人操作系统;EwayStdudio是基于EwayOS进行的部署、二次开发等接口内容。介绍:如图所示,EwayOS基于Linux内核进行的机器人操01LowLevelAI介绍01LowLevelAI介绍LowLevelAI:1、控制算法与通信协议分离2、使用回调传输数据严格控制延迟3、OS内统一坐标系计量单位4、基于URDF的统一机器人模型描述库LowLevelAI(简称LowAI)主要是机器人各个物理硬件的控制和反馈中心,由于机器人会由不同的设备、传感器接入,需要有一个统一的接口与他们对接,LowAI就起到了这个作用。LowLevelAI:1、控制算法与通信协议分离LowLevLowLevelAI:1、LowAI通过以太网(TCP协议)链接下位机,控制机器人各运动电机运动,开始运动下位机向LowAI反馈运动状态2、LowAI接收Function发送的机器人运动控制,LowAI向Function反馈运动执行状态。3、LowAI将运动反馈信息以共享内存的形式提交给SensorLowLevelAI(简称LowAI)为EwayOS的运动控制模块。运动控制模块连接下位机直接控制机器人各运动电机进行运动。LowLevelAI:1、LowAI通过以太网(TCP协议)02Sensor介绍02Sensor介绍Sensor:Sensor用于机器人感知世界,特点是1、数据量大,大约约在600M/S;2、计算量大,针对这些数据在短时间内进行分析计算;3、需要较快的替换算法库。Sensor:Sensor用于机器人感知世界,特点是Sensor:Sensor是EwayOS中的感知层,Sensor接受HighLevelAI连接,开启机器人感知功能,根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至Function,由Function进行处理.1、Sensor与HighAI通过命令广播相连2、LowAI将运动反馈信息以共享内存的形式提交给Sensor3、Sensor将识别/检测数据直接传送给FunctionSensor:Sensor是EwayOS中的感知层,SensSensor:1、采用数据仓储模式进行传输,每个Elem只传递内存指针;2、回调方式进行消息传递,只有当上一个Elem接收到数据后,才传递到下一个Elem上;3、基于引脚名称模块自动组合,可以快速的替换不同的算法库;4、支持分布式部署,为将来的扩展作准备。Sensor:1、采用数据仓储模式进行传输,每个Elem只传Sensor:Element机制Sensor将多个算法拆分成为多个Element,每一个Element负责处理一部分运算。每一个Element由多个输入引脚(InputPin)、多个输出引脚(OutputPin)及消息输出(FeatureCode)组成。一个Element至少拥有InputPin、OutPinPin及FeatureCode其中任意的一个。Sensor:Element机制Sensor将多个算法拆分成Sensor:Element机制InputPin负责接收输入数据,OutPinPin负责讲计算结果输出至下级Element。Feature负责生成发送至Function的消息数据。每一个InputPin及OutPinPin均有个子的名称。Sensor框架在加载Element时根据每个Pin的名称自主进行拼接,拼接时一个InputPin只能连接一个OutPutPin,一个OutPutPin可连接多个InputPin。对应的Pin连接成功后,OutputPin输出的数据会立刻被InputPin收到。Element定义Pin及Feature使用宏定义的方式。Sensor:Element机制Sensor:Element_ExampleDeclare_Element_ID("2f1f7297-438d-4674-a8b4-a9982d521134")//定义ElementID,使用GUID,各Element不可重复Declare_Feature_Code(51)//定义输出Feature51,(具体宏定义请参见FuncSDK)Declare_Feature_None

//定义此Element无Feature输出​Declare_Input_Pin_Start

//InputPin定义开始Declare_Input_Pin(1,"ExampleElementInput1",false,EwayOS::CvMatBridge)//定义1号输入引脚,1为InputPinID(同一Element下的InputPinID不可重复),ExampleElementInput1为此InputPin的名称,框架拼接Element的Pin完全根据Pin的名称,相同即为可连,名称大小写敏感。false说明此引脚不是必须引脚,最后声明此引脚输入的数据类名,(数据类必须继承CEwayData)。Declare_Pin_End

//InputPin定义结束​Declare_Output_Pin_Start

//OutputPin定义开始Declare_Output_Pin(1,"ExampleElementOutput1",EwayOS::CvMatBridge)//定义1号输出引脚,1为OutputPinID(同一Element下的OutputPinID不可重复),ExampleElementOutput1为此OutputPin的名称,最后声明此引脚输出的数据类名。Declare_Pin_End

//OutputPin定义结束​Declare_Feedback_Start

//保留功能eclare_FeedBack_End

//保留功能​Declare_Element_Implement(CExampleElement)//框架代码Sensor:Element_ExampleDeclare_Sensor:Element连接机制Sensor框架运行后,根据-t参数传入的文件名遍历此文件夹下的所有可用Element。当Sensor收到ActiveFeature指令后检测本地是否存在拥有此FeatureCode的Element,若存在则开始连接流程。连接时以一个Element开始,遍历其所有InputPin,根据名称查找本地或网络内是否存在与其名称相同的OutputPin,若存在则加载该Element并将此InputPin及OutputPin进行连接。之后继续遍历,直至所有激活的Element的InputPin均配对成功,则该Feature激活成功。对于不必须InputPin,连接是框架会检测此引脚对应的输出引脚是否已激活,若已激活,则将此对引脚连接,若未激活,则不进行连接。若待连接的Element不在本机,框架会自动使用TCP/IP远程调用Element,传输数据。Sensor–tElem

–fc51存放Elem文件夹FeactureCodeSensor:Element连接机制Sensor–tEl03HighLevelAI介绍03HighLevelAI介绍HighLevelAI:1、HighLevelAI为EwayOS中的消息分发模块。2、HighAI进程接受Sensor的广播消息,等待Function的请求,Function可以向HighAI请求某个Feature3、Function进程可以向HighAI请求所需Feature,之后连接所请求的Feature,获取所需Feature的消息。HighLevelAI:1、HighLevelAI为Eway04Function介绍04Function介绍Function:Function是EwayOS中的具体功能层。1、Function连接HighLevelAI获取机器人检测消息。2、Function连接LowLevelAI获得机器人运动控制3、Sensor根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至FunctionFunction是为了解决某个具体的问题而进行的分析、计算、规划运动等组成部分,它的设计其实就是消息队列,在预期的时间内处理预期的消息,进行机器人控制Function:Function是EwayOS中的具体功能Function:1、消息驱动框架2、多级模块调用3、模块独立消息队列,自成体系4、封装各类机器人算法库、应用库Function:1、消息驱动框架Function:Message机制Function内部使用MessageList机制,所有消息(包含HighLevelAI检测到的周边数据,LowLevelAI发送的运动数据以及Function内部的Timer数据、自定义消息数据)均按到达时间及优先级加入一个消息队列,每个Function内部均存在在一个消息处理线程,该线程读取此消息列表,串行处理各消息。对于自定义消息,首先定义消息码,FunMsg_User之后的数字均可使用。之后在cpp文件中添加消息响应函数,最后在cpp文件中BEGIN_FIFEMSG_MAP与END_FIFMSG_MAP宏之间添加消息映射。Example:在头文件中添加#defineMuFunMsgFunMsg_User+1​eint

OnMyMessage(eint&

nMsgCode,edouble&

dTimeStamp,eint&

nParam1,eint&

nParam2);​MSG_FIFMAP(MuFunMsg,OnMyMessage)//在.cpp文件中END_FIFMSG_MAP前添加​END_FIFMSG_MAPFunction:Message机制#defineMuFuFunction:Feature机制Feature为Function向HighLevelAI请求某项识别、检测功能所使用。Function欲开启某项识别或检测功能时,需在Initialize时或Function运行的任何时间内调用RequestFeature请求Feature。Example:eint

TestApp::Initialize(std::vector<eint>

&vFeatureList,ebool&

bLimbAuthority,edouble

&dTimeOut){

vFeatureList.push_back(SysCom_ID_LMsg_ArmPos);

return

ERR_NONE;}Function:Feature机制eintTestAppFunction:Feature机制请求成功后Function模块即会收到对应的识别、检测消息,此时框架回调用CheckMessageCode回调询问处理方式。代表处理方式,可选如下值:MsgProcCode_Ignore(0),本模块忽略此消息。MsgProcCode_Notify(1),当收到此消息时,框架将调用对应的Pro函数通知模块处理。MsgProcCode_Record(2),当收到此消息时,框架将数据存储,模块需要获得数据时调用相应的GetMsgData函数获取数据。若不设定返回值,统一按MsgProcCode_Ignore处理Function:Feature机制Function:Feature机制!!!注意1、所有请求成功的Feature应在不需要该功能时再次调用RequestFeature关闭。2、关闭Feature应在JobStart后,在调用Uninitialize前。在不需要该功能时随时关闭,若本Function模块可被父Function强制关闭,则应在ProcCloseCmd中关闭Feature。3、若请求Feature成功后HighLevelAI掉线,Function不需重新请求Feature,框架会在HighLevelAI上线后自动重新请求。4、若在Function请求Feature成功后,由于Sensor原因造成Feature检测错误,Function会收到ProcFeatureStatus回调。Function:Feature机制Function:目前支持的FeatureCode。消息标识(FeatureCode)消息类型概述SysCom_ID_Vision_Marker(51)CMarkerMessageMarker识别数据SysCom_ID_Vision_Object(52)CObjectMessage物体识别数据SysCom_ID_Vision_Face(53)CFaceMessage人脸识别数据SysCom_ID_Voice_Speech(9050)CVoiceMessage语音识别数据SysCom_ID_LMsg_Sonar(10052)CSonarMsg声纳检测到障碍的数据SysCom_ID_LMsg_RobPos(10053)CBotPosMessage机器人位置变化SysCom_ID_LMsg_ArmPos(10054)CArmPosMessage机器人手臂位置变化SysCom_ID_LMsg_HeadPos(10055)CHeadPosMessage机器人头部位置变化SysCom_ID_LMsg_Battery(10059)CBatteryMsg机器人电池状态SysCom_ID_LMsg_PSU(10061)CPSUMsg机器人供电模块状态SysCom_ID_LMsg_Laser(10060)CLaserScanMessage机器人激光数据SysCom_ID_LMsg_IMU(10058)CIMUMessage机器人IMU数据Function:目前支持的FeatureCode。消息标识Function:Initialize机制Function在启动时必须要初始化资源,等资源初始化完成之后,系统会调入JobStart函数,开始Function真正的工作。Initialize为Function初始化函数,它有三个参数,FeatureList(需要申请的资源列表)、LimbAuthority(机器人肢体控制权)和TimeOut(Function等待框架处理申请的时间(s))。用户需要填入本Function能正常运行所需要的所有Feature和Limb请求权限,等系申请成功后会自动调入JobStart中,如果系统没有申请成功且TimeOut没有赋值,则Function会处于一直等待的状态;如果申请没有成功但TimeOut有赋值,则会在等待时间后进入JobFailed。Initialize_Example:eintTestApp::Initialize(std::vector<eint>&vFeatureList,ebool&bLimbAuthority,edouble&dTimeOut){vFeatureList.push_back(SysCom_ID_LMsg_ArmPos);bLimbAuthority=true;dTimeOut=20;//等待JobStart的时间

returnERR_NONE;}Function:Initialize机制InitializFunction:Command机制Command为Function向LowLevelAI发送运动指令,控制机器人运动所使用。Command欲控制机器人运动时,可调用Send系列函数发送运动命令。LowLevelAI收到Send系列控制函数后,首先检查权限,权限正常后及发送返回值至Function,运动函数返回,此时机器人还未开始运动,之后LowLevelAI开始规划运动轨迹,发送电机指令控制机器人运动。当指令发送完毕,等待下位机执行结束后,LowLevelAI会发送CommandDone消息至Function,通知Function该指令执行完毕。Function使用CmdSN识别CommandDone与之前发送的运动指令。eintWheelStraight::ProcMotCmdDone(edoubledTimeStamp,CCmdDoneMessage*piCmdDone)//{if(SysCom_ID_LCmd_WheelStraight==piCmdDone->m_nCmdID)//判断是否是自己发送的命令

{

if(ERR_NONE==piCmdDone->m_nCmdStatus)//判断命令执行的结果

{

ewayos::Log::WriteLog(LogInfo,"wheel命令执行成功。");

std::cout<<"Cmdend"<<std::endl;}else{ewayos::Log::WriteLog(LogError,"wheel命令执行失败");

std::cout<<"Cmdfail"<<std::endl;}}}Function:Command机制eintWheelStFunction:子Function机制Function模块共有两种编写方式,一种生成独立app(emake-tfapp)或编译为lib库(emake-tflib),当编译为lib库时,该Function可作为子Function被其它Function调用(app及lib均可)。调用方式为父Function调用AddChildFun函数,参数传入被调用lib库名去掉lib前缀及.so后缀。框架会自动实例化该子Function模块,将其连入HighLevelAI及LowLevelAI,子Function可获取消息数据,可发送肢体控制指令控制机器人运动。Kid_Example:EGUIDgGuid;eintnLoadResult=AddChildFun("RobotMove",&gGuid,"");if(ERR_NONE!=nLoadResult){OSG_WriteLog(LogError,"加载子Function出错,错误值:%d",nLoadResult);}Function:子Function机制Kid_ExamplFunction:子Function机制子Function退出可选择两种方式,主动退出或被动退出。主动退出为子Function任务执行完毕,关闭Feature及肢体控制权,显式调用FunQuit函数通知父Function退出。调用FunQuit后,框架回调用子Function的Uninitialize函数,之后关闭消息处理线程,子Function退出。框架会调用父Function的ProcChildFunQuit回调通知父Function。被动退出为父Function调用PostStopCmdToAllChildFun或PostStopCmdToChildFunByID函数通知子Function退出,框架会调用子Function的ProcCloseCmd回调通知子Function,此时子Function应立刻关闭Feature及肢体控制权,关闭timer,尽快调用FunQuit退出。调用FunQuit之后的流程与主动退出相同。Kid_Example:eintCFeedbackMove::ProcCloseCmd(edoubledTimeStamp,CCloseMessage*piCloseCmd){OSG_WriteLog(LogInfo,"fatherclose");FunQuit();returnERR_NONE;}Function:子Function机制Kid_ExamplFunction:Timer机制Function可使用SetTimer函数开关计时器,参数为间隔ms数。当间隔时间到达后,框架会向Function消息队列中插入一条Timer事件,当消息处理线程处理此消息时,会调用ProcTimer函数进行处理。注:此Timer为非精准Timer,时间间隔为传递消息的最小时间间隔。若由于程序问题造成消息处理线程响应不及时,可能会造成Timer事件在队列中累计,出现一个时段无ProcTimer,另一时段ProcTimer函数频繁调用。eintWheelMotorSpeed::ProcTimer(edoubledTimeStamp){WheelMove(0.3,0.3);}voidWheelMotorSpeed::JobStart(){

SetTimer(500);return;}Function:Timer机制eintWheelMotoWEBUI:使用手机或带有wifi的电脑,连接ssid为MoRoXXXXXX的wifi,(XXXXXX为机器人序列号,如MoRo0000033),密码EwayBot2017Moro1。连接成功后打开浏览器,访问00:3000即可链接机器人手动控制服务。用户名moro,密码moro即可进入。WEBUI:使用手机或带有wifi的电脑,连接ssid为Mo05WebUI介绍05WebUI介绍WEBUI-Rocker:Rocker页面为底盘控制页面,拖动页面中间轨迹球即可控制机器人底盘运动。离中心越远速度越大。向左向右可控制底盘旋转。xpos、ypos、yaw为底盘码盘、imu读数融合后的里程计。坐标系为右手坐标系,X轴向前,Y轴向左。原点为双轮中心点。WEBUI-Rocker:Rocker页面为底盘控制页面,拖WEBUI-Rocker:“开启避障”按钮为是否开启底盘防碰撞保护功能。若开启此功能,底盘会根据超声波数据检测前后方障碍物,若底盘速度过快,存在碰撞风险,底盘会自动停止运动。Obstacle1—6为超声波检测数据,1—4为机器人身前超声波,从左向右排布,5在机器人身后左侧,6为右侧。显示数值为0-255mm,有效数值前方是0—120,后方是0—80。WEBUI-Rocker:“开启避障”按钮为是否开启底盘防碰WEBUI-ArmTrajectory:此页面打开或关闭某一个机器人手臂应用轨迹。点击右上角Add按钮可上传自定义轨迹(上传文件格式为so库)。点击Edit,可对已添加手臂应用轨迹进行编辑。WEBUI-ArmTrajectory:此页面打开或关闭某一WEBUI-ArmAngle:

在此界面可单独下发每个手臂、Gripper电机的角度,更改完自己想要到达的值,点击下发即可WEBUI-ArmAngle:在此界面可单独下发每个手臂、WEBUI-ArmAngle:此页面打开或关闭某一个机器人应用。点击右上角Add按钮可上传自定义应用(上传文件格式为so库)。点击Edit,可对已添加应用进行编辑。WEBUI-ArmAngle:此页面打开或关闭某一个机器人应WEBUI:此页面显示机器人当前各模块状态。上方自检按钮可运动机器人自检程序。(自检程序运行中机器人会小幅运动,请运行中清理机器人前方、左右约1m的空间)。自检完成后会生成自检报告(/home/moro/DiagnoseLog文件夹)下方电机状态如果变红,则表示电机故障WEBUI:此页面显示机器人当前各模块状态。一维弦·EwayOS一维弦·EwayOS介绍1、LowLevelAI2、Sensor3、HighLevelAI4、Sensor介绍介绍:如图所示,EwayOS基于Linux内核进行的机器人操作系统;EwayStdudio是基于EwayOS进行的部署、二次开发等接口内容。介绍:如图所示,EwayOS基于Linux内核进行的机器人操01LowLevelAI介绍01LowLevelAI介绍LowLevelAI:1、控制算法与通信协议分离2、使用回调传输数据严格控制延迟3、OS内统一坐标系计量单位4、基于URDF的统一机器人模型描述库LowLevelAI(简称LowAI)主要是机器人各个物理硬件的控制和反馈中心,由于机器人会由不同的设备、传感器接入,需要有一个统一的接口与他们对接,LowAI就起到了这个作用。LowLevelAI:1、控制算法与通信协议分离LowLevLowLevelAI:1、LowAI通过以太网(TCP协议)链接下位机,控制机器人各运动电机运动,开始运动下位机向LowAI反馈运动状态2、LowAI接收Function发送的机器人运动控制,LowAI向Function反馈运动执行状态。3、LowAI将运动反馈信息以共享内存的形式提交给SensorLowLevelAI(简称LowAI)为EwayOS的运动控制模块。运动控制模块连接下位机直接控制机器人各运动电机进行运动。LowLevelAI:1、LowAI通过以太网(TCP协议)02Sensor介绍02Sensor介绍Sensor:Sensor用于机器人感知世界,特点是1、数据量大,大约约在600M/S;2、计算量大,针对这些数据在短时间内进行分析计算;3、需要较快的替换算法库。Sensor:Sensor用于机器人感知世界,特点是Sensor:Sensor是EwayOS中的感知层,Sensor接受HighLevelAI连接,开启机器人感知功能,根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至Function,由Function进行处理.1、Sensor与HighAI通过命令广播相连2、LowAI将运动反馈信息以共享内存的形式提交给Sensor3、Sensor将识别/检测数据直接传送给FunctionSensor:Sensor是EwayOS中的感知层,SensSensor:1、采用数据仓储模式进行传输,每个Elem只传递内存指针;2、回调方式进行消息传递,只有当上一个Elem接收到数据后,才传递到下一个Elem上;3、基于引脚名称模块自动组合,可以快速的替换不同的算法库;4、支持分布式部署,为将来的扩展作准备。Sensor:1、采用数据仓储模式进行传输,每个Elem只传Sensor:Element机制Sensor将多个算法拆分成为多个Element,每一个Element负责处理一部分运算。每一个Element由多个输入引脚(InputPin)、多个输出引脚(OutputPin)及消息输出(FeatureCode)组成。一个Element至少拥有InputPin、OutPinPin及FeatureCode其中任意的一个。Sensor:Element机制Sensor将多个算法拆分成Sensor:Element机制InputPin负责接收输入数据,OutPinPin负责讲计算结果输出至下级Element。Feature负责生成发送至Function的消息数据。每一个InputPin及OutPinPin均有个子的名称。Sensor框架在加载Element时根据每个Pin的名称自主进行拼接,拼接时一个InputPin只能连接一个OutPutPin,一个OutPutPin可连接多个InputPin。对应的Pin连接成功后,OutputPin输出的数据会立刻被InputPin收到。Element定义Pin及Feature使用宏定义的方式。Sensor:Element机制Sensor:Element_ExampleDeclare_Element_ID("2f1f7297-438d-4674-a8b4-a9982d521134")//定义ElementID,使用GUID,各Element不可重复Declare_Feature_Code(51)//定义输出Feature51,(具体宏定义请参见FuncSDK)Declare_Feature_None

//定义此Element无Feature输出​Declare_Input_Pin_Start

//InputPin定义开始Declare_Input_Pin(1,"ExampleElementInput1",false,EwayOS::CvMatBridge)//定义1号输入引脚,1为InputPinID(同一Element下的InputPinID不可重复),ExampleElementInput1为此InputPin的名称,框架拼接Element的Pin完全根据Pin的名称,相同即为可连,名称大小写敏感。false说明此引脚不是必须引脚,最后声明此引脚输入的数据类名,(数据类必须继承CEwayData)。Declare_Pin_End

//InputPin定义结束​Declare_Output_Pin_Start

//OutputPin定义开始Declare_Output_Pin(1,"ExampleElementOutput1",EwayOS::CvMatBridge)//定义1号输出引脚,1为OutputPinID(同一Element下的OutputPinID不可重复),ExampleElementOutput1为此OutputPin的名称,最后声明此引脚输出的数据类名。Declare_Pin_End

//OutputPin定义结束​Declare_Feedback_Start

//保留功能eclare_FeedBack_End

//保留功能​Declare_Element_Implement(CExampleElement)//框架代码Sensor:Element_ExampleDeclare_Sensor:Element连接机制Sensor框架运行后,根据-t参数传入的文件名遍历此文件夹下的所有可用Element。当Sensor收到ActiveFeature指令后检测本地是否存在拥有此FeatureCode的Element,若存在则开始连接流程。连接时以一个Element开始,遍历其所有InputPin,根据名称查找本地或网络内是否存在与其名称相同的OutputPin,若存在则加载该Element并将此InputPin及OutputPin进行连接。之后继续遍历,直至所有激活的Element的InputPin均配对成功,则该Feature激活成功。对于不必须InputPin,连接是框架会检测此引脚对应的输出引脚是否已激活,若已激活,则将此对引脚连接,若未激活,则不进行连接。若待连接的Element不在本机,框架会自动使用TCP/IP远程调用Element,传输数据。Sensor–tElem

–fc51存放Elem文件夹FeactureCodeSensor:Element连接机制Sensor–tEl03HighLevelAI介绍03HighLevelAI介绍HighLevelAI:1、HighLevelAI为EwayOS中的消息分发模块。2、HighAI进程接受Sensor的广播消息,等待Function的请求,Function可以向HighAI请求某个Feature3、Function进程可以向HighAI请求所需Feature,之后连接所请求的Feature,获取所需Feature的消息。HighLevelAI:1、HighLevelAI为Eway04Function介绍04Function介绍Function:Function是EwayOS中的具体功能层。1、Function连接HighLevelAI获取机器人检测消息。2、Function连接LowLevelAI获得机器人运动控制3、Sensor根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至FunctionFunction是为了解决某个具体的问题而进行的分析、计算、规划运动等组成部分,它的设计其实就是消息队列,在预期的时间内处理预期的消息,进行机器人控制Function:Function是EwayOS中的具体功能Function:1、消息驱动框架2、多级模块调用3、模块独立消息队列,自成体系4、封装各类机器人算法库、应用库Function:1、消息驱动框架Function:Message机制Function内部使用MessageList机制,所有消息(包含HighLevelAI检测到的周边数据,LowLevelAI发送的运动数据以及Function内部的Timer数据、自定义消息数据)均按到达时间及优先级加入一个消息队列,每个Function内部均存在在一个消息处理线程,该线程读取此消息列表,串行处理各消息。对于自定义消息,首先定义消息码,FunMsg_User之后的数字均可使用。之后在cpp文件中添加消息响应函数,最后在cpp文件中BEGIN_FIFEMSG_MAP与END_FIFMSG_MAP宏之间添加消息映射。Example:在头文件中添加#defineMuFunMsgFunMsg_User+1​eint

OnMyMessage(eint&

nMsgCode,edouble&

dTimeStamp,eint&

nParam1,eint&

nParam2);​MSG_FIFMAP(MuFunMsg,OnMyMessage)//在.cpp文件中END_FIFMSG_MAP前添加​END_FIFMSG_MAPFunction:Message机制#defineMuFuFunction:Feature机制Feature为Function向HighLevelAI请求某项识别、检测功能所使用。Function欲开启某项识别或检测功能时,需在Initialize时或Function运行的任何时间内调用RequestFeature请求Feature。Example:eint

TestApp::Initialize(std::vector<eint>

&vFeatureList,ebool&

bLimbAuthority,edouble

&dTimeOut){

vFeatureList.push_back(SysCom_ID_LMsg_ArmPos);

return

ERR_NONE;}Function:Feature机制eintTestAppFunction:Feature机制请求成功后Function模块即会收到对应的识别、检测消息,此时框架回调用CheckMessageCode回调询问处理方式。代表处理方式,可选如下值:MsgProcCode_Ignore(0),本模块忽略此消息。MsgProcCode_Notify(1),当收到此消息时,框架将调用对应的Pro函数通知模块处理。MsgProcCode_Record(2),当收到此消息时,框架将数据存储,模块需要获得数据时调用相应的GetMsgData函数获取数据。若不设定返回值,统一按MsgProcCode_Ignore处理Function:Feature机制Function:Feature机制!!!注意1、所有请求成功的Feature应在不需要该功能时再次调用RequestFeature关闭。2、关闭Feature应在JobStart后,在调用Uninitialize前。在不需要该功能时随时关闭,若本Function模块可被父Function强制关闭,则应在ProcCloseCmd中关闭Feature。3、若请求Feature成功后HighLevelAI掉线,Function不需重新请求Feature,框架会在HighLevelAI上线后自动重新请求。4、若在Function请求Feature成功后,由于Sensor原因造成Feature检测错误,Function会收到ProcFeatureStatus回调。Function:Feature机制Function:目前支持的FeatureCode。消息标识(FeatureCode)消息类型概述SysCom_ID_Vision_Marker(51)CMarkerMessageMarker识别数据SysCom_ID_Vision_Object(52)CObjectMessage物体识别数据SysCom_ID_Vision_Face(53)CFaceMessage人脸识别数据SysCom_ID_Voice_Speech(9050)CVoiceMessage语音识别数据SysCom_ID_LMsg_Sonar(10052)CSonarMsg声纳检测到障碍的数据SysCom_ID_LMsg_RobPos(10053)CBotPosMessage机器人位置变化SysCom_ID_LMsg_ArmPos(10054)CArmPosMessage机器人手臂位置变化SysCom_ID_LMsg_HeadPos(10055)CHeadPosMessage机器人头部位置变化SysCom_ID_LMsg_Battery(10059)CBatteryMsg机器人电池状态SysCom_ID_LMsg_PSU(10061)CPSUMsg机器人供电模块状态SysCom_ID_LMsg_Laser(10060)CLaserScanMessage机器人激光数据SysCom_ID_LMsg_IMU(10058)CIMUMessage机器人IMU数据Function:目前支持的FeatureCode。消息标识Function:Initialize机制Function在启动时必须要初始化资源,等资源初始化完成之后,系统会调入JobStart函数,开始Function真正的工作。Initialize为Function初始化函数,它有三个参数,FeatureList(需要申请的资源列表)、LimbAuthority(机器人肢体控制权)和TimeOut(Function等待框架处理申请的时间(s))。用户需要填入本Function能正常运行所需要的所有Feature和Limb请求权限,等系申请成功后会自动调入JobStart中,如果系统没有申请成功且TimeOut没有赋值,则Function会处于一直等待的状态;如果申请没有成功但TimeOut有赋值,则会在等待时间后进入JobFailed。Initialize_Example:eintTestApp::Initialize(std::vector<eint>&vFeatureList,ebool&bLimbAuthority,edouble&dTimeOut){vFeatureList.push_back(SysCom_ID_LMsg_ArmPos);bLimbAuthority=true;dTimeOut=20;//等待JobStart的时间

returnERR_NONE;}Function:Initialize机制InitializFunction:Command机制Command为Function向LowLevelAI发送运动指令,控制机器人运动所使用。Command欲控制机器人运动时,可调用Send系列函数发送运动命令。LowLevelAI收到Send系列控制函数后,首先检查权限,权限正常后及发送返回值至Function,运动函数返回,此时机器人还未开始运动,之后LowLevelAI开始规划运动轨迹,发送电机指令控制机器人运动。当指令发送完毕,等待下位机执行结束后,LowLevelAI会发送CommandDone消息至Function,通知Function该指令执行完毕。Function使用CmdSN识别CommandDone与之前发送的运动指令。eintWheelStraight::ProcMotCmdDone(edoubledTimeStamp,CCmdDoneMessage*piCmdDone)//{if(SysCom_ID_LCmd_WheelStraight==piCmdDone->m_nCmdID)//判断是否是自己发送的命令

{

if(ERR_NONE==piCmdDone->m_nCmdStatus)//判断命令执行的结果

{

ewayos::Log::WriteLog(LogInfo,"wheel命令执行成功。");

std::cout<<"Cmdend"<<std::endl;}else{ewayos::Log::WriteLog(LogError,"wheel命令执行失败");

std::cout<<"Cmdfail"<<std::endl;}}}Function:Command机制eintWheelStFunction:子Function机制Function模块共有两种编写方式,一种生成独立app(emake-tfapp)或编译为lib库(emake-tflib),当编译为lib库时,该Function可作为子Function被其它Function调用(app及lib均可)。调用方式为父Function调用AddChildFun函数,参数传入被调用lib库名去掉lib前缀及.so后缀。框架会自动实例化该子Function模块,将其连入HighLevelAI及LowLevelAI,子Function可获取消息数据,可发送肢体控制指令控制机器人运动。Kid_Example:EGUIDgGuid;eintnLoadResult=AddChildFun("RobotMove",&gGuid,"");if(ERR_NONE!=nLoadResult){OSG_WriteLog(LogError,"加载子Function出错,错误值:%d",nLoadResult);}Function:子Function机制Kid_ExamplFunction:子Function机制子Function退出可选择两种方式,主动退出或被动退出。主动退出为子Func

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论