【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 : 插补算法

本文提供直线插补的概念基础,基本思路分析,C语言实现等,代码会直接贴出!

插补算法是指在数值计算或数据处理中,根据已有的数据点或采样点,推断出未知数据点或采样点的值的方法。

插补算法可以通过已知数据点之间的关系来填补数据间的空缺或缺失值,从而恢复完整的数据。

在图像处理、信号处理、曲线拟合等领域中,插补算法被广泛应用。

常见的插补算法有线性插值、最邻近插值、多项式插值和样条插值等。插补算法可以帮助我们填补数据缺失的部分,从而更好地分析和处理数据。

目录

概念引入--优化的拟合直线:

直线插补—逐点比较法公式:

 进给情况一:在第一象限的进给与插补

 进给情况二:在第二象限的进给与插补

逐点比较法的总结:

直线插补—逐点比较法 的C实现:

效果展示:

 代码给出:

结束语:


概念引入--优化的拟合直线:

如图:这有一条直线需要我们进行弥合绘制,它的起点是原点(0,0),终点目标是A(6,4)

 我们很容易想到:

因为它的俩个端点固定,因此在数学计算关系式上,我们对其进行补足时,只需计算其斜率:

k=(4-0)/  (6-0)  =  2/3  ;然后将这个运算关系带入电机控制移动,X走一格时,Y同时走2/3,

直到到达点A即可~~

但现实却不会这样:

如果我们的机械电机设计精度远大于这个需求长度分度要求,我们可以尝试使用这个求斜率的办法去弥合绘制该曲线,但实际与理论相悖,

在微观层面,计算机与加工电机或者加工刀具是无法做到如此精准的绘制与定位的,在加工的时候,不同的产品有各式各样的形状。计算机对其直线上每个点的定位,在微观上总是不准确的:

简单的形状,可以轻松的实现。如位置点,只需要确定xy位置,电机运动到xy点上,就能够加工成功。

但是对于比较复杂的形状,此时如果我们去考虑它所有的运行轨迹,所有的运动位置点,这样会非常复杂,计算机的工作量也会大大的增加。

因此在实际应用中,对于复杂的形状,我们无法精确地确定每个点的位置,而是通过数据密化,尽可能的去拟合它真实的形状,通过这种方式,不仅能在达到精度要求的前提下,还能够大大减小计算机的工作量,这就是“插补”。

 下图即是对插补的理解画法:

其中我们需要抽离三个概念:

1.理论直线轨迹(肉眼轨迹)                   ——粉色直线

2.实际运行轨迹(机械轨迹)                   ——棕色折线

3.实际给进点情况(X、Y机械运行步骤)——红色箭头

                                                                (向上向下是给Y,向做向右是进给X)

 我们从此图可以看出,这种对于不是45度角度斜率的直线的弥合,我们并不是每次只需,X进1,Y进1就可了,而是有某些部分是需要多进给的,就比如此图,它就在(3,2)后又在此多进给了X一次,以达到对于2/3这个斜率的更佳弥合~~

直线插补—逐点比较法公式:

以下公式是指源于旧的基础上进行运算得出新的F值:

F  =  F  -   |Ye|           (F>=0)

F  =  F  +  |Xe|           (F < 0 )

 

 进给情况一:在第一象限的进给与插补

我们直接看到之前的题目:它在第一象限,看看如何理解使用这个公式:

F>=0      表示只能在X坐标上进给

F<0        表示只能在Y坐标上进给

首先我们需要初始化一些数据,它们的值与运算关系如下:

F=0;

E=|Ax|+|Ay|     (终点判断,大小与目标点的横纵坐标有关)

在插补过程中每走一步要完成以下4个工作节拍。

①偏差判别   ——

判别当前动点偏离理论曲线的位置(即F旧)。这是有基础公式的

②进给控制   ——

确定进给坐标及进给方向。这是需要根据终点象限不同,而有所变化的,有的象限进给X表示在X轴加一,有的象限则是在X轴减一

③新偏差计算 ——

迸给后动点到达新位置,计算出新偏差值(即F新),作为下一步判别的依据。

④终点判别    ——

查询一次,终点是否到达。

   步数

(一共是E)

偏差判断

(F旧)

坐标进给

(X或Y:

注意象限)

坐标

(X,Y)

偏差计算

(F新)

终点判断 E
0(0,0)F(0,0)=010
1F(0,0)=0+X(1,0)

F(1,0)=0-4

=-4

9
2F(1,0)=-4+Y(1,1)F(1,1)=-4+6=28
3F(1,1)>0+X(2,1)F(2,1)=2-4=-27
4F(2,1)<0+Y(2,2)F(2,2)=-2+6=46
5F(2,2)>0+X(3,2)F(3,2)=4-4=05
6F(3,2)=0+X(4,2)F(4,2)=0-4=-44
7F(4,2)<0+Y(4,3)F(4,3)=-4+6=23
8F(4,3)>0+X(5,3)F(5,3)=2-4=-22
9F(5,3)<0+Y(5,4)F(5,4)=-2+6=41
10F(5,4)>0+X(6,4)F(6,4)=4-4=00

