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

到底一个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单元的调度和优化后进行列队
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容