当前位置: 首页 > wzjs >正文

企业网站管理系统 软件著作权百度推广介绍

企业网站管理系统 软件著作权,百度推广介绍,学院网站建设管理办法,如何用wordpress做网页前言 GRBL 是一款高性能、开源的嵌入式 CNC(计算机数控)控制器固件,专为 Arduino 平台优化,广泛应用于雕刻机、激光切割机、3D 打印机及其他精密运动控制场景。自 2009 年发布以来,GRBL 凭借其高效的运动规划算法、稳…

前言

GRBL 是一款高性能、开源的嵌入式 CNC(计算机数控)控制器固件,专为 Arduino 平台优化,广泛应用于雕刻机、激光切割机、3D 打印机及其他精密运动控制场景。自 2009 年发布以来,GRBL 凭借其高效的运动规划算法、稳定的实时控制性能和紧凑的代码结构,成为创客、工程师和制造商的首选解决方案。

本文深入剖析 GRBL1.1 的圆弧插补实现原理,从参数解析、误差控制逐层拆解,帮助读者理解其底层逻辑与设计思想,为开发者优化运动算法或用户调参提供理论参考。

一.GRBL圆弧插补流程

1 .函数定义部分

#ifdef USE_LINE_NUMBERSvoid mc_arc(float *position, float *target, float *offset, float radius, float feed_rate, uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc, int32_t line_number)
#elsevoid mc_arc(float *position, float *target, float *offset, float radius, float feed_rate,uint8_t invert_feed_rate, uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc)
#endif

这是一个条件编译的函数定义,根据是否定义了USE_LINE_NUMBERS宏决定是否包含line_number参数

参数说明:

position: 当前位置坐标数组

target: 目标位置坐标数组

**offset: **从起点到圆心的偏移量

radius: 圆弧半径

**feed_rate: **进给速率

invert_feed_rate: 是否反转进给速率标志

**axis_0: **第一个圆弧平面轴(X/Y/Z中的某一个)

axis_1: 第二个圆弧平面轴

**axis_linear: **线性轴(垂直于圆弧平面的轴)

**is_clockwise_arc: **是否为顺时针圆弧标志

**line_number: **(可选)行号,用于调试或G代码解析

2 .流程图

以下是圆弧插补流程图

二.GRBL圆弧插补算法

1 .圆心坐标计算

根据 gc_execute_line()函数, 对G02,G03代码进行解析,通过向量几何和勾股定理,将G代码中的两点+半径参数转换为圆心坐标。

uint8_t gc_execute_line(char *line) 
{
...// 如果当前单位为英寸模式,将半径值转换为毫米if (gc_block.modal.units == UNITS_MODE_INCHES) { gc_block.values.r *= MM_PER_INCH; }// 计算中间变量 h_x2_div_d = 4*r² - x² - y²float h_x2_div_d = 4.0 * gc_block.values.r*gc_block.values.r - x*x - y*y;// 如果计算结果为负,说明圆弧半径错误(无法构成有效圆弧)if (h_x2_div_d < 0) { FAIL(STATUS_GCODE_ARC_RADIUS_ERROR); } // [圆弧半径错误]// 完成 h_x2_div_d 的计算:-sqrt(h_x2_div_d)/hypot(x,y) // 等价于 -(h * 2 / d)h_x2_div_d = -sqrt(h_x2_div_d)/hypot_f(x,y); // 如果是逆时针圆弧(CCW),反转 h_x2_div_d 的符号(参见下方示意图)if (gc_block.modal.motion == MOTION_MODE_CCW_ARC) { h_x2_div_d = -h_x2_div_d; }  // 处理负半径情况if (gc_block.values.r < 0) { h_x2_div_d = -h_x2_div_d; gc_block.values.r = -gc_block.values.r; // 将半径取正值}        // 通过计算得出圆弧的实际中心坐标(完成操作)gc_block.values.ijk[axis_0] = 0.5*(x-(y*h_x2_div_d));  // 计算x轴的圆心坐标gc_block.values.ijk[axis_1] = 0.5*(y+(x*h_x2_div_d)); // 计算y轴的圆心坐标
}

