static void planner_recalculate()
{
//读前一个块数据
uint8_t block_index = plan_prev_block_index(block_buffer_head);
// 如果前一个块已经优化了返回
if (block_index == block_buffer_planned) { return; }
/*粗略地最大化所有可能的加速曲线,从缓冲区的最后一个区块开始反向规划。当达到最后一个最优计划或尾部指针时,停止计划。注意:正向通道以后将完善和修正反向通道,以创建一个最佳计划。*/
float entry_speed_sqr;
plan_block_t *next;
plan_block_t *current = &block_buffer[block_index];
/*认为块最后的退出速度为0,按照块的加速度和移动距离计算出最大速度,这个速度和这块的进入速度比较,取最小值*/
current->entry_speed_sqr = min( current->max_entry_speed_sqr, 2*current->acceleration*current->millimeters);
/*读取前一个块数据。后面的循环程序是从后往前计算每个块的进入速度,即计算块是不
是减速,如果是减速(小于max_entry_speed_sqr),设置进入速度= entry_speed_sqr,如果大于max_entry_speed_sqr,表示这一段不是全程减速*/
block_index = plan_prev_block_index(block_index);
if (block_index == block_buffer_planned) { //如果这个块已经优化了
// 如果这个块是block_buffer_tail,更新step buffer
if (block_index == block_buffer_tail) { st_update_plan_block_parameters(); }
} else {
while (block_index != block_buffer_planned) {//只要没有优化,循环计算速度
next = current;
current = &block_buffer[block_index];
block_index = plan_prev_block_index(block_index);
// 如果这个块是block_buffer_tail,更新step buffer
if (block_index == block_buffer_tail) { st_update_plan_block_parameters(); }
speed.
if (current->entry_speed_sqr != current->max_entry_speed_sqr) {
entry_speed_sqr = next->entry_speed_sqr + 2*current->acceleration*current->millimeters;
if (entry_speed_sqr < current->max_entry_speed_sqr) {
current->entry_speed_sqr = entry_speed_sqr;
} else {
current->entry_speed_sqr = current->max_entry_speed_sqr;
}
}
}
}
/*向前推算优化速度。从几经优化的块出发,按照加速过程计算,如果推算的进入速度小于next->entry_speed_sqr,设置进入速度= entry_speed_sqr。置优化*/
. next = &block_buffer[block_buffer_planned]; // Begin at buffer planned pointer
block_index = plan_next_block_index(block_buffer_planned);
while (block_index != block_buffer_head) {
current = next;
next = &block_buffer[block_index];
if (current->entry_speed_sqr < next->entry_speed_sqr) {
entry_speed_sqr = current->entry_speed_sqr + 2*current->acceleration*current->millimeters;
if (entry_speed_sqr < next->entry_speed_sqr) {
next->entry_speed_sqr = entry_speed_sqr;
block_buffer_planned = block_index;
}
}
//如果进入速度已经是max_entry_speed_sqr,没有优化的空间了,置优化标志
if (next->entry_speed_sqr == next->max_entry_speed_sqr) { block_buffer_planned = block_index; }
block_index = plan_next_block_index( block_index );
}
}
该博客详细分析了Grbl控制系统中的Planner_recalculate()函数,该函数用于优化步进电机的运动规划,通过反向和正向通道计算每个块的最大入口速度,确保加速度和移动距离的合理搭配,以实现最佳的运动路径规划。
4296

被折叠的 条评论
为什么被折叠?



