C#使用SharGL实现PUMA560机械臂

11 篇文章 2 订阅

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

模型示意图

实物示意图

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Big_潘大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值