圆心坐标求解图

由距离公式:

d = x 2 + y 2 \begin{align*} d = \sqrt{x^2 + y^2} \end{align*} d=x2+y2

由勾股定理:

h = r 2 − ( d 2 ) 2 = 4 r 2 − x 2 − y 2 2 \begin{align*} h &= \sqrt{r^2 - \left(\frac{d}{2}\right)^2} = \frac{\sqrt{4r^2 - x^2 - y^2}}{2} \end{align*} h=r2(2d)2 =24r2x2y2

由△ADO 和△TBC 相似:

∣ A D ∣ = y d ⋅ h ∣ D O ∣ = x d ⋅ h \begin{align*} |AD| &= \frac{y}{d} \cdot h \\[10pt] |DO| &= \frac{x}{d} \cdot h \end{align*} ADDO=dyh=dxh

P(0,0)为当前位置,T(x,y)为目标位置,圆心坐标(向量推导):

A 的坐标 ( x 2 , y 2 ) (\frac{x}{2} ,\frac{y}{2}) (2x,2y)

i = x 2 − ∣ A D ∣ = x 2 − y d ⋅ h j = y 2 + ∣ D O ∣ = y 2 + x d ⋅ h % 圆心坐标计算公式 \begin{align*} i &= \frac{x}{2}-|AD|= \frac{x}{2} - \frac{y}{d} \cdot h \\[10pt] % X轴圆心坐标(i = x/2 - (y/d)*h) j &=\frac{y}{2}+|DO|= \frac{y}{2} + \frac{x}{d} \cdot h % Y轴圆心坐标(j = y/2 + (x/d)*h) \end{align*} ij=2xAD=2xdyh=2y+DO=2y+dxh

半径有效性检查:

计算 4 r 2 − x 2 − y 2 4r^2 - x^2 - y^2 4r2x2y2,若为负说明半径太小(无法通过两点)

触发错误条件: r < d 2 r < \frac{d}{2} r<2d(即半径小于两点距离的一半)

2.半径向量计算

调用mc_arc()函数进行半径向量计算

float center_axis0 = position[axis_0] + offset[axis_0];
float center_axis1 = position[axis_1] + offset[axis_1];
float r_axis0 = -offset[axis_0];  // 圆心到起点的向量
float r_axis1 = -offset[axis_1];
float rt_axis0 = target[axis_0] - center_axis0;  // 圆心到终点的向量
float rt_axis1 = target[axis_1] - center_axis1;

半径坐标求解图

圆心坐标计算:

x c = x p + i y c = y p + j \begin{align*} x_c &= x_p + i \\ y_c &= y_p + j \\ \end{align*} xcyc=xp+i=yp+j

半径向量计算:

r ⃗ = ( − i , − j ) r ⃗ t = ( x t − x c , y t − y c ) \begin{align*} \vec{r} &= (-i, -j) \\ \vec{r}_t &= (x_t - x_c, y_t - y_c) \end{align*} r r t=(i,j)=(xtxc,ytyc)

3.角度行程计算

求解angular_travel的大小,即圆心指向起点向量与圆心指向终点向量间的夹角

float angular_travel = atan2(r_axis0*rt_axis1 - r_axis1*rt_axis0, r_axis0*rt_axis0 + r_axis1*rt_axis1);
if (is_clockwise_arc) { if (angular_travel >= -EPSILON) angular_travel -= 2*M_PI;  // 顺时针补全负角度
} else {if (angular_travel <= EPSILON) angular_travel += 2*M_PI;   // 逆时针补全正角度
}

角度行程求解图

反正切函数的加减法公式:

