到底一个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
到目前为止,我们可以看出整个弧线和小线段的执行流程如下。