这样,在编写绘图程序的时候,只需这样一次一次安排好下次插补直线的终点坐标,便可以自己设计,绘制各种各样的复杂形状:

 

 

 进给情况二:在第二象限的进给与插补

 这次,我们的情况有所改变,不仅目标变为了第二象限的点(-4,3),起点也变为(0.1),而插补计算肯定是要从原点(0,0)开始的,此时,该如何安排电机的运作呢?

 其实,我们这里就要分为俩个步骤:

1.移动到新起点

2.计算新终点的坐标

 此处我们肯定希望起点还是原点(0,0)的,因此在电机运动的程序设计上,可以使其先移动到(0,1)后开始插补绘制,为保持斜率不变,新的A点坐标也要随之改变为(-4,2)。

第二象限,乃至其余象限,直线插补的公式不会改变,但是进给X、Y时的加减是会改变的,

比如此处的插补,终点坐标经过我们修改后是(-4,2),由此终点坐标判断可得出:

在X轴的进给变为负的,在Y轴方向的进给仍是正的 原理就是判断终点坐标的正负即可

 

下面我们继续绘制图表来帮助理解过程:

   步数

(一共是E)

偏差判断

(F旧)

坐标进给

(X或Y:

注意象限)

坐标

(X,Y)

偏差计算

(F新)

终点判断 E
0(0,0)F(0,0)=06
1F(0,0)=0-X(-1,0)F(-1,0)=0-2=-25
2F(-1,0)<0+Y(-1,1)F(-1,1)=-2+4=24
3F(-1,1)>0-X(-2,1)F(-2,1)=2-2=03
4F(-2,1)=0-X(-3,1)F(-3,1)=0-2=-22
5F(-3,1)<0+Y(-3,2)F(-3,2)=-2+4=21
6F(-3,2)>0-X(-4,2)F(-4,2)=2-2=00

最终弥合效果如下图:

 

逐点比较法的总结:

这是我从网上盗的图,可以看看归纳,帮助理解 :

 

直线插补—逐点比较法 的C实现:

这里展示我编写的C代码,它使用逐点比较法实现了各个象限的直线插补,只需输入目标点的坐标,就会自动识别在哪个象限,并且会打印输出每一步的过程坐标,

效果展示:

 代码给出:

#include "stdio.h"
#include "math.h"//需要终点坐标差补 
void Straight_Line_Interpolation(int x,int y);int main(void)
{Straight_Line_Interpolation(6,4);
}//直线差补算法 
//需要终点坐标差补 
void Straight_Line_Interpolation(int x,int y)
{//当前点坐标int draw[2]={0,0};//E:终点判断 //F:偏差计算 //i:当前插补步数(最终要等于E) int E,F,i;E=abs(x)+abs(y);F=0;//循环次数就是E决定的for(i=0;i<E;i++){//先判断偏差F,决定进给X还是Yif(F>=0) {//再根据判断终点X,Y在哪个象限,决定进给情况if(x>0)        {draw[0]+=1;}else if(x<0)   {draw[0]-=1;}		 //计算本次产生的新的偏差F F=F-abs(y);printf("(%d,%d)\r\n", draw[0], draw[1]);}//先判断偏差F,决定进给X还是Yelse if(F<0) {//再根据判断终点X,Y在哪个象限,决定进给情况if(y>0)       {draw[1]+=1;} else if(y<0)  { draw[1]-=1; }//计算本次产生的新的偏差F F=F+abs(x);printf("(%d,%d)\r\n", draw[0], draw[1]);	}}
}

结束语:

最后希望这篇文章对大家有用,喜欢可以三连支持一下~~~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/27112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单例模式(C++)

定义 保证一个类仅有一个实例&#xff0c;并提供一个该实例的全局访问点。 应用场景 在软件系统中&#xff0c;经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例&#xff0c;才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器&#xff0c;提供一种…

Babel编译与Webpack

目录 Babel初识BabelBabel 使用方式使用 Babel 前的准备工作 WebpackWebpack介绍Webpack初体验Webpack核心概念入口&#xff08;entry&#xff09;出口&#xff08;output&#xff09;加载 (loader)插件&#xff08;plugins&#xff09; Babel Babel官网: https://babeljs.io/…

【Hystrix技术指南】(6)请求合并机制原理分析

[每日一句] 也许你度过了很糟糕的一天&#xff0c;但这并不代表你会因此度过糟糕的一生。 [背景介绍] 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被使…

小白到运维工程师自学之路 第六十四集 (dockerfile构建tomcat、mysql、lnmp、redis镜像)

一、tomcat&#xff08;更换jdk&#xff09; mkdir tomcat cd tomcat/ tar xf jdk-8u191-linux-x64.tar.gz tar xf apache-tomcat-8.5.40.tar.gzvim Dockerfile FROM centos:7 MAINTAINER Crushlinux <syh163.com> ADD jdk1.8.0_191 /usr/local/java ENV JAVA_HOME /us…

国内大模型在局部能力上已超ChatGPT

