六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动)

2023-11-07

机器人直线插补算法,弧线插补算法+离线编程转换(空间直线插补规划、空间弧线插补规划、离线编程、ABB二次开发、六轴机器人控制、C#)

一,通过对空间点的插补,形成空间点轨迹

1.插补算法原理简述:

(1)直线插补时,指定起止坐标与速度。
(2)确定要插直线的周期增量,分解到xyz轴

思路:直线插补采用简单线性插补即可,根据插补次数分别计算各轴步矩然后累加。

(MatLab代码和C#代码)

Matlab代码
% 计算插补点数
stepNum = sqrt((p3(1)-p1(1))^2+(p3(2)-p1(2))^2+(p3(3)-p1(3))^2)/step;
pos = zeros(4,stepNum+1);
    
fprintf("lineNum\n");
dx=(p3(1)-p1(1))/stepNum;
dy=(p3(2)-p1(2))/stepNum;
dz=(p3(3)-p1(3))/stepNum;

for t=0:1:stepNum
	pos(1,t+1)=p1(1)+dx*t;
	pos(2,t+1)=p1(2)+dy*t;
	pos(3,t+1)=p1(3)+dz*t;
end
class LinearPath
    {
        int number = 0;
        double LineLength = 0;
        double dx, dy, dz = 0;
        public List<double> x_start = new List<double>();
        public List<double> y_start = new List<double>();
        public List<double> z_start = new List<double>();
        public void clear()
        {
            x_start.Clear();
            y_start.Clear();
            z_start.Clear();
        }
        public void Plan_path(double xs,double ys,double zs,double xe,double ye,double ze,double speed)
        {
            clear();            
            x_start.Add(xs);
            y_start.Add(ys);
            z_start.Add(zs);
            LineLength = Math.Sqrt((xe - xs) * (xe - xs) + (ye - ys) * (ye - ys) + (ze - zs) * (ze - zs));
            number = Convert.ToInt32(LineLength / speed);
            dx = (xe - xs) / number;
            dy = (ye - ys) / number;
            dz = (ze - zs) / number;
            for(int i = 0; i < number; i++)
            {
                x_start.Add(x_start[i] + dx);
                y_start.Add(y_start[i] + dy);
                z_start.Add(z_start[i] + dz);
            }
        }

    }

2.弧线插补算法简述

1.将三维平面转换到二维平面,将三维问题转化为二维went。

2.三点确定一个圆,通过该三点确定新坐标系的方向(以方向向量的形式显示)

3.通过将该三点转换到新坐标上,然后计算圆心和相关半径。

Matlab和C#代码

v1 = p2 - p1;
v2 = p3 - p1;
if find(norm(v1)==0) | find(norm(v2)==0) %#ok<OR2>
    fprintf('输入点不能一样\n');rad = -1;return;
end
v1n = v1/norm(v1);%坐标除以模长得到单位向量,该向量与原来方向向量相同
v2n = v2/norm(v2);
% 计算圆平面上的单位法向量
% 检查三点是否共线
nv = cross(v1n,v2n);
 if all(nv==0)
    fprintf('三个点共线\n');rad = -2;return;
 end
if find(sum(abs(nv),2)<1e-5)%查找nv总和是否小于1e-5
    fprintf('三点过于趋近直线\n');rad = -1;return;
end
% 计算新坐标系UVW轴
u = v1n;
w = cross(v2,v1)/norm(cross(v2,v1));%cross() return向量的叉积,即向量行列式[i j k;ax ay az;bx by bz];
v = cross(w,u);
% 计算投影
bx = dot(v1,u);
cx = dot(v2,u);
cy = dot(v2,v);
% 计算圆心
h = ((cx - bx/2)^2 + cy^2 -(bx/2)^2)/(2*cy);
center = zeros(1,3);
center(1,:) = p1(1,:) + bx/2.*u(1,:) + h.*v(1,:);
 public void Circelcenter_or_Rad(double[] p1,double[] p2,double[] p3)//形参输入采用字符串分割方法" ";
        {
             for(int i = 0; i < 3; i++)
            {
                v1[i] = p2[i] - p1[i];
                v2[i] = p3[i] - p1[i];
            }
             for(int i = 0; i < 3; i++)
            {
                v1n[i] = v1[i] / Math.Sqrt(v1[0] * v1[0] + v1[1] * v1[1] + v1[2] * v1[2]);//v1的单位向量
                v2n[i] = v2[i]/ Math.Sqrt(v2[0] * v2[0] + v2[1] * v2[1] + v2[2] * v2[2]);//v2的单位向量
            }
            nv[0] = v1n[1] * v2n[2] - v1n[2] * v2n[1];
            nv[1] = v1n[2] * v2n[0] - v1n[0] * v2n[2];
            nv[2] = v1n[0] * v2n[1] - v1n[1] * v2n[0];
            if (nv[0] == 0 & nv[1] == 0 & nv[2] == 0)
            {
                MessageBox.Show("Three points collinear!");return;
            }
            //else if (Math.Abs(nv[0]+nv[1]+nv[2])< 1.0000e-05)
            //{
            //    MessageBox.Show("Three points too close to straight line!");return;
            //}
            else
            {
                U = v1n;
                //W = cross(v2,v1)/norm((cross(v2,v1)));
                cW[0] = v2[1] * v1[2] - v2[2] * v1[1];
                cW[1] = v2[2] * v1[0] - v2[0] * v1[2];
                cW[2] = v2[0] * v1[1] - v2[1] * v1[0];
                for(int i = 0; i < 3; i++)
                {
                    W[i] = cW[i] / Math.Sqrt(cW[0] * cW[0] + cW[1] * cW[1] + cW[2] * cW[2]);
                }
                //v = cross(w,u);
                V[0] = W[1] * U[2] - W[2] * U[1];
                V[1] = W[2] * U[0] - W[0] * U[2];
                V[2] = W[0] * U[1] - W[1] * U[0];

                //bx = dot(v1,u)
                bx = v1[0] * U[0] + v1[1] * U[1] + v1[2] * U[2];
                //cx = dot(v2,u)
                cx = v2[0] * U[0] + v2[1] * U[1] + v2[2] * U[2];
                //cy = dot(v2,v)
                cy = v2[0] * V[0] + v2[1] * V[1] + v2[2] * V[2];

                //h = ((cx-bx/2)*(cx-bx/2)+cy*cy-(bx/2)*(bx/2))/(2*cy);
                h = ((cx - bx / 2) * (cx - bx / 2) + cy * cy - (bx / 2) * (bx / 2)) / (2 * cy);
                for (int i = 0; i < 3; i++)
                {
                    m_center[i] = p1[i] + ((bx / 2) * U[i]) + (h * V[i]);
                }
                m_rad = Math.Sqrt((m_center[0] - p1[0]) * (m_center[0] - p1[0]) + (m_center[1] - p1[1]) * (m_center[1] - p1[1]) + (m_center[2] - p1[2]) * (m_center[2] - p1[2]));
            }
        }

弧线轨迹效果图

离线编程:机器人离线编程,是指操作者在编程软件里构建整个机器人工作应用场景的三维虚拟环境,然后根据加工工艺等相关需求,进行一系列操作,自动生成机器人的运动轨迹,即控制指令,然后在软件中仿真与调整轨迹,最后生成机器人执行程序传输给机器人。

二,机器人二次开发和离线编程

1.机器人二次开发和离线编程

(1)通过API和ABB机器人通讯

(2)通过API对机器人进行进行基础数据操作(文件传输,启停,上电下电等其他控制)

(3)通过程序进行轨迹规划并基于不同机器人的语言自动产生离线程序

附上操作界面(界面)

 

实际操作过程图(轨迹规划和生成离线程序)

 

离线程序保存

离线程序上传文件保存代码

 try
            {
                if (this.richTextBox1.Text == "")
                    return;
                saveFileDialog1.DefaultExt = "txt";
                saveFileDialog1.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*|Rapidmod(*.mod)|*.mod";
                if (this.saveFileDialog1.ShowDialog() == DialogResult.Cancel)
                    return;
                string FileName = this.saveFileDialog1.FileName;

                if (saveFileDialog1.ShowDialog() == DialogResult.OK && FileName.Length > 0)
                {
                    // Save the contents of the RichTextBox into the file.
                    richTextBox1.SaveFile(saveFileDialog1.FileName, RichTextBoxStreamType.PlainText);
                    MessageBox.Show("文件已成功保存");
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("文件保存失败" + ex.ToString());
            }

实际操作视频

欢迎技术咨询同上篇文章!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动) 的相关文章

  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 生命在于折腾——MacOS(Inter)渗透测试环境搭建

    一 前景提要 之前使用的是2022款M2芯片的MacBook Air 13寸 不得不说 是真的续航好 轻薄 刚开始我了解到M芯片的底层是ARM架构 我觉得可以接受 虚拟机用的不多 但在后续的使用过程中 发现卡脖子就是卡脖子 随后换了联想R9
  • Linux内核的全局变量

    全局变量 srctree if KBUILD SRC KBUILD SRC CURDIR objtree CURDIR src srctree obj objtree VPATH srctree if KBUILD EXTMOD KBUIL
  • Blender人物骨骼绑定

    Blender人物骨骼绑定 1 建立骨骼父子关系 某些物体依附到其他物体上并成为它的子物体 可由骨骼按E键直接分裂出子骨骼 2 将骨骼建立和三维模型的父子关系 3 设置反向运动学 正常的正向运动学是FK 也就是父骨骼带动子骨骼 而如果想要实
  • mysql中的group by 和 having使用

    mysql中的group by 和 having 使用 理论 sql中的group by 用法解析 Group By语句从英文的字面意义上理解就是 根据 by 一定的规则进行分组 Group 它的作用是通过一定的规则将一个数据集划分成若干个
  • SDL 使用 framebuffer

    SDL 窗口系统 基于X11或WayLand协议 OpenGL 与硬件无关 通过发命令给GPU完成绘制工作 EGL 与硬件相关 是窗口系统 SDL 和OpenGL媒介 SDL Simple DirectMedia Layer 是一套开放源代
  • SpringBoot统一接口返回

    文章目录 前言 思路 1 定义标识 可以定义一个注解作为标识 2 对Controller或者method打上标识 3 请求时判断是否存在该标识 可以利用拦截器 4 对结果重新写入 前言 前后分离时 我们要定义好统一的接口返回格式 eg co
  • PCL点云处理之泊松曲面重建(一百六十一)

    PCL点云处理之泊松曲面重建 一百六十一 一 算法介绍 二 算法实现 1 代码 2 效果 一 算法介绍 泊松曲面重建基于泊松方程 根据泊松方程使用矩阵迭代求出近似解 采用移动立方体算法提取等值面 对所测数据点集重构出被测物体的模型 泊松方程
  • 【C语言基础】标准库函数strcat的使用

    文章目录 C语言基础 标准库函数strcat的使用 一 功能解释 二 函数原型 三 使用示例 1 使用字符数组作为第一个参数 2 使用指向字符数组的指针作为第一个参数 3 使用字符串常量作为第二个参数 4 使用字符数组作为第二个参数 5 使
  • PyTorch学习笔记(20) ——激活函数

    0 前言 本博客内容翻译自纽约大学数据科学中心在2020发布的 Deep Learning 课程的Activation Functions and Loss Functions部分 废话不多说 下面直接开始吧 1 激活函数 本内容将回顾一些
  • js删除数组中指定元素

    js删除数组中某一项或几项的几种方法 一 删除第一个元素 1 shift 方法用于把数组的第一个元素从其中删除 并返回第一个元素的值 注意 此方法改变数组的长度 提示 移除数组末尾的元素可以使用 pop 方法 let arr 1 2 3 4
  • LEARN C++(Methods)

    Getting the most out of these tutorials As you go through these tutorials we recommend a number of practices to maximize
  • CSS 之实现它们它们和它们

    一 CSS画图形 1 用CSS画三角形 首先 需要把元素的宽度 高度设为0 然后设置边框样式
  • mkdocs 使用说明

    mkdocs 使用说明 安装 pip3 install mkdocs 1 4 2 创建项目 mkdocs new my project cd my project 修改 mkdocs yml site name My Docs site u
  • C#使用Quartz.NET详细讲解

    Quartz NET是一个开源的作业调度框架 是OpenSymphony 的 Quartz API的 NET移植 它用C 写成 可用于winform和asp net应用中 它提供了巨大的灵活性而不牺牲简单性 你能够用它来为执行一个作业而创建
  • PCRE正则表达式

    PCRE正则表达式的定义 用于描述字符排列和匹配模式的一种语法规则 它主要用于字符串的模式分割 匹配 查找及替换操作 PHP中的正则函数 PHP中有两套正则函数 两者功能差不多 分别为 一套是由PCRE Perl Compatible Re
  • 黑盒测试中的等价类和边界值

    黑盒测试时基于程序规格说明书 找出程序不符合格则说明书的地方 也就是我们常说的点点点 在进行黑盒测试时 我们可以利用一下几种方法来写出测试用例 尽量用科学的方法来找出更多的缺陷 等价类划分 等价类划分是一种重要的 常用的黑盒测试方法 不需要
  • js打开新的窗口window_前端必备基础知识:window.location 详解

    作者简介 李中凯 八年多工作经验 前端负责人 擅长JavaScript Vue 掘金文章专栏 KaysonLi 的个人主页 专栏 掘金 前端开发人员对 window location对象应该不陌生 通过它不但可以获取当前页面的地址信息 还可
  • android mtk6732 camera otp 加载流程

    在android的hal层获取属性节点信息值 Get Property char value PROPERTY VALUE MAX 0 property get camcaldrv log value 0 MINT32 dumpEnable
  • Java垃圾回收【GC】详解

    什么是垃圾 垃圾是内存中没有任何引用指向它 并且没有引用的对象无法使用 所以就可以认为这个对象是垃圾 需要被回收释放其占用的内存空间 垃圾定位 1 引用计数法 RefrenceCount 堆中每个对象实例都有一个引用计数 每当有一个引用指向
  • 六轴机器人轨迹规划(直线轨迹规划,弧线轨迹规划)——C#实现+ABB为例(规划直接下发离线程序运动)

    机器人直线插补算法 弧线插补算法 离线编程转换 空间直线插补规划 空间弧线插补规划 离线编程 ABB二次开发 六轴机器人控制 C 一 通过对空间点的插补 形成空间点轨迹 1 插补算法原理简述 1 直线插补时 指定起止坐标与速度 2 确定要插