C#使用SharGL实现PUMA560机械臂

news2024/11/25 6:55:09

1、四轴机械臂

下载链接:https://download.csdn.net/download/panjinliang066333/89645225

关键代码

public void DrawRobot1(ref OpenGL gl,float[] angle,float[] yLength,bool isPuma560_Six)
        {
            //坐标系说明:
            //①X轴正向:屏幕朝右
            //②Y轴正向:屏幕朝上
            //③Z轴正向:屏幕朝外

            float xSize = 2.0f, zSize = 2.0f;
            float xArm1 = 2.5f;
            //机器人底盘
            gl.PushMatrix();
            {
                gl.Color(1.0f, 1.0f, 0.0f); //黄色
                gl.Translate(xSize * 2.5 - 0.5f, -yLength[0], zSize * 2);
                gl.Scale(xSize * 5, 1.0f, zSize * 5);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画第一关节,偏航轴:绕Y轴旋转
            gl.PushMatrix();
            {
                gl.Color(1.0f, 0.0f, 0.0f);     //红颜色

                //1、绕自身中心轴旋转->绕Y轴旋转
                gl.Translate(-xSize / 2, -yLength[0] / 2, -zSize / 2);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                gl.Translate(xSize / 2, yLength[0] / 2, zSize / 2);

                //绘制当前轴
                gl.Scale(xSize, yLength[0], zSize);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画一关节肩膀:绕Y轴旋转
            gl.PushMatrix();
            {
                gl.Color(1.0f, 1.0f, 1.0f);     //白颜色
                gl.Translate(0.0f, -0.5f, 0.0f);

                //绕关节1中心轴旋转
                gl.Translate(-xSize / 2, -yLength[0] / 2, -zSize / 2);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                gl.Translate(xSize / 2, yLength[0] / 2, zSize / 2);

                gl.Translate(xSize + 0.5f, 0.0f, 0.0f);
                gl.Scale(xArm1, 1.0f, 1.0f);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画第二关节,俯仰轴:自身绕X轴旋转->再绕关节1绕Y轴旋转
            gl.PushMatrix();
            {
                gl.Color(0.0f, 0.0f, 1.0f);     //蓝色
                gl.Translate(0.0f, yLength[1] - 1.0f, 0.0f);

                //2、绕关节1轴旋转->绕Y轴旋转-旋转半径xSize
                gl.Translate(-xSize / 2, -yLength[1] / 2, -zSize / 2);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                gl.Translate(xSize + xArm1, 0.0f, 0.0f);    //到关节1中心轴距离
                gl.Translate(xSize / 2, yLength[1] / 2, zSize / 2);

                //1、绕自身轴旋转-绕X轴旋转  
                gl.Translate(-xSize, -yLength[1], -zSize / 2);
                gl.Rotate(angle[1], 1.0f, 0.0f, 0.0f);
                gl.Translate(xSize, yLength[1], zSize / 2);

                //绘制当前轴
                gl.Scale(xSize, yLength[1], zSize);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画第三关节,俯仰轴:自身绕X轴旋转->然后绕关节2绕X轴旋转->再绕关节1绕Y轴旋转
            gl.PushMatrix();
            {
                gl.Color(0.0f, 1.0f, 0.0f);     //绿色
                //gl.Translate(0.0f, 0.0f, zSize / 2);

                //3、绕关节1轴旋转->绕Y轴旋转
                gl.Translate(-xSize / 2, -yLength[1] / 2, -zSize / 2);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                gl.Translate(xSize * 2 + xArm1, 0.0f, 0.0f);
                gl.Translate(xSize / 2, yLength[1] / 2, zSize / 2);

                gl.Translate(0.0f, yLength[1] + yLength[2] - 2.0f, -zSize / 2);   //关节3位置
                //2、绕关节2轴旋转->绕X轴旋转-旋转半径yLength[2]                
                gl.Translate(-xSize, -(yLength[1] + yLength[2] - 2.0f), zSize / 2);
                gl.Rotate(angle[1], 1.0f, 0.0f, 0.0f);
                gl.Translate(xSize, yLength[1] + yLength[2] - 2.0f, zSize / 2);

                //1、绕自身轴旋转-绕X轴旋转  
                gl.Translate(-xSize, -yLength[2], -zSize / 2);
                gl.Rotate(angle[2], 1.0f, 0.0f, 0.0f);
                gl.Translate(xSize, yLength[2], zSize / 2);

                //绘制当前轴
                gl.Scale(xSize, yLength[2], zSize);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();

            //画第四关节,翻滚轴:自身绕Z轴旋转->再绕关节3绕X轴旋转->再绕关节2绕X轴旋转->再绕关节1绕Y轴旋转
            gl.PushMatrix();
            {
                float axis4Xsize = xSize * 3.0f, axis4Ysize = yLength[3], axis4Zsize = zSize * 1.5f;

                gl.Color(1.0f, 0.0f, 1.0f);     //紫颜色
                gl.Translate(0.0f, yLength[1] + yLength[2], 0.0f);

                //4、绕关节1轴旋转-绕Y轴旋转                
                gl.Translate(-xSize / 2, 0.0f, -zSize / 2);
                gl.Rotate(angle[0], 0.0f, 1.0f, 0.0f);
                gl.Translate(xSize * 3 + xArm1, 0.0f, axis4Zsize / 2);    //到关节1中心轴距离
                gl.Translate(xSize / 2, 0.0f, zSize / 2);

                //3、绕关节2轴旋转-绕X轴旋转
                gl.Translate(-axis4Xsize/2, -yLength[1] - yLength[2], -axis4Zsize/2);
                gl.Rotate(angle[1], 1.0f, 0.0f, 0.0f);
                gl.Translate(axis4Xsize/2, yLength[1] + yLength[2], axis4Zsize/2);

                //2、绕关节3轴旋转-绕X轴旋转
                gl.Translate(-axis4Xsize / 2, -yLength[2] - yLength[3], -axis4Zsize / 2);
                gl.Rotate(angle[2], 1.0f, 0.0f, 0.0f);
                gl.Translate(axis4Xsize / 2, yLength[2] + yLength[3], axis4Zsize / 2);                               
                                
                //1、绕自身轴旋转-绕Y轴旋转 
                gl.Translate(-axis4Xsize / 2, 0.0f, -axis4Zsize / 2);
                gl.Rotate(angle[3], 0.0f, 1.0f, 0.0f);                
                gl.Translate(axis4Xsize / 2, 0.0f, axis4Zsize / 2);

                //绘制当前轴
                gl.Scale(axis4Xsize, axis4Ysize, axis4Zsize);
                DrawCube(ref gl, 0.0f, 0.0f, 0.0f, false);
            }
            gl.PopMatrix();
           
           

        }

2、六轴机械臂

下载链接:https://download.csdn.net/download/panjinliang066333/89645231

模型示意图

实物示意图

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

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

相关文章

【运维系列】windows虚拟机作为服务器,将服务启动作为脚本设置为开机自启,服务中断、手动操作的烦恼通通滚蛋!

文章目录 前言一、开机启动文件夹(StartUp)是否可行?二、任务计划程序1.编写脚本2.打开任务计划程序3.创建任务4.配置常规选项5.配置触发器选项6. 配置操作选项7.配置条件选项8.配置设置选项 总结 前言 在实际应用过程中,我们难免…

有没有电脑桌面监控软件|大佬都在用的7大电脑屏幕监控软件!

当谈到电脑桌面监控软件时,确实有许多受欢迎且功能强大的选项。 这些软件在企业管理、远程办公、家庭监控等多个领域都有广泛应用。 以下是大佬常用的7大电脑屏幕监控软件推荐: 1. Teramind 特点:它是一款功能强大的企业级监控软件&#x…

永久旋转 PDF 文件的 3 种简便方法

PDF 文件通常由扫描仪创建,用于呈现文档或书籍。当您输出 PDF 作品时,打开它,会发现有几页是颠倒的。 你应该做什么? 将这些页面倒置扫描,按顺序排列,最后创建正确的 PDF 文件? 当然&#xf…

<数据集>安全帽和安全背心识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:22141张 标注数量(xml文件个数):22141 标注数量(txt文件个数):22141 标注类别数:3 标注类别名称:[helmet, vest, head] 序号类别名称图片数框数1helmet15937572402v…

轻量级TinyDB数据库文件写入和增删改查操作

1. TinyDB 数据库简介 TinyDB 是一个轻量级的 NoSQL 文档型数据库,由 Python 实现,无需额外的配置,以 JSON 文件作为存储,默认使用文件系统来存储数据。 2. 安装基本库 pip install tinydb pip install Faker3. 数据库操作 im…

无线麦克风哪个品牌音质最好,口碑最好的麦克风品牌推荐

​随着个人媒体和视频内容的普及,每个人都有机会成为内容的创作者。在这样的趋势下,拥有一个好的录音设备就显得尤为重要。无线领夹麦克风正好满足了这种需要,它不仅能够提供清晰、稳定的音质,还能使内容创作更具有专业性和观赏性…

基于个性化定制的智慧校园管理系统设计与开发

TOC springboot296基于个性化定制的智慧校园管理系统设计与开发 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是…

C语言常用的内存函数

在上一篇博客中我为大家分享了一些常用的字符串函数,以及它们的用法和模拟实现。通过字符串函数中的strcpy,我们能够做到将一个字符串中的内容拷贝到另一个字符串上,可如果有一天我们想把一个整型数组中的内容拷贝到另一个整型数组中呢&#…

大模型混合云,到了系统性创新突围的关键时刻

文 | 智能相对论 作者 | 陈泊丞 亚马逊与Anthropic、微软与OpenAI以及华为云提出的大模型混合云概念等等种种信号都在表明,云计算与大模型深度融合发展的趋势已是业内共识。 目前,以生成式AI为导向,越来越多的公司开始加速大模型技术在云计…

够豪横,310万不要了,后续损失恐上千万

近日,深圳一套法拍房引起了整个圈子的轰动! 20年前花费382万购入的豪宅,现在竟能拍到8389万,翻了22倍! 就在大家都感慨深圳顶豪的购买力惊人时,事情却迎来了更大的反转! 该豪宅竟重现法拍市场…

【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划

【HarmonyOS】鸿蒙应用实现调用系统地图导航或路径规划 前言 在涉及地图业务中,调用地图导航和路径规划是三方应用中较为常见的功能。 若只是子业务需要地图导航效果,整个APP内部集成地图去实现导航或者路径规划,会造成SDK集成冗余。毕竟很…

校园外卖服务系统设计与实现

TOC springboot292校园外卖服务系统设计与实现 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性&…

若依 Ruoyi4.7.9 创建页面并显示

自行从https://gitee.com/y_project/RuoYi下载源代码,这个不再赘述。 // 下载后会发现现在的Ruoyi环境,分成了6个模块: 模块主要的介绍大家可以看文档。 官网地址:https://doc.ruoyi.vip/ruoyi/ 我下载的这个是基于mvc框架&…

CTFHUB-技能树-Web题-RCE(远程代码执行)-远程包含-命令注入-过滤空格

CTFHUB-技能树-Web题-RCE&#xff08;远程代码执行&#xff09;-远程包含-命令注入-过滤空格 就是过滤掉了空格 找能代替空格的代替就行了 使用IFS$9、%09、<、>、<>、{,}、%20、${IFS}、${IFS}来代替空格 127.0.0.1;cat${IFS}xxxx.php先来查看一下目录 127.0.0…

python可视化数据练习(地形图)

一、数据展示&#xff08;可通过目录直接跳转到代码部分&#xff09; {"lastUpdateTime":"2021-08-18 10:53:30","chinaTotal":{"confirm":122482,"heal":112984,"dead":5669,"nowConfirm":3829,"…

基于Spring boot的名城小区物业管理系统

TOC springboot240基于Spring boot的名城小区物业管理系统 绪论 1.1研究背景与意义 1.1.1研究背景 近年来&#xff0c;第三产业发展非常迅速&#xff0c;诸如计算机服务、旅游、娱乐、体育等服务行业&#xff0c;对整个社会的经济建设起到了极大地促进作用&#xff0c;这一…

Xilinx(AMD)的怪异行为——ila的radix没有real格式

使用vivado 2021.1的过程中发现&#xff0c;仿真时&#xff0c;可以选择把数据的radix按照定点或浮点格式显示&#xff1a; 显示效果如下&#xff1a; 仿真完后&#xff0c;在ila中观察&#xff0c;发现定点和浮点显示的菜单少了几项&#xff1a; xilinx为什么会把这么有用的…

剑指offer--面试题58.翻转字符串

题目描述 输入一个英文句子&#xff0c;翻转句子中单词的顺序&#xff0c;但单词内字符的顺序不变。为简单起见&#xff0c;标点符号和普通字母一样处理。例如输入字符串”I am a student.“,则输出”student. a am I“。 算法分析 完整代码 #include <string.h> //把起…

html+css+js网页设计 作业歌帝梵官网首页1个页面6个js效果

htmlcssjs网页设计 作业歌帝梵官网首页1个页面6个js效果 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获…

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板&#xff0c;采用MT6762八核平台方案&#xff0c;支持谷歌Android 11.0系统&#xff0c;MT6762采用ARM八核A53内核芯片、主频高达2.0GHz&#xff0c;GPU采用ARM PowerVR GE8329650MHZ&#xff0c;支持主流19201080分辨率&#xff0c;支持硬解H.264&#xff0c…