抱歉标题不好,我真的不知道如何简短地描述它......
我的场景是,对于机器人应用程序,我们需要一个实时循环来每 1ms 控制一次电机。同时我们可能想做一些没有实时要求的事情,例如路径规划、图像处理、对象识别等。此外,非实时任务的一些结果将被发送到实时电机控制循环来控制机器人。
对于实时部分,我使用带有 RT-Preempt Patch 的 Ubuntu。因此,我可以像这里的示例代码一样在 while 循环中运行实时控制循环。
但是,我不知道非实时部分。以我的拙见,我会在同一进程中新建一个线程并在该线程中运行非实时任务。
由于我对实时编程非常陌生,所以我不知道我的设计会出现什么问题。此外,我想知道是否有设计这种程序的范式?
- -编辑 - -
有关我的应用程序的更多详细信息。
机器人,更具体地说,是机械臂。
对于实时部分,它计算正向运动学、逆向运动学和雅可比。然后使用简单的 PID 控制器计算正确的输出命令。最后,使用 EtherCAT 向每个电机发送电机命令。
对于非实时部分,比如可以从kinect获取PointCloud流,做一些预处理,计算场景中物体的位姿,为机械臂确定一个好的抓握位姿,最后发送每个人的目标电机到实时部分,这样机器人手臂就会真正移动到目标并抓住物体。整个过程可能需要 10 秒左右。但同时实时循环应保持运行并发送适当的力命令或位置命令,以使机器人手臂保持其原始姿势并静止不动。
对于这两个部分之间的通信,在大多数情况下,命令是通过一种新颖的算法从非实时部分生成的,并将其发送到实时部分,以使机械臂运动。然而,有时非实时部分的算法需要知道,例如,末端执行器的当前姿势。因此,非实时部分需要从位于实时部分的正向运动学中获取信息。