UnityVR--机械臂场景9-简单流水线应用1

news2024/10/7 8:20:34

目录

一. 整体介绍

二.  准备工作

三. 建立流水线

  1. 流水线包含的功能:

  2. 流水线的代码结构

  3. 场景实现

   4. 测试运行


一. 整体介绍

  流水线是在空间和时间上合理安排和组织工艺线路的一种形式,它涉及到一种或多种生产设备、传感器、物料传输设备等,并且有明显的生产节拍,是一个比较复杂的生产系统。当然,流水线的设计不是本篇的研究对象,这里记录一个机械臂和传送带配合运送工件的简单示例。

传送带IK演示

  这里只涉及到传送带、传感器、机械臂和工件相互间的通信,也就是通过传送带搬运工件,当传感器检测到工件的到来时,就通知传送带停止、机械臂去抓取工件,当机械臂将工件抓出传感器检测范围后,传送带继续搬运、机械臂回零。

二.  准备工作

  1. 考虑到在以上四个要素之间有不少信息需要通信传输,所以计划使用事件发送来实现,不然需要设立很多个判断,影响程序的可读性。关于事件中心的建立,请详见事件中心2(实在是不愿意看的同学只要复制粘贴这里面的4个类,放在工程文件中就可以使用了)。

  2. 关节旋转中需要用到DoTween插件,可以去AssetStore下载,免费的那个就行。不用也可以,只是为了好看。

   3. 本篇在上一篇ABB机械臂的逆向解算的基础上,请先将上一篇的代码测试成功。

下面正式开始:

三. 建立流水线

  1. 流水线包含的功能:

  流水线包含了2个方面的功能:

    A. 动画功能:使用材质(renderer.material)流动实现流水线向前运行的效果

    B. 物理功能:使用刚体(Rigidbody)实现让工件物理移动的效果。

  2. 流水线的代码结构

    2.1 机械基类MechanicBase.cs:

    由于考虑到工程场景中涉及到的机械部件较多,因此先建立一个机械基类,将机械部件需要的变量、方法等提炼出来,下面是本篇建立的机械基类。由于不同的机械单元驱动方式不同,因此将基类定义为抽象类,以便于在子类中重写它的抽象方法:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
//机械基类
[Serializable] 
public struct MechanicCell
{
    public MechanicBase unit;      //一个机械单元
    public float ratio;            //比率,控制这个单元的速度

    public MechanicCell(MechanicBase cell, float ratio)
    {
        unit = cell;
        this.ratio = ratio;
    }
}

public abstract class MechanicBase : MonoBehaviour
{//在基类中定义一个驱动引擎的方法
    public abstract void EngineDriver(float velocity);  
}

public enum Direction  //枚举,机械单元运动的方向
{
    forward, back, right, left
}

    2.2 定义一个引擎脚本BeltEngine.cs:

    BeltEngine.cs用于驱动本系统内所有的机械单元。我的设想参照了MGS-MechanicalDrive插件包,一个Engine的作用域仅限于当前的机械系统,类似于一个电机。比如一个Engine.cs实例,在传送带的系统中用于驱动皮带轮和同步带:

    

    代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//使用engine驱动所有部件

public class BeltEngine : MechanicBase
{//定义机械系统,将所有活动部件放入数组中
    public MechanicCell[] cells;
    public float enginePower = 50;  //动力系数

  void Start()
  {//注册一个停止事件,当收到停止命令时,将enginePower设置为0
        
    EventManager.Instance.AddEvent(EventType.OnConveyerCtrl, this, data=> {
    if ((data as EventDataConveyer).conveyerType == EConveyerType.Stop) enginePower = 0;
            else enginePower = 50;    });
  }

void FixedUpdate()
{
    EngineDriver(enginePower);
}

public override void EngineDriver(float velocity)
{//一旦方法被调用,就将本机械系统中的所有单元都驱动一遍
    foreach(var cell in cells)
    {
      cell.unit.EngineDriver(velocity * cell.ratio); 
    }
}
}

    2.3 传送带脚本BeltMove.cs

    传送带的实现需要用到传送带上的材质(Renderer)和刚体(Rigidbody),代码还是比较简单的:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Renderer))]  //绑定Renderer组件
[RequireComponent(typeof(Rigidbody))] //绑定Renderer组件

public class BeltMove : MechanicBase
{
    protected Renderer renderer; //定义材质
    private Rigidbody rig;       //定义刚体

    private float loadRate = 0.2f;   //负载的速率系数
    private float renderDir=1;       //传送带运动方向的系数

    void Start()
    {
        renderer = GetComponent<Renderer>(); //获取材质组件
        rig = GetComponent<Rigidbody>();     //获取刚体组件
    }

