关于Grbl中mc_arc的一点认识

跟Marlin中的贝塞尔曲线规划类似,都是将曲线离散成多个点,相邻点构成的直线的中点与该小段曲线中点的差恰好在误差范围内。圆上的离散点比较好找,因为圆是规则的,可以通过以下方法轻松找到这些离散点。

计算圆心到圆弧起始点向量b(r_axis0 ,r_axis1)和圆心到圆弧终点向量c(rt_axis0 ,rt_axis1)的夹角的正切值,注意夹角a的方向是起始点向量b逆时针转向终点向量c的角,这个在后面判断角度值符号时会用到。根据向量夹角余弦公式,推出向量夹角正切公式,套入向量b和向量c的坐标,即可得出tana。下面公式中的atan2是反正切函数,a=atan2(y,x),即角度a=y/x的正切值。

float angular_travel = atan2(r_axis0*rt_axis1-r_axis1*rt_axis0, 
    r_axis0*rt_axis0+r_axis1*rt_axis1);

if (gc_state.modal.motion == MOTION_MODE_CW_ARC) { 
    //如果圆弧顺时针移动,角度应该是负值,如果计算出的角度为正值,需要在计算出的角度基础上减去2*pi(pi为圆周率)
    if (angular_travel >= 0) { angular_travel -= 2*M_PI; }
} else {
    //如果圆弧逆时针移动,角度应该是正值,如果计算出的角度为负值,需要在计算出的角度基础上加上2*pi(pi为圆周率)
    if (angular_travel <= 0) { angular_travel += 2*M_PI; }
}

圆弧上的小线段到弧顶的最大距离,这里设为h,有图可知,假设线段|AB|长度的一半为k,那么有勾股定理可知,r*r=k*k+(r-h)*(r-h)。知道了r和h,那么k*k=h*(2*r-h)。这样总共的小线段个数也就出来了,这就是下面这个公式的含义。

uint16_t segments = floor(fabs(0.5*angular_travel*radius)/
             sqrt(settings.arc_tolerance*(2*radius - settings.arc_tolerance)));

得到段数后,对总的角度平均分segments段,即可得到满足条件的离散点,发给mc_line。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值