arctan ⁡ A + arctan ⁡ B = arctan ⁡ ( A + B 1 − A B ) arctan ⁡ A − arctan ⁡ B = arctan ⁡ ( A − B 1 + A B ) \begin{align*} \arctan A + \arctan B &= \arctan\left(\frac{A+B}{1-AB}\right) \\ \arctan A - \arctan B &= \arctan\left(\frac{A-B}{1+AB}\right) \end{align*} arctanA+arctanBarctanAarctanB=arctan(1ABA+B)=arctan(1+ABAB)

给定两点:

A ( x 0 , y 0 ) , B ( x 1 , y 1 ) A(x_0,y_0), \quad B(x_1,y_1) A(x0,y0),B(x1,y1)

它们的极角分别为:

∠ A = arctan ⁡ ( y 0 x 0 ) , ∠ B = arctan ⁡ ( y 1 x 1 ) \angle A = \arctan\left(\frac{y_0}{x_0}\right), \quad \angle B = \arctan\left(\frac{y_1}{x_1}\right) A=arctan(x0y0),B=arctan(x1y1)

根据反正切减法公式,两角之差为:

∠ B − ∠ A = arctan ⁡ ( y 1 x 1 ) − arctan ⁡ ( y 0 x 0 ) = arctan ⁡ ( y 1 x 1 − y 0 x 0 1 + y 1 x 1 ⋅ y 0 x 0 ) (应用反正切减法公式) = arctan ⁡ ( x 0 y 1 − x 1 y 0 x 0 x 1 + y 0 y 1 ) (分子分母同乘  x 0 x 1 ) \begin{align*} \angle B - \angle A &= \arctan\left(\frac{y_1}{x_1}\right) - \arctan\left(\frac{y_0}{x_0}\right) \\ &= \arctan\left(\frac{\frac{y_1}{x_1} - \frac{y_0}{x_0}}{1 + \frac{y_1}{x_1} \cdot \frac{y_0}{x_0}}\right) \quad \text{(应用反正切减法公式)} \\ &= \arctan\left(\frac{x_0 y_1 - x_1 y_0}{x_0 x_1 + y_0 y_1}\right) \quad \text{(分子分母同乘 $x_0 x_1$)} \end{align*} BA=arctan(x1y1)arctan(x0y0)=arctan(1+x1y1x0y0x1y1x0y0)(应用反正切减法公式)=arctan(x0x1+y0y1x0y1x1y0)(分子分母同乘 x0x1

4.分段数计算(几何逼近)

将圆弧插补成足够多的小线段,arc_tolerance为圆弧上任意两点连接而成的小线段到圆弧的最大距离arc_tolerance越小,则圆弧微分成的小线段越多,插补精度也越高。

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

数学推导图

弦高误差 at(即 arc_tolerance)与 半弦长 k 的关系:

k = r 2 − ( r − a t ) 2 = a t ( 2 r − a t ) \begin{align*} k &= \sqrt{r^2 - (r - at)^2 }= \sqrt{at(2r - at)} \\ \end{align*} k=r2(rat)2 =at(2rat)

总弧长 arc 和分段数 s 的关系:

a r c = r ⋅ ∣ θ ∣ s = a r c 2 k \begin{align*} arc&=r\cdot |\theta| \\ s&=\frac{arc}{2k} \\ \end{align*} arcs=rθ=2karc

代入后得到

s = a r c 2 k = 0.5 ∣ θ ∣ ⋅ r a t ( 2 r − a t ) \begin{align*} s &= \frac{a r c}{2 k} = \frac{0.5 |\theta| \cdot r}{\sqrt{at(2r - at)}} \\ \end{align*} s=2karc=at(2rat) 0.5∣θr

5.小角度近似优化(泰勒展开)

三角函数的泰勒展开

float theta_per_segment = angular_travel/segments;//每个线段对应的圆心角
// axis_linear,除了圆弧平面之外的第三个轴,即与圆弧平面垂直的轴
float linear_per_segment = (target[axis_linear] - position[axis_linear])/segments;
float cos_T = 2.0 - theta_per_segment * theta_per_segment;  // 2 - θ²
// θ*(1 - θ²/6) (sin的三阶泰勒近似)
float sin_T = theta_per_segment * 0.16666667 * (cos_T + 4.0); 
cos_T *= 0.5;  // → 1 - θ²/2 (cos的二阶泰勒近似)

数学推导图

每个线段对应的圆心角:

θ p = θ n s \begin{align*} \theta_p &= \frac{\theta_n}{s} \end{align*} θp=sθn

泰勒展开式:

s i n x = x − x 3 3 ! + o ( x 3 ) c o s x = 1 − x 2 2 ! + o ( x 2 ) \begin{align*} sin x &= x - \frac{x^3}{3!} + o(x^3) \\ cos x &= 1 - \frac{x^2}{2!} + o(x^2) \end{align*} sinxcosx=x3!x3+o(x3)=12!x2+o(x2)

cosx 公式取前两项,sinx 公式取前三项得:

cos ⁡ θ p ≈ 1 − θ p 2 2 sin ⁡ θ p ≈ θ p − θ p 3 6 ≈ 1 6 ⋅ θ p ⋅ ( 2 − θ p 2 + 4 ) \begin{align*} \cos\theta_p &\approx 1 - \frac{\theta_p^2}{2} \\ \sin\theta_p &\approx \theta_p - \frac{\theta_p^3}{6} \approx \frac{1}{6}\cdot\theta_p \cdot(2 - \theta_p^2 +4) \end{align*} cosθpsinθp12θp2θp6θp361θp(2θp2+4)

6.位置计算

通过混合近似与精确计算来优化圆弧插补的精度和效率:快速近似法(旋转矩阵增量更新,40μs/次)用于多数计算,而高精度修正(直接三角函数计算,375μs/次)每隔N_ARC_CORRECTION次执行一次,既避免累积误差,又维持整体速度;对于微小圆弧(分段数少),仅用近似计算也能保证误差可控,实现速度与精度的最佳平衡。

float sin_Ti;       // 临时存储当前角度的正弦值
float cos_Ti;       // 临时存储当前角度的余弦值
float r_axisi;      // 旋转后的临时半径向量(用于中间计算)
uint16_t i;         // 循环计数器
uint8_t count = 0;  // 圆弧修正计数器(控制修正频率)for (i = 1; i < segments; i++) { // 遍历每个线段(共 segments-1 次)// 如果未达到修正间隔(N_ARC_CORRECTION),使用增量旋转矩阵近似计算if (count < N_ARC_CORRECTION) {// 应用旋转矩阵更新半径向量(约 40 微秒/次)r_axisi = r_axis0 * sin_T + r_axis1 * cos_T;  // 计算旋转后的新半径分量r_axis0 = r_axis0 * cos_T - r_axis1 * sin_T;  // 更新x轴半径分量r_axis1 = r_axisi;                            // 更新y轴半径分量count++;                                      // 递增修正计数器} // 达到修正间隔时,进行精确的圆弧半径修正(约 375 微秒/次)else {// 通过初始半径向量(=-offset)和变换矩阵计算精确位置cos_Ti = cos(i * theta_per_segment);          // 计算当前角度的余弦sin_Ti = sin(i * theta_per_segment);          // 计算当前角度的正弦r_axis0 = -offset[axis_0] * cos_Ti + offset[axis_1] * sin_Ti; //精确计算x轴半径分量r_axis1 = -offset[axis_0] * sin_Ti - offset[axis_1] * cos_Ti; //精确计算y轴半径分量count = 0;                                    // 重置修正计数器}// 更新圆弧目标位置坐标position[axis_0] = center_axis0 + r_axis0;       // x轴坐标 = 圆心坐标 + x半径分量position[axis_1] = center_axis1 + r_axis1;       // y轴坐标 = 圆心坐标 + y半径分量position[axis_linear] += linear_per_segment;     // 线性轴(如Z轴)按分段增量移动
}