    public override void EngineDriver(float velocity)
    {//重写基类的EngineDriver方法
        x = velocity * Mathf.Deg2Rad * Time.fixedDeltaTime;
        y = 0;
        //实现传送带的材质流动,如果方向反了,可以将系数renderDir改为-1
        renderer.material.mainTextureOffset += new Vector2(y, x) *renderDir;
 
        //实现刚体之间的相对运动,如果方向不对,可修改Vector3.back
        Vector3 ori_pos = rig.position;  //传送带实际位置不改变      
        rig.position += Vector3.back* velocity*loadRate* Time.fixedDeltaTime;
        rig.MovePosition(ori_pos);
    }
}

  3. 场景实现

    3.1 没有找到合适的流水线模型,建立了两个Cube并拉长成合适的大小,随便贴个材质:

    

    3.2 给两条传送带分别挂上Collider和Rigidbody,由于本来就是Cube改造的,自带有BoxCollider,最重要的是将Rigidbody的IsKinematic打勾。

    原理是利用刚体运动"Rigidbody.MovePosition(position)",并且利用物理系统模拟的摩擦力实现两个刚体间的相对运动。但只需要工件移动,传送带的物理位置不能改变,因此传送带需要勾选IsKinematic

    

     3.3 建立相应的节点

    以下是本篇的一个传送带系统,包含了3条传送带和1个驱动引擎,其中每一条传送带都需要挂上BeltMove.cs脚本,并且修改脚本中的运动方向(上文中的Vector3.back):

    

    另外,Engine是个空节点,需要挂上BeltEngine.cs,并且将需要驱动的机械部件填入列表中:

    

   4. 测试运行

     以上就完成了传送带部分的建立。加一个工件测试运行一下(别忘了给工件加上碰撞器和刚体),并将EnginPower、Ratio等参数调整到适合状态

    

 

(总之就是一个非常简单的应用案例,如果有错误请批评指正)

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

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

相关文章

企业微信群机器人开发

准备工作 已经注册了有效的企业微信账号&#xff0c;并且在客户端上已经登录现有或者新建有效的包含多名企业微信成员的群聊 创建群聊机器人 右键群聊->管理聊天信息->添加群机器人 使用群机器人 在终端某个群组添加机器人之后&#xff0c;创建者可以在机器人详情页…

【Unity天空盒的制作及使用】使用HDR图或六面图制作天空盒及天空盒的几种使用方式

前言【Unity天空盒的制作及使用】使用HDR图或六面图制作天空盒及天空盒的几种使用方式一 、制作天空盒材质1.1 使用HDR文件1.2 使用六张图片二、天空盒的使用方式2.1 场景中设置天空盒2.2 相机中设置天空盒总结前言 Unity工程中每次打开工程映入眼帘的蓝灰过渡的画面就是Unity默…

随笔 --- 是否可以用左右子树结点数差来衡量二叉树是否平衡?

这道题目来自mooc上浙江大学由陈越 、何钦铭老师主讲的数据结构课程上。 题目如下&#xff1a; 由于评论区关闭&#xff0c;在这里写下我自己的思路&#xff1a; 根据要求使用结点数来衡量是否是平衡时&#xff0c;极端条件是NR 2NL 或者反之。 如果构建二叉树时恰好构建为斜…

xxl-job使用详解(包含部分踩坑信息)

概念 XXL-JOB 是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 分布式下&#xff0c;每个服务都可以搭建为集群&#xff0c;这样的好处是可以将任务切片分给每一个服务从而实现并行执行&#xff0c;提高任务调度的处理效率。 在…

你真的会CSS?来看看这几个效果怎么做!

最近阿锋在超市排队买菜&#xff08;辣条&#xff09; 一个大叔一边给孩子买吃的一边说&#xff1a; 这些都是增加记忆力的&#xff0c;对孩子好&#xff01; 蓝莓&#xff0c;深海鱼&#xff0c;全麦面包&#xff0c;坚果儿&#xff0c;十六个核桃 不禁感叹现在的孩子们还真是…

6个美化代码片段转换截图图片在线工具推荐

有些截图的代码片段不是太美观&#xff0c;我们可以用统一的代码片段美化截图工具&#xff1a; 文章目录&#xff1a; 1、Codeimg 2.、Carbon 3、Ray.so 4、CodeKeep 5、Chalk.ist 6、Codepng Codeimg 支持设置设备系统&#xff0c;比如可选 MacOs、Windows系统样式。以及设置…

QT error: C2039: “jifen_lineEdit”: 不是“Ui::UIMainFrame”的成员

问题&#xff1a;新增控件不在ui_.h文件中 前提&#xff1a; 在ui界面新增了一个edit控件&#xff0c;在对应cpp中使用ui->jifen_lineEdit时就报错 error: C2039: “jifen_lineEdit”: 不是“Ui::UIMainFrame”的成员 或者error: no member named jifen_lineEdit in Ui::U…

java项目之二手手机回收平台系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的二手手机回收平台系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框…

论文怎么导入endnotes

我不怎么用pdf直接导入&#xff0c;感觉基本信息还要重新填比较麻烦&#xff0c;期刊基本都支持直接导入了&#xff0c; 1、知网&#xff1a; 随机选择一篇论文&#xff1a; 说实话搜索之前我以为没有结果的&#xff08;x 注意先点击前面的选中&#xff0c;然后点击导出分…

【七天入门数据库】第三天 MySQL的库表操作

系列文章传送门&#xff1a; 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 文章目录 一、SQL语句书写规范 二、数据库的操作 三、表的基本操作 四、表的约束 五、存储引擎 六、MySQ…

密码学入门——消息认证码

文章目录 参考书目一、简介二、消息认证码的使用步骤三、消息认证码的应用实例四、消息认证码的实现方法五、认证加密六、HMAC 参考书目 图解密码技术&#xff0c;第三版 一、简介 使用消息认证码可以确认自己收到的消息是否就是发送者的本意&#xff0c;也就是说&#xff0…

python实现压缩与解压(zlib)

本文将使用python的zlib与base64进行压缩与解压 其中base64模块用于对字节流与字符串的转换&#xff0c;zlib用于数据的压缩与解压 同时在后面附上在JS中遇到需要压缩解压的案例 解压代码&#xff1a; import base64 import zlibinput_string eJwlzT1OAzEQBeC7pJjSf1rHu0h…

yum方式安装mysql 8.0.33失败,缺少依赖包

配置网络源 [rootlocalhost yum.repos.d]# ping www.163.com PING z163picipv6.v.bsgslb.cn (61.184.215.68) 56(84) bytes of data. 64 bytes from 61.184.215.68 (61.184.215.68): icmp_seq1 ttl128 time13.2 ms 64 bytes from 61.184.215.68 (61.184.215.68): icmp_seq2 tt…

造船码头行车限位器与驾驶室控制柜无线通讯

随着我国海洋交通的快速发展&#xff0c;船舶信息化管理的建设&#xff0c;无线通信资源的配置&#xff0c;将先进的无线通信技术引入水上交通安全的监管业务中已是大势所趋。码头安装(设备和系统的安装) 船舶下水后常停靠于厂内舾装码头, 以安装船体设备, 机电设备&#xff0c…

第6集丨JavaScript 使用原型(prototype)实现继承——最佳实战3

目录 一、原型继承与属性拷贝1.1 功能说明1.2 功能测试 二、多重继承2.1 功能实现2.2 功能测试 三、寄生式继承四、构造器借用4.1 简单实现4.2 进化版4.2.1 功能实现4.2.2 案例测试 五、借用构造器和原型复制六 综合案例6.1 需求说明6.2 代码实现 一、原型继承与属性拷贝 1.1 功…

免费的音频转文字软件这么多,音频转文字软件推荐有哪些?

在一次音频转文字工作者的聚会上&#xff0c;艾米和迈克正在探讨如何提高他们的工作效率。他们都深知手动转录音频文件的困难和耗时&#xff0c;因此开始讨论是否有一种音频转文字软件可以推荐。 迈克&#xff1a;嘿&#xff0c;艾米&#xff01;我们都知道&#xff0c;音频转…

Scratch 星际飞船

Scratch 星际飞船 本程序主要增加了背景切换功能&#xff0c;飞船跟随鼠标移动&#xff0c;接触到右边的方块时切换到下一张背景&#xff0c;切换后飞船移动到左边&#xff0c;左边的椭圆则相反。随机生成另外两种飞船角色为背景&#xff0c;接触到边缘后移除。 图形化程序如下…

【算法与数据结构】150、LeetCode逆波兰表达式求值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;我们常看见的表达式是中缀表达式&#xff08;关于中缀表达式的定义可以参考前缀、中缀、后缀表达式&am…

0经验也能轻松设计商标logo的方法

如今&#xff0c;越来越多的人开始创业&#xff0c;而拥有一个好看的商标就显得尤为重要。但是&#xff0c;很多人并不具备设计技能&#xff0c;对于商标设计也是一头雾水。不过&#xff0c;现在有了一键logo设计应用&#xff0c;即使零经验的人也能轻松设计出自己满意的商标。…

IoT开发者为王,涂鸦智能硬核“靠边站”

文 | 智能相对论 作者 | 沈浪 6月底&#xff0c;全球化IoT开发平台服务商涂鸦智能开了个TUYA开发者大会&#xff0c;面向行业传达了两个关键的信息点&#xff1a; 1. 当前IoT领域的行业竞争不再局限于技术、渠道的单一纬度&#xff0c;开始演化为整体的生态之争。 2. 紧随行…