抱歉标题不好,我真的不知道如何描述…
我的情况是,对于机器人应用程序,我们需要一个实时循环来每1ms控制一次电机.同时我们可能想要做一些没有实时要求的事情,例如路径规划,图像处理,对象识别等.此外,非实时任务的一些结果将被发送到实时电机控制循环来控制机器人.
对于实时部分,我使用Ubuntu和RT-Preempt Patch.因此,我可以在while循环中运行实时控制循环,就像示例代码here一样.
但是,我不知道非实时部分.在我看来,我会在同一个进程中创建一个线程并在该线程中运行非实时任务.
由于我对实时编程很新,我不知道我的设计会出现什么问题.此外,我想知道是否有任何设计此类程序的范例?
– -编辑 – –
关于我的申请的更多细节.
更具体地说,机器人是机器人手臂.
对于实时部分,它计算正向运动学,反向运动学和雅可比.然后使用简单的PID控制器计算正确的输出命令.最后,使用EtherCAT将电机命令发送到每个电机.
例如,对于非实时部分,可以从kinect获取PointCloud流,进行一些预处理,计算场景中对象的姿势,确定机器人手臂的良好抓握姿势,最后发送每个的目标.电机到实时部分,以便机器人手臂实际移动到目标并抓住物体.整个过程可能需要10秒左右.然而,同时实时循环应该继续运行并发送适当的力命令或位置命令,以使机器人手臂保持其原始姿势并保持静止.
对于这两个部分之间的通信,在大多数情况下,命令由来自非实时部分的新算法生成,并将其发送到实时部分以使机器人手臂移动.然而,有时非实时部分中的算法将需要知道例如末端执行器的当前姿势.因此,非实时部分将需要从正向运动学中获取信息,该正向运动学驻留在实时部分中.
解决方法:
什么是实时循环?我猜(因为你提到“每1毫秒做一些电机控制”)做一些非常短的计算,并输出几个字节到电机设备.
什么是非实时部分在做什么?我想象一些用户界面???
什么样的机器人?
路径规划可能需要很强的实时性,特别是在机器人快速移动的情况下.巡航导弹或谷歌汽车与robocup的小型机器人不同.失去几毫秒的通信可能会在巡航导弹或谷歌汽车上杀死人类,但在机器人上可以接受 – 你只会丢失一个游戏,也许会伤害你的机器人.
速度为40米/秒(144公里/小时,略高于法国130公里/小时的公路限速),2毫秒意味着8厘米,如果8厘米是人肉,则可能意味着杀死某人.
两部分如何相互作用?实时部分是否向其他部分发送了一些信息?
也许这两个部分可能是一些不同的进程(而不是线程)与一些通信?也许使用带信号量的共享内存进行同步.然后看看sem_overview(7)和shm_overview(7).
请注意,在实时和“非实时”部分之间的接口处,非实时部分实际上也可能变为“实时”部分.
重点是定义两个(实时与非实时)部分之间的概念界面,并决定是否能够承受丢失一些数据和一些同步(两部分之间的通信).
如果非实时部分的角色只是显示或设置速度(即某些低和高阈值),您可能有时会丢失一些数据或同步.但是细节就是邪恶(如果机器人是一辆真正的自动驾驶汽车,在Google Car的某些高速公路上行驶,你可能不应该失去一些交换,然后这两个部分都变成了实时!).