实例一
Link Here:基于ROS和Orocos的机器人控制系统
通信协议接口:接收控制端输入的控制指令,选择控制指令相应的机器人运动规划的响应函数
算法模块:由响应函数,计算控制指令数据
通信管理模块:将控制指令数据输出至控制部件
第一接口:总控模块与算法模块之间通信连接
第二接口:算法模块与通信管理模块进行连接
第三接口:接收通信管理模块传入的反馈信息
基于ROS,利用Orocos的实时输入/输出接口,实现总控模块,算法模块和通信管理模块之间的通信
作为实施例
使用 ROS 的 procreate-catkin-pkg 方法创建 ROS 的 Package
并在 Package 中继承 OROCOS 的 RTT::Taskcontext 类
利用 OROCOS 的 RTT::Input 与 RTT::Output 方法定义实时输入/输出接口
硬件结构模型:
总控模块接入控制端的人机交互界面的控制指令
Linux主机可以是X86架构的PC机,或者ARM芯片嵌入式架构的开发板。Linux主机中可以安装Xenomai或者其他实时内核补丁,安装ROS,Orocos,rFSM等软件
机器人控制系统搭建的软件架构图:
总控模块:
创建ROS的package,记为Ec_control_system,
然后在Package中,继承Orocos的RTT::TaskContext类,记为Ec_control_system_component
Ec_control_system_component类的构造函数中,执行以下操作:
- 利用Orocos的RTT::Input和RTT::Output方法,对模块的输入\输出接口进行定义
- 利用Orocos的Operational Caller方法设置函数调用接口,用于对算法模块的相应响应函数进行调用
- 调用Orocos的Properties方法定义总控模块的属性,将总控模块定义为一个机械臂关节个数的属性
Ec_control_system_component的StartHook()成员函数,建立与人机交互界面的通信连接
Ec_control_system_component的CleanUpHook()成员函数,关闭与人机交互界面的通信连接
算法模块:
创建ROS的package,记为Ec_control_loop,
继承Orocos的RTT::TaskContext类,记为Ec_control_loop_component
- 利用RTT::Input与RTT::Output,对输入\输出接口进行定义,输入状态机的数据,输出状态机的事件
- 利用Orocos的Operational Caller方法设置函数调用接口,设置控制指令响应函数
- 调用Orocos的Properties方法定义算法模块的属性,算法模块定义一个机械臂关节个数的属性
在Ec_control_loop_component的StarHook()成员函数中,检查是否有电机数据并上传至总控
在Ec_control_loop_component的UpdateHook()成员函数中,按照指定频率读取状态机状态
对于Ec_control_loop_component类,定义了运动的函数调用接口
通信管理模块
通过Linux主机minicom中的ttyACM0与ARM开发板通信,可以在ARM开发板上运行一个CANOpen主站协议。使用Orocos的RTT::Input与RTT::Output方法与机器人算法模块和总控模块进行通信
创建ROS的package,继承Orocos的RTT::TaskContext类,创建一个Orocos的实时模块,记为Ec_component
ROS通过rtt_ros_integration和Orocos连接,实现实时通信
创建ROS的package
在package中通过继承Orocos的RTT::TaskContext类,创建一个Orocos的实时模块
在RTT::TaskContext类的构造函数中,执行如下操作:
- 利用Orocos的RTT::Input与RTT::Output方法,对输入,输出接口进行定义
- 利用Orocos的Operational Caller方法设置函数调用接口,设置控制指令响应函数
- 调用Orocos的Properties方法定义算法模块的属性
StartHook成员函数,初始化并建立连接
UpdateHook成员函数,按固定频率读取模块的状态(回调函数)
CleanUpHook成员函数,断开连接
控制器状态机的状态变化示意图:
设备状态机的状态变化示意图: