UnityVR--机械臂场景10-简单流水线应用2

news2024/7/6 17:35:01

目录

一. 前言

二. 事件中心修改

三. 机械臂加入DoTween的运动

四. 机械臂关节的控制


一. 前言

  上一篇已经完成了流水线的搭建,本篇要完成的是:1. 事件中心的修改;2. 机械臂的DoTween运动改造;

  本篇是在事件中心2和机械臂场景的基础上建立的,需要先了解与之相关的基本知识,了解机械臂和机械爪的控制以及机械臂逆向解的控制等,本篇会在这些基础上修改代码。

二. 事件中心修改

  1. EventType.cs

  在EventType的枚举中增加传送带、机械臂和手爪的事件类型:

using UnityEngine;

public enum EventType 
{
    //其他事件类型先省略了
    //…………
    OnConveyerCtrl,
    OnArmCtrl,
    OnClawCtrl
}

  2. EventDataBase.cs

  在EventDataBase中增加机械臂和手爪控制时需要传输的数据:(篇幅有限,仅展示本篇需要的类)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//管理委托要传入的参数
public class EventDataBase
{//父类
    
}

public class EventDataConveyer:EventDataBase
{//传送带需要传入移动或停止状态
    public EConveyerType conveyerType;  
}

public class EventDataArm:EventDataBase
{
    public EArmMoveType armType;  //机械臂的运动类型
    public Transform target;      //机械臂抓取目标,由传感器传入
    public EClawType clawType;    //如果需要的话,发送手爪状态命令
    public float waitTime;        //发送手爪命令时,同时发送让手爪等待的时间

}

public class EventDataClaw:EventDataBase
{
    public EClawType clawType;   //发送手爪命令
    public Transform target;     //手爪的目标,一般不太需要用到
    public float waitTime;       
}

public enum EConveyerType
{
    Move,Stop
}
public enum EArmMoveType
{
    Get,Up,Put,Home    //机械臂的状态:取东西,抬起,放东西,回零
}
public enum EClawType
{
    Open,Close
}

  有了这些事件类型和数据的定义,接下来可以使用事件发送来控制机械臂和手爪的运动。

三. 机械臂加入DoTween的运动

  之前的机械臂运动都是硬切,最多加了个插值运算,但是运行得也是颤颤巍巍的,这里加一个DoTween插件,扩展Transform的Rotate方法,使用DoTween曲线运动得丝滑一些:

  使用DoTween中四元素旋转API来实现绕不同坐标轴的旋转

public static TweenerCore<Quaternion, Quaternion, NoOptions> DOLocalRotateQuaternion(this Transform target, Quaternion endValue, float duration);

  Transform扩展代码如下:

using UnityEngine;
using DG.Tweening;//别忘记调用DoTween
using System;

public static class TransformExt
{
    public static void RotateX(this Transform transform, float x, float time, Action action)
    {
        transform.DOLocalRotateQuaternion(Quaternion.AngleAxis(x, Vector3.right), time).OnComplete(() => action());
    }
    public static void RotateY(this Transform transform, float y, float duration, Action action)
    {
        transform.DOLocalRotateQuaternion(Quaternion.AngleAxis(y, Vector3.up), time).OnComplete(() => action());
    }
    public static void RotateZ(this Transform transform, float z, float duration, Action action)
    {
        transform.DOLocalRotateQuaternion(Quaternion.AngleAxis(z, Vector3.forward), time).OnComplete(() => action());
    }
}

四. 机械臂关节的控制

  1. 先放关节旋转的代码:(这里参考了机械臂控制(二)的文章)

using UnityEngine;
//机械臂单个关节点的旋转控制
//把它挂在每一个旋转关节的节点上,并选择关节的旋转轴和时间

public enum RotateAxis
{//旋转轴
    x,y,z
}
public class Robot_JointCtrl : MonoBehaviour
{
    public RotateAxis axis;
    public float rotateTime=1;
    float currentAngle;  //记录角度

    public void SetAngle(float angle, Action action)
    {//该轴的旋转角度:angle(角度),action(回调)
        if (currentAngle == angle)
        {
            action();
        }
        else
        {
            switch (axis)
            {//执行Transform的拓展方法
                case RotateAxis.x: transform.RotateX(angle, rotateTime, action); break;
                case RotateAxis.y: transform.RotateY(angle, rotateTime, action); break;
                case RotateAxis.z: transform.RotateZ(angle, rotateTime, action); break;
            }
            currentAngle= angle;
        }
    }
}

  将这个脚本挂在每一个需要控制旋转的机械臂关节上,并旋转旋转轴和旋转时间:

   2. 测试一下试试(不需要测试的话,2、3步可以跳过)

  机械臂的控制代码Test.cs,将挂了Robot_JointCtrl脚本的关节都遍历执行一遍:

public class Test : MonoBehaviour
{
    public Robot_JointCtrl[] joints;
    //旋转的数据
    float[] home = { 0, 0, 0, 0, 0};     //回零动作
    float[] get = { -42.7, 9.12, -115, 90,0 }; //抓取动作
    float[] put = { 50, 40, -118, -90, 0 };  // 放置动作

    public void MoveJoints(float[] angle, int i)
    {//遍历所有活动关节
        joints[i].SetAngle(angle[i], () =>
        {
            Debug.Log(i + "关节已经完成移动");
            if (i == joints.Length-1)
            {
                Debug.Log("所有关节完成旋转");
                return ;
            }
            i++;
            MoveJoints(angle, i);
        });
    }

    void Update()
    {//测试MoveJoints方法
        if (Input.GetKeyDown(KeyCode.A))
        {
             MoveJoints(get,0);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            MoveJoints(put,0);
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            MoveJoints(home,0);
        }
    }
}

  3. 把上面的测试脚本挂在机械臂的根节点上,并且将对应的旋转关节放进数组即可。旋转结果就不放了。

 关于机械臂的事件发送和IK自动运行将放在下一篇分段写,不然代码的篇幅太长了。

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

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

相关文章

macOS Ventura 13.5beta5(22G5072a)发布

系统介绍 黑果魏叔 7 月 11 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 5 更新&#xff08;内部版本号&#xff1a;22G5072a&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、Fa…

Python自动化办公:提升效率,释放潜力(借助AI实现)

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

解密混沌工程——混沌工程实践

随着近两年的数字化转型需求激增&#xff0c;混沌工程这门新兴学科在证券业、银行业备受青睐。尽管混沌工程诞生至今已经有十余年&#xff0c;但对大部分公司的研发团队而言&#xff0c;它仍是一个比较陌生的领域。 混沌工程该如何实施&#xff1f; 上一期我们说到&#xff0c…

Spring Event事件用法 Spring Boot Event事件发布和订阅 Spring Event事件发布 Spring Event事件订阅

Spring Event事件用法 Spring Boot Event事件发布和监听 Spring Event事件发布 Spring Event事件订阅 一、概述 在Spring中可以使用 Spring Event 事件机制&#xff0c;实现功能解耦合。 本文 主要讲解 Spring Event的用法 &#xff0c;至于那些 介绍啊&#xff0c;观察者模式&…

开悟AIArena,深度学习神经网络,暑假开悟比赛的学习

目录 1.赛题简介 1.1.赛题目标 1.2.地图介绍 1.3.规则介绍 2.环境介绍 2.1.观测空间&#xff08;Observation Space&#xff09; 2.1.1.原始数据&#xff1a; 2.1.2.特征数据 2.1.3.特征提取 2.2.动作空间&#xff08;Action Space&#xff09; 2.3.坐标介绍&#xf…

1.MySQL - WindTerm Linux 使用

目录 一、云服务器的使用 二、Linux 和 发行版 三、云服务器的基本操作 四、WindTerm&#xff08;一款 SSH 客户端&#xff09; 4.1 设置 WindTerm 外观 4.2 打开文件管理器 4.3 连接云服务器 4.4 参数 4.5 常见命令 4.5.1 清理屏幕&#xff08;滚屏&#xff09; …

【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

TCP 协议(一)报文结构

TCP 协议&#xff08;一&#xff09;报文结构 TCP 协议&#xff08;二&#xff09;连接与断开 TCP 协议&#xff08;三&#xff09;十种核心机制 TCP 提供面向连接的通信传输&#xff0c;面向连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论…

从零开始——springboot增删改查小demo

首先&#xff0c;先创建数据库 -----sushe,然后创建表 person&#xff0c;表结构是这样的&#xff0c;一共四个字段。 向里面添加一些寝室成员数据即可。 INSERT INTO person(p_id,p_name,p_phone,p_score)VALUES (1,李阳,123456,7890), (2,张骞,123456,7890), (3,马康敬,1234…

【C语言】指针概要

文章目录 一、什么是指针二、指针类型三、野指针四、二级指针五、字符指针六、数组指针定义数组名 七、函数指针 一、什么是指针 指针就是地址&#xff0c;口语中说的指针通常指的是指针变量。我们可以通过&&#xff08;取地址操作符&#xff09;取出变量的内存起始地址&a…

Nginx转发域名与新增SSL证书校验

1.申请SSL证书 各大资源&#xff1a;SSL免费证书资源 2.我选择的是站点服务 申请成功的界面&#xff1a; 官网安装教程&#xff1a;看看就好系列 3.下载成功后把文件当道nginx中的目录下 4.编写nginx.config配置 增加server配置 通过监听zlXXX.cc域名访问 重定向到https…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

X86架构上的Linux操作系统安装与配置ARM架构(并进行示例测试/为DDS编译打基础)

1 查看Linux操作系统是运行在X86架构还是ARM架构平台上2 X86和ARM到底是什么关系&#xff1f;3 X86、ARM、Linux三者的关系到底是什么&#xff1f;&#xff08;大白话理解&#xff09;4、在X86架构的Linux操作系统上搭建ARM架构并进行测试&#xff08;看elf文件的类型是否属于a…

Spark---第 1 章 Spark 内核概述

Spark 内核泛指 Spark 的核心运行机制&#xff0c;包括 Spark 核心组件的运行机制、Spark 任务调度机制、Spark 内存管理机制、Spark 核心功能的运行原理等&#xff0c;熟练掌握 Spark 内核原理&#xff0c;能够帮助我们更好地完成 Spark 代码设计&#xff0c;并能够帮助我们准…

HTML5+CSS3小实例:带进度条的人物卡片切换效果

实例:带进度条的人物卡片切换效果 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conte…

XHcms 1.0代码审计

关于熊海CMS1.0的代码审计&#xff0c;一直想要提升自己的代码审计的能力&#xff0c;php没有继续去深入的学习这门语言&#xff0c;反而直接是审计CMS&#xff0c;就拿着熊海CMS来进行审计。 关于熊海cms的源码&#xff0c;附在下方&#xff1a; 链接&#xff1a;https://pan…

How to Write and Publish a Scientific Paper-Preparing the Tables and Figures

Preparing the Tables and Figures 目录 Preparing the Tables and FiguresWHEN TO USE TABLESHOW TO ARRANGE TABULAR MATERIALEXPONENTS IN TABLE HEADINGSFOLLOWING THE JOURNAL’S INSTRUCTIONSTITLES, FOOTNOTES, AND ABBREVIATIONSADDITIONAL TIPS ON TABLES WHEN TO USE…

algo算法实验平台代码分享

algo算法实验平台代码分享 1. 介绍 本实验平台包括前端及后台两个模块&#xff0c;前端由 vue开发而来&#xff0c;后端主要采用 python编写&#xff0c;主要用于算法效果测试测评及改进。 原平台算法已做脱敏&#xff0c;使用者可以根据自己需求进行改写或开发&#xff0c;此…

Echarts使用,大数据量时,折线图曲线Y轴取值刻度不正确

如下图&#xff0c;当数据量过大时&#xff0c;会出现数值对应Y轴刻度显示不正确问题。 ​​​​​​​ 可检查配置项是否存在sampling字段 option {series: [{data: [...],type: line,smooth: true,symbolSize: 0,sampling: "average", // 注意此行}] }; samplin…

android 中颜色的基础知识

一.简单介绍Android中的颜色 安卓支持的颜色模式&#xff1a; PS&#xff1a;其中字母表示通道类型&#xff0c;数值表示该类型用多少位二进制来描述。如ARGB8888则表示有四个通道(ARGB),每个对应的通道均用8位来描述。 注意&#xff1a;我们常用的是ARGB8888和ARGB4444&am…