美文网首页
运动控制器3:如何调度多个BLOCK单元的运动?

运动控制器3:如何调度多个BLOCK单元的运动?

作者: 吴松乾 | 来源:发表于2017-12-27 11:18 被阅读0次

    到底一个BLOCK运动的距离是多少,这个取决于运动轨迹的形状,如果是一段单一的直线,当然就是一个BLOCK(应该是),如果走一段弧线,弧线分成了5个小线段(一般这个值会很大),则分成5个BLOCK,所以BLOCK才需要调度。

    MC_LINE中调用了plan_buffer_line函数,也就是说,每一段小线段都需要首先放入调度器,等待上一段完成。plan_buffer_line的入口参数如下。

    //添加一个线段运动到队列,XYZ轴单位为mm,feed_rate为给进速度,invert_feed_rate意味着给进速度为1/FEED_RATE

    //此函数仅仅为MC_LINE使用,而执行圆弧实际上也是执行小线段。

    void plan_buffer_line(float x, float y, float z, float feed_rate, uint8_t invert_feed_rate)

    {……

    planner_recalculate();

    }

    其中planner_recalculate为重新计算运动的调度,函数本体如下

    static void planner_recalculate()

    {   

      planner_reverse_pass(); //进入速度进行反向检查

      planner_forward_pass(); //进入速度进行正向检查

      planner_recalculate_trapezoids(); //重新计算梯形

    }

    算法如下:

    重新过一遍刚刚计算的梯形曲线的各个运动阶段,计算一下节点速度需要减少多少。

    节点速度不能超过最大的设置速度

    如果梯形不需要在节点处进行减速,我们要计算下一个BLOCK的加速度

    重新过一遍每一个BLOCK的顺序,如果某个BLOCK的加速度需要加快,则计算出来。

    当所有的Block都规划好了,每个BLOCK都将获得一个入口速度,加速度。

    然后重新计算一下梯形的各个参数(优化)

    其中如何进行正向和反向检查,主要用到了

    planner_reverse_pass

    prev_block_index

    planner_reverse_pass_kernel

    planner_forward_pass

    planner_forward_pass_kernel

    next_block_index

    到目前为止,我们可以看出整个弧线和小线段的执行流程如下。

    BLOCK单元的调度和优化后进行列队

    相关文章

      网友评论

          本文标题:运动控制器3:如何调度多个BLOCK单元的运动?

          本文链接:https://www.haomeiwen.com/subject/znaygxtx.html