1、一维弦一维弦 EwayOS介绍1、LowLevelAI2、Sensor3、HighLevelAI4、Sensor介绍:如图所示,EwayOS基于Linux内核进行的机器人操作系统;EwayStdudio是基于EwayOS进行的部署、二次开发等接口内容。0 01 1LowLevelAI介绍LowLevelAI:1、控制算法与通信协议分离2、使用回调传输数据严格控制延迟3、OS内统一坐标系计量单位4、基于URDF的统一机器人模型描述库LowLevelAI(简称LowAI)主要是机器人各个物理硬件的控制和反馈中心,由于机器人会由不同的设备、传感器接入,需要有一个统一的接口与他们对接,LowAI就起到
2、了这个作用。LowLevelAI:1、LowAI通过以太网(TCP协议)链接下位机,控制机器人各运动电机运动,开始运动下位机向LowAI反馈运动状态2、LowAI接收Function发送的机器人运动控制,LowAI向Function反馈运动执行状态。3、LowAI将运动反馈信息以共享内存的形式提交给SensorLowLevelAI(简称LowAI )为EwayOS的运动控制模块。运动控制模块连接下位机直接控制机器人各运动电机进行运动。0 02 2Sensor介绍Sensor:Sensor用于机器人感知世界,特点是1、数据量大,大约约在600M/S;2、计算量大,针对这些数据在短时间内进行分析计
3、算;3、需要较快的替换算法库。Sensor:Sensor是EwayOS中的感知层,Sensor接受HighLevelAI连接,开启机器人感知功能,根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至Function,由Function进行处理.1、Sensor与HighAI通过命令广播相连2、LowAI将运动反馈信息以共享内存的形式提交给Sensor3、Sensor将识别/检测数据直接传送给FunctionSensor:1、采用数据仓储模式进行传输,每个Elem只传递内存指针;2、回调方式进行消息传递,只有当上一个Elem接收到数据后,才传递到下一个Elem上;3、基于引脚名称模块自
4、动组合,可以快速的替换不同的算法库;4、支持分布式部署,为将来的扩展作准备。Sensor:ElementElement机制机制Sensor将多个算法拆分成为多个Element,每一个Element负责处理一部分运算。每一个Element由多个输入引脚(InputPin)、多个输出引脚(OutputPin)及消息输出(FeatureCode)组成。一个Element至少拥有InputPin、OutPinPin及FeatureCode其中任意的一个。Sensor:ElementElement机制机制InputPin负责接收输入数据,OutPinPin负责讲计算结果输出至下级Element。Feat
5、ure负责生成发送至Function的消息数据。每一个InputPin及OutPinPin均有个子的名称。Sensor框架在加载Element时根据每个Pin的名称自主进行拼接,拼接时一个InputPin只能连接一个OutPutPin,一个OutPutPin可连接多个InputPin。对应的Pin连接成功后,OutputPin输出的数据会立刻被InputPin收到。Element定义Pin及Feature使用宏定义的方式。Sensor:Element_ExampleElement_ExampleDeclare_Element_ID(2f1f7297-438d-4674-a8b4-a9982d5
6、21134) /定义Element ID,使用GUID,各Element不可重复Declare_Feature_Code(51) /定义输出Feature 51,(具体宏定义请参见FuncSDK)Declare_Feature_None /定义此Element无Feature输出Declare_Input_Pin_Start /InputPin定义开始Declare_Input_Pin(1,Example Element Input 1,false,EwayOS:CvMatBridge) /定义1号输入引脚,1为InputPin ID(同一Element下的InputPin ID不可重复),E
7、xample Element Input 1为此InputPin 的名称,框架拼接Element的Pin完全根据Pin的名称,相同即为可连,名称大小写敏感。false说明此引脚不是必须引脚,最后声明此引脚输入的数据类名,(数据类必须继承CEwayData)。Declare_Pin_End /InputPin定义结束Declare_Output_Pin_Start /OutputPin定义开始Declare_Output_Pin(1,Example Element Output 1,EwayOS:CvMatBridge) /定义1号输出引脚,1为OutputPin ID(同一Element下的O
8、utputPin ID不可重复),Example Element Output 1为此Output Pin 的名称,最后声明此引脚输出的数据类名。Declare_Pin_End /OutputPin定义结束Declare_Feedback_Start /保留功能eclare_FeedBack_End /保留功能Declare_Element_Implement(CExampleElement) /框架代码Sensor:ElementElement连接机制连接机制Sensor框架运行后,根据-t参数传入的文件名遍历此文件夹下的所有可用Element。当Sensor收到ActiveFeature指
9、令后检测本地是否存在拥有此FeatureCode的Element,若存在则开始连接流程。连接时以一个Element开始,遍历其所有InputPin,根据名称查找本地或网络内是否存在与其名称相同的OutputPin,若存在则加载该Element并将此InputPin及OutputPin进行连接。之后继续遍历,直至所有激活的Element的InputPin均配对成功,则该Feature激活成功。对于不必须InputPin,连接是框架会检测此引脚对应的输出引脚是否已激活,若已激活,则将此对引脚连接,若未激活,则不进行连接。若待连接的Element不在本机,框架会自动使用TCP/IP远程调用Eleme
10、nt,传输数据。Sensor t Elem fc 51存放Elem文件夹FeactureCode0 03 3HighLevelAI介绍HighLevelAI:1、HighLevelAI为EwayOS中的消息分发模块。2、HighAI 进程接受 Sensor 的广播消息,等待 Function 的请求,Function 可以向 HighAI 请求某个 Feature3、Function 进程可以向 HighAI 请求所需 Feature ,之后连接所请求的 Feature,获取所需 Feature 的消息。0 04 4Function介绍Function:Function是EwayOS中的具体功
11、能层。1、Function连接HighLevelAI获取机器人检测消息。2、Function连接LowLevelAI获得机器人运动控制3、Sensor根据机器人的传感器获取的数据运行算法进行运算,将计算结果发送至FunctionFunction是为了解决某个具体的问题而进行的分析、计算、规划运动等组成部分,它的设计其实就是消息队列,在预期的时间内处理预期的消息,进行机器人控制Function:1、消息驱动框架2、多级模块调用3、模块独立消息队列,自成体系4、封装各类机器人算法库、应用库Function:Message机制机制Function内部使用MessageList机制,所有消息(包含Hi
12、ghLevelAI检测到的周边数据,LowLevelAI发送的运动数据以及Function内部的Timer数据、自定义消息数据)均按到达时间及优先级加入一个消息队列,每个Function内部均存在在一个消息处理线程,该线程读取此消息列表,串行处理各消息。对于自定义消息,首先定义消息码,FunMsg_User之后的数字均可使用。之后在cpp文件中添加消息响应函数,最后在cpp文件中BEGIN_FIFEMSG_MAP与END_FIFMSG_MAP宏之间添加消息映射。Example:在头文件中添加#define MuFunMsg FunMsg_User+1eint OnMyMessage(eint&
13、 nMsgCode,edouble& dTimeStamp,eint& nParam1,eint& nParam2);MSG_FIFMAP(MuFunMsg,OnMyMessage)/在.cpp文件中END_FIFMSG_MAP前添加END_FIFMSG_MAPFunction:Feature机制机制Feature为Function向HighLevelAI请求某项识别、检测功能所使用。Function欲开启某项识别或检测功能时,需在Initialize时或Function运行的任何时间内调用RequestFeature请求Feature。Example:eint TestApp:Initial
14、ize(std:vector &vFeatureList,ebool& bLimbAuthority, edouble &dTimeOut) vFeatureList.push_back (SysCom_ID_LMsg_ArmPos); return ERR_NONE;Function:Feature机制机制请求成功后Function模块即会收到对应的识别、检测消息,此时框架回调用CheckMessageCode回调询问处理方式。代表处理方式,可选如下值:MsgProcCode_Ignore (0),本模块忽略此消息。MsgProcCode_Notify (1),当收到此消息时,框架将调用对应
15、的Pro函数通知模块处理。MsgProcCode_Record (2),当收到此消息时,框架将数据存储,模块需要获得数据时调用相应的GetMsgData函数获取数据。 若不设定返回值,统一按MsgProcCode_Ignore处理Function:Feature机制机制!注意1、所有请求成功的Feature应在不需要该功能时再次调用RequestFeature关闭。2、关闭Feature应在JobStart后,在调用Uninitialize前。在不需要该功能时随时关闭,若本Function模块可被父Function强制关闭,则应在ProcCloseCmd中关闭Feature。3、若请求Feat
16、ure成功后HighLevelAI掉线,Function不需重新请求Feature,框架会在HighLevelAI上线后自动重新请求。4、若在Function请求Feature成功后,由于Sensor原因造成Feature检测错误,Function会收到ProcFeatureStatus回调。Function:目前支持的FeatureCode。消息标识消息标识(FeatureCode)消息类型消息类型概述概述SysCom_ID_Vision_Marker(51)CMarkerMessageMarker识别数据SysCom_ID_Vision_Object(52)CObjectMessage物体
17、识别数据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_
18、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:Initialize机制机制Function在启动时必须要初始化资源,等资源初始化完成之后,系统会调入JobStart函数,开始Function真正的工作。Initialize为Function初始化函数,它有三个参数,Featu
19、reList(需要申请的资源列表)、LimbAuthority(机器人肢体控制权)和TimeOut(Function等待框架处理申请的时间(s)。用户需要填入本Function能正常运行所需要的所有Feature和Limb请求权限,等系申请成功后会自动调入JobStart中,如果系统没有申请成功且TimeOut没有赋值,则Function会处于一直等待的状态;如果申请没有成功但TimeOut有赋值,则会在等待时间后进入JobFailed。Initialize_Example:eint TestApp:Initialize(std:vector &vFeatureList,ebool& bLim
20、bAuthority, edouble &dTimeOut) vFeatureList.push_back (SysCom_ID_LMsg_ArmPos); bLimbAuthority = true; dTimeOut = 20;/等待JobStart的时间 return ERR_NONE;Function:Command机制机制Command为Function向LowLevelAI发送运动指令,控制机器人运动所使用。Command欲控制机器人运动时,可调用Send系列函数发送运动命令。LowLevelAI收到Send系列控制函数后,首先检查权限,权限正常后及发送返回值至Function,运
21、动函数返回,此时机器人还未开始运动,之后LowLevelAI开始规划运动轨迹,发送电机指令控制机器人运动。当指令发送完毕,等待下位机执行结束后,LowLevelAI会发送CommandDone消息至Function,通知Function该指令执行完毕。Function使用CmdSN识别CommandDone与之前发送的运动指令。eint WheelStraight:ProcMotCmdDone(edouble dTimeStamp,CCmdDoneMessage* piCmdDone)/ if(SysCom_ID_LCmd_WheelStraight = piCmdDone-m_nCmdID)
22、/判断是否是自己发送的命令 if(ERR_NONE = piCmdDone-m_nCmdStatus) /判断命令执行的结果 ewayos:Log:WriteLog (LogInfo, wheel命令执行成功。); std:coutCmdendstd:endl; else ewayos:Log:WriteLog (LogError, wheel命令执行失败); std:coutCmdfailstd:endl; Function:子子Function机制机制Function模块共有两种编写方式,一种生成独立app(emake -t fapp)或编译为lib库(emake -t flib),当编译
23、为lib库时,该Function可作为子Function被其它Function调用(app及lib均可)。调用方式为父Function调用AddChildFun函数,参数传入被调用lib库名去掉lib前缀及.so后缀。框架会自动实例化该子Function模块,将其连入HighLevelAI及LowLevelAI,子Function可获取消息数据,可发送肢体控制指令控制机器人运动。Kid_Example:EGUID gGuid;eint nLoadResult = AddChildFun (RobotMove, &gGuid, );if(ERR_NONE != nLoadResult) OSG_
24、WriteLog (LogError, 加载子Function出错,错误值:%d, nLoadResult);Function:子子Function机制机制子Function退出可选择两种方式,主动退出或被动退出。主动退出为子Function任务执行完毕,关闭Feature及肢体控制权,显式调用FunQuit函数通知父Function退出。调用FunQuit后,框架回调用子Function的Uninitialize函数,之后关闭消息处理线程,子Function退出。框架会调用父Function的ProcChildFunQuit回调通知父Function。被动退出为父Function调用Post
25、StopCmdToAllChildFun或PostStopCmdToChildFunByID函数通知子Function退出,框架会调用子Function的ProcCloseCmd回调通知子Function,此时子Function应立刻关闭Feature及肢体控制权,关闭timer,尽快调用FunQuit退出。调用FunQuit之后的流程与主动退出相同。Kid_Example:eint CFeedbackMove:ProcCloseCmd(edouble dTimeStamp,CCloseMessage* piCloseCmd) OSG_WriteLog(LogInfo, father clos
26、e); FunQuit (); return ERR_NONE;Function:Timer机制机制Function可使用SetTimer函数开关计时器,参数为间隔ms数。当间隔时间到达后,框架会向Function消息队列中插入一条Timer事件,当消息处理线程处理此消息时,会调用ProcTimer函数进行处理。注:注:此Timer为非精准Timer,时间间隔为传递消息的最小时间间隔。若由于程序问题造成消息处理线程响应不及时,可能会造成Timer事件在队列中累计,出现一个时段无ProcTimer,另一时段ProcTimer函数频繁调用。eint WheelMotorSpeed:ProcTime
27、r(edouble dTimeStamp) WheelMove(0.3,0.3);void WheelMotorSpeed:JobStart() SetTimer(500); return ;WEBUI:使用手机或带有wifi的电脑,连接ssid为MoRoXXXXXX的wifi,(XXXXXX为机器人序列号,如MoRo0000033),密码EwayBot2017Moro1。连接成功后打开浏览器,访问http:/192.168.8.100:3000即可链接机器人手动控制服务。用户名moro,密码moro即可进入。0 05 5WebUI介绍WEBUI-Rocker:Rocker页面为底盘控制页面,
28、拖动页面中间轨迹球即可控制机器人底盘运动。离中心越远速度越大。向左向右可控制底盘旋转。xpos、ypos、yaw为底盘码盘、imu读数融合后的里程计。坐标系为右手坐标系,X轴向前,Y轴向左。原点为双轮中心点。WEBUI-Rocker:“开启避障”按钮为是否开启底盘防碰撞保护功能。若开启此功能,底盘会根据超声波数据检测前后方障碍物,若底盘速度过快,存在碰撞风险,底盘会自动停止运动。Obstacle 16 为超声波检测数据,14为机器人身前超声波,从左向右排布,5在机器人身后左侧,6为右侧。显示数值为0-255mm,有效数值前方是0120,后方是080。WEBUI-ArmTrajectory:此页
29、面打开或关闭某一个机器人手臂应用轨迹。点击右上角Add按钮可上传自定义轨迹(上传文件格式为so库)。点击Edit,可对已添加手臂应用轨迹进行编辑。WEBUI-ArmAngle: 在此界面可单独下发每个手臂、Gripper电机的角度,更改完自己想要到达的值,点击下发即可WEBUI-ArmAngle:此页面打开或关闭某一个机器人应用。点击右上角Add按钮可上传自定义应用(上传文件格式为so库)。点击Edit,可对已添加应用进行编辑。WEBUI:此页面显示机器人当前各模块状态。上方自检按钮可运动机器人自检程序。(自检程序运行中机器人会小幅运动,请运行中清理机器人前方、左右约1m的空间)。自检完成后会生成自检报告(/home/moro/DiagnoseLog文件夹)下方电机状态如果变红,则表示电机故障