快速近似法:

通过叠加半径分量得到当前点坐标:

P 0 = { r cos ⁡ φ = r _ a x i s 0 r sin ⁡ φ = r _ a x i s 1 \begin{align*} P_0 &= \begin{cases} r \cos \varphi = \mathrm{r\_axis}_0 \\ r \sin \varphi = \mathrm{r\_axis}_1 \end{cases} \\ \end{align*} P0={rcosφ=r_axis0rsinφ=r_axis1

P 1 = { r cos ⁡ ( φ + θ p ) = r cos ⁡ φ cos ⁡ θ p − r sin ⁡ φ sin ⁡ θ p = r _ a x i s 0 ⋅ cos ⁡ θ p − r _ a x i s 1 ⋅ sin ⁡ θ p r sin ⁡ ( φ + θ p ) = r sin ⁡ φ cos ⁡ θ p + r cos ⁡ φ sin ⁡ θ p = r _ a x i s 1 ⋅ cos ⁡ θ p + r _ a x i s 0 ⋅ sin ⁡ θ p \begin{align*} P_1 &= \begin{cases} r \cos (\varphi + \theta_p) = r\cos\varphi\cos\theta_p - r\sin\varphi\sin\theta_p = \mathrm{r\_axis}_0 \cdot \cos \theta_p - \mathrm{r\_axis}_1 \cdot \sin \theta_p \\ r \sin (\varphi + \theta_p) = r\sin\varphi\cos\theta_p + r\cos\varphi\sin\theta_p = \mathrm{r\_axis}_1 \cdot \cos \theta_p + \mathrm{r\_axis}_0 \cdot \sin \theta_p \end{cases} \end{align*} P1={rcos(φ+θp)=rcosφcosθprsinφsinθp=r_axis0cosθpr_axis1sinθprsin(φ+θp)=rsinφcosθp+rcosφsinθp=r_axis1cosθp+r_axis0sinθp

P 2 = { r cos ⁡ ( φ 1 + θ p ) = r cos ⁡ φ 1 cos ⁡ θ p − r sin ⁡ φ 1 sin ⁡ θ p = r _ a x i s 0 ⋅ cos ⁡ θ p − r _ a x i s 1 ⋅ sin ⁡ θ p r sin ⁡ ( φ 1 + θ p ) = r sin ⁡ φ 1 cos ⁡ θ p + r cos ⁡ φ 1 sin ⁡ θ p = r _ a x i s 1 ⋅ cos ⁡ θ p + r _ a x i s 0 ⋅ sin ⁡ θ p \begin{align*} P_2 &= \begin{cases} r \cos (\varphi_1 + \theta_p) = r\cos\varphi_1\cos\theta_p - r\sin\varphi_1\sin\theta_p = \mathrm{r\_axis}_0 \cdot \cos \theta_p - \mathrm{r\_axis}_1 \cdot \sin \theta_p \\ r \sin (\varphi_1 + \theta_p) = r\sin\varphi_1\cos\theta_p + r\cos\varphi_1\sin\theta_p = \mathrm{r\_axis}_1 \cdot \cos \theta_p + \mathrm{r\_axis}_0 \cdot \sin \theta_p \end{cases} \end{align*} P2={rcos(φ1+θp)=rcosφ1cosθprsinφ1sinθp=r_axis0cosθpr_axis1sinθprsin(φ1+θp)=rsinφ1cosθp+rcosφ1sinθp=r_axis1cosθp+r_axis0sinθp

高精度修正:

每隔N_ARC_CORRECTION次执行一次,既避免累积误差,又维持整体速度

P 0 = { r cos ⁡ φ = r _ axis 0 = − offset [ axis 0 ] r sin ⁡ φ = r _ axis 1 = − offset [ axis 1 ] \begin{align*} P_0 &= \begin{cases} r \cos \varphi = r\_{\text{axis}0} = -\text{offset}[\text{axis}_0] \\ r \sin \varphi = r\_{\text{axis}1} = -\text{offset}[\text{axis}_1] \end{cases} \end{align*} P0={rcosφ=r_axis0=offset[axis0]rsinφ=r_axis1=offset[axis1]

P i = { r cos ⁡ ( φ + i θ ) = r cos ⁡ φ cos ⁡ i θ − r sin ⁡ φ sin ⁡ i θ = − o f f s e t [ a x i s 0 ] ⋅ cos ⁡ i θ + o f f s e t [ a x i s 1 ] ⋅ sin ⁡ i θ r sin ⁡ ( φ + i θ ) = r sin ⁡ φ cos ⁡ i θ + r cos ⁡ φ sin ⁡ i θ = − o f f s e t [ a x i s 1 ] ⋅ cos ⁡ i θ − o f f s e t [ a x i s 0 ] ⋅ sin ⁡ i θ \begin{align*} P_i &= \begin{cases} \begin{aligned} r \cos (\varphi + i\theta) &= r \cos \varphi \cos i\theta - r \sin \varphi \sin i\theta \\ &= -\mathrm{offset}[\mathrm{axis}_0] \cdot \cos i\theta + \mathrm{offset}[\mathrm{axis}_1] \cdot \sin i\theta \\[5pt] r \sin (\varphi + i\theta) &= r \sin \varphi \cos i\theta + r \cos \varphi \sin i\theta \\ &= -\mathrm{offset}[\mathrm{axis}_1] \cdot \cos i\theta - \mathrm{offset}[\mathrm{axis}_0] \cdot \sin i\theta \end{aligned} \end{cases} \end{align*} Pi= rcos(φ+iθ)rsin(φ+iθ)=rcosφcosiθrsinφsiniθ=offset[axis0]cosiθ+offset[axis1]siniθ=rsinφcosiθ+rcosφsiniθ=offset[axis1]cosiθoffset[axis0]siniθ

参考文章

参考CSDN文章:grbl源码解析——圆弧插补

http://www.dtcms.com/wzjs/41538.html

相关文章:

  • 网站建设和使用情况营销网络
  • 个人怎么建立网站北京百度竞价托管公司
  • 东莞网站建设公司 网络服务佛山网站建设公司哪家好
  • 杭州九鸿科技网站开发免费的网络推广平台
  • 深圳公司网站建设seo赚钱
  • 网站设计大作业免费的网站平台
  • c 如何快速做动态网站关键字挖掘爱站网
  • 北京装修平台网站seo站群优化
  • 怎么做免费网站 视频推广网址
  • 威海住房建设部官方网站吸引人的软文标题
  • 好的外贸网站建设莆田百度快照优化
  • 网站建设是什么专业啊网络软文是什么
  • 网站制作英文版网站seo是什么意思怎么解决
  • 做网站的图片传进去很模糊企业新闻营销
  • 如何做简单网站app注册推广任务平台
  • dede网站搬家后为什么都没有内容呢放单平台大全app
  • 网站建设公司中企动力强南宁网络推广有几家
  • 9个做简历的网站沈阳seo建站
  • 如何做百度推广网站seo学徒招聘
  • 杭州做网站推广公司推荐如何免费创建自己的平台
  • 哪家做网站好做企业网站哪个平台好
  • 网站建设的费用计什么科目搭建网站步骤
  • 怎样网站不用备案市场调研方案怎么写
  • 谁做视频网站网络销售怎么学
  • thinkphp网站开发教程营销型网站制作企业
  • 校园超市网站开发常见的网络营销模式
  • 国外美女图片 网站源码志鸿优化设计官网
  • 网站建设 sql优化模型有哪些
  • 网站建设 提供源码app推广方案策划
  • 竞价网站做不做链接广州市口碑全网推广报价