中文大模型正在后来居上&#xff0c;也必须后来居上。 数科星球原创 作者丨苑晶 编辑丨大兔 从GPT3.5彻底出圈后&#xff0c;大模型的影响力开始蜚声国际。一段时间内&#xff0c;国内科技公司可谓被ChatGPT按在地上打&#xff0c;毫无还手之力。 彼时&#xff0c;很多企业…

怎么快速搭建BI?奥威BI系统做出了表率

搭建BI系统有两大关键&#xff0c;分别是环境搭建和数仓建设。这两点不管是哪一个都相当地费时费力&#xff0c;那要怎么才能快速搭建BI平台&#xff0c;顺利实现全企业数字化运营决策&#xff1f;奥威BI系统方案&#xff0c;你值得拥有&#xff01; 奥威BI系统方案&#xff0…

三种方法实现tab栏切换(CSS方法、JS方法、Vue方法)

一、需求 给下图的静态页面添加tab栏切换效果 二、CSS方法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"v…

云知识库软件的推荐清单,你看看你喜欢哪一个?

在选择云知识库软件时&#xff0c;有很多因素需要考虑&#xff0c;如功能、易用性、可定制性、安全性、价格等。下面是一些我喜欢的云知识库软件推荐清单&#xff1a; Confluence&#xff1a; Confluence是一款由Atlassian开发的知识管理和协作工具。它提供了强大的编辑和协作…

Go微服务实践 - Rpc核心概念理解

概述 从0研究一下Golang已经Golang的微服务生态体系&#xff0c;Golang的微服务首先要从Rpc开始&#xff0c;在升级到Grpc&#xff0c;详细介绍这些技术点都在解决什么技术问题。 Rpc Rpc (Remote Procedure Call) 远程过程调用&#xff0c;简单的理解是一个节点请求另一个节…

【果树农药喷洒机器人】Part4:果树冠层图像实例分割模型优化

文章目录 一、引言二、数据集制作2.1图像采集2.2图像标注与增强 三、构建柑橘树冠实例分割模型结构3.1优化特征提取网络3.2U-Net替换FCN 一、引言 为准确获取柑橘树冠的生长信息&#xff0c;实现果树喷药机器人的精准喷施&#xff0c;对处于多种生长阶段的柑橘树冠进行图像分割…

AI和ChatGPT:人工智能的奇迹

AI和ChatGPT&#xff1a;人工智能的奇迹 引言什么是人工智能&#xff1f;ChatGPT&#xff1a;AI的语言之王ChatGPT的工作原理ChatGPT的优势和挑战AI和ChatGPT的未来展望结论 引言 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一项令人兴奋的…

IAR开发环境的安装、配置和新建STM32工程模板

IAR到环境配置到新建工程模板-以STM32为例 一、 简单介绍一下IAR软件1. IAR的安装&#xff08;1&#xff09; 下载IAR集成开发环境安装文件&#xff08;2&#xff09; 安装 2. 软件注册授权 二、IAR上手使用(基于STM32标准库新建工程)1、下载标准库文件2、在IAR新建工程&#x…

ImageNet Classification with Deep Convolutional Neural Networks

&#xff08;一&#xff09;Some Words: 这里主要是通过记录一些笔记来阅读这篇 Paper&#xff0c;它的产生跟 ImageNet LSVRC-2010 竞赛有关&#xff0c;通过训练一个大的、深的卷积网络来将 1.2 million 的 HR 图像分成 1000 类 &#xff0c;这个网络实现了 top-1 37.5% 和 …

GPU显存泄露/显存溢出/显存爆炸 解决方案

问题描述 最近在跑一个基于pytorch的强化学习代码&#xff0c;在训练过程中显存增大非常明显&#xff0c;迭代不到200个iteration就可以占据70G的显存。由于博主是第一次在pytorch实现的强化学习算法上加入自己的实现&#xff0c;很没有应对经验&#xff0c;现将调试过程记录下…

计算机网络(5) --- http协议

计算机网络&#xff08;4&#xff09; --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…

使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph

本文由社区用户 Albert 贡献&#xff0c;首发于 NebulaGraph 论坛&#xff0c;旨在提供多一种的部署方式使用 NebulaGraph。 在本文&#xff0c;我将会详细地记录下我用 K8s 部署分布式图数据库 NebulaGraph 的过程。下面是本次实践的内容规划&#xff1a; 一到十章节为 K8s 集…

用html+javascript打造公文一键排版系统16:更新单个附件说明排版,实现多个附件说明排版

利用公休的时间继续完善。 一、更新单个附件说明排版 之前实现单个附件说明排版时&#xff0c;我们只考虑了“附件&#xff1a;”中冒号为半角的情况&#xff0c;而没有考虑存在多任余空格的情况&#xff0c;我们今天先针对存在多任余空格的情况进行完善&#xff0c;增加了温…

APP外包开发的开发语言对比

在开发iOS APP时有两种语言可以选择&#xff0c;Swift&#xff08;Swift Programming Language&#xff09;和 Objective-C&#xff08;Objective-C Programming Language&#xff09;&#xff0c;它们是两种不同的编程语言&#xff0c;都被用于iOS和macOS等苹果平台的软件开发…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Po模型介绍 1、简…