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

2023-10-27

目录

一. 整体介绍

二.  准备工作

三. 建立流水线

  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等参数调整到适合状态

    

 

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

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

UnityVR--机械臂场景9-简单流水线应用1 的相关文章

随机推荐

  • Python爬虫笔记——post请求、cookies及session

    一 post请求 post和get都可以带着参数请求 不过get请求的参数会在url上显示出来 但post请求的参数就不会直接显示 而是隐藏起来 像账号密码这种私密的信息 就应该用post的请求 如果用get请求的话 账号密码全部会显示在网
  • Python中的小工具和setWidget等相关概念解析

    Python中的小工具和setWidget等相关概念解析 在Python编程中 无论是桌面应用程序还是Web应用程序 我们都需要用到各种小工具来构建UI界面 其中 Qt是一种流行的GUI框架 提供了很多用于创建UI界面的小部件 widget
  • 每日一题 102二叉树的层序遍历

    题目 给你二叉树的根节点 root 返回其节点值的 层序遍历 即逐层地 从左到右访问所有节点 示例 1 输入 root 3 9 20 null null 15 7 输出 3 9 20 15 7 示例 2 输入 root 1 输出 1 示例
  • 4.3 C++成员模板参数、显示实例化、特化

    C 成员模板参数 关键字 typename 内嵌是指定义在类的定义中的 依赖是指依赖于一个模板参数O typedef类型名是指这里最终要指出的是个类型名 using给模板起别名 显示实例化和隐式实例化 模板的全特化与偏特化 因为编译器认为
  • python-parser.parse_args()解析参数

    import argparse 设置参数对象 简要设置为该程序要执行什么任务 parser argparse ArgumentParser mission name 调用 add argument 方法添加参数 parser add arg
  • 自举电路可以增加输入阻抗,你知道吗?

    原文来自微信公众号 工程师看海 以前写过一篇文章 介绍自举电路在BUCK电源的应用 驱动高边MOS https www dianyuan com eestar article 2127 html 反馈不错 今天再来介绍下自举电路增加输入阻抗
  • nodejs 下使用js封装console.log方法输出自定义的彩色字体,遇到Octal escape sequences are not allowed in template strings

    阳光明媚 在家敲javascript的代码 控制台里清一色的黑底白字 我console log出来的文字也是黑底白字淹没在茫茫字母海中 所以我想封装一下log方法 能自己定义字体还有背景的颜色 然后就出现了这个报错 Octal escape
  • OpenCV 图像旋转

    1 RotateArbitrarilyAngle Mat src Mat dst float angle 2 3 float radian float angle 180 0 CV PI 4 5 填充图像 6 int maxBorder i
  • SQL 题目(一)

    url http www cnblogs com finejob articles 974900 html 其他题目 url 为管理岗位业务培训信息 建立3个表 S S SN SD SA S SN SD SA 分别代表学号 学员姓名 所属单
  • 【轩说AI】无监督特征学习——主成分分析、稀疏编码、自编码器

    文章目录 无监督学习 无监督特征学习 主成分分析 稀疏编码 自编码器 主成分分析PCA 理解什么是PCA 有什么用处 稀疏编码 编码 交替优化 自编码器 Auto Encoder 稀疏自编码器 无监督学习 无监督特征学习 主成分分析 稀疏编
  • FortiGate下用户访问特定网址不通

    1 现状 如图 上网行为管理和防火墙控制用户的数据访问 到外网的出口链路有2条 联通的和电信的 其中联通的优先级较高 2 现象 用户访问www xxxxbbs com不通 3 分析 在上网行为管理上做源和目前地址排除 发现仍不能访问排除了上
  • ERP为什么在生产制造环节应用效果不理想?

    ERP在生产制造环节应用效果不理想的根本原因是ERP负责的是宏观管控 而生产制造环节应该使用MES来进行精细化管理 下面就详细讨论下 生产制造环节发生在工厂 工厂可以没有ERP 但如果要用系统 必定是MES系统 ERP是为企业服务的 MES
  • 学习汇编语言MASM笔记1

    关于源程序书写格式 太基础的略去 只记录一些我还不熟悉的内容 参考https wenku baidu com view 7ca70e0ef342336c1eb91a37f111f18582d00c5d html 其他网页的参考以挂上相关连接
  • Flutter 踩坑TabBar之TabController.addListener

    一 问题 之前提到TabBar的第二种实现方式 TabController是有坑的 问题 这个监听在点击切换tab的时候会回调两次 左右滑动切换tab正常调用一次 二 原因 点击切换tab的时候执行了一个动画效果 滑动切换的时候是没有的 在
  • 用JAVA写的一个自动化简单示例!

    public class lianxi public static void main String args throws InterruptedException System getProperty webDriver firefox
  • 2022-03-24 RK3566 MIPI屏 调试记录,panel-init-sequence 命令格式介绍

    一 Single channel mipi屏的硬件连接如下 二 根据屏厂给的初始化代码配置dts了 屏厂给的初始化代码分几种形式 这个文章里面RK PX30 android8 1的mipi屏调试 要不要买菜 的博客 CSDN博客 有比较详细
  • Ubuntu20.04(linux)离线安装nacos

    一 解压 1 首先local目录得有nacos server 2 0 4 tar gz包 切换目录cd usr local执行以下命令 tar zxvf nacos server 2 0 4 tar gz 二 创建nacos service
  • postgresql安装及常见错误处理

    postgresql安装及常见错误处理 一 安装说明 最近 由于业务需要 我抛弃了一直使用的mysql数据库 开始转向postgresql数据库 至于为什么选择postgresql 肯定是postgresql比mysql更强大 对于post
  • DECORATOR 装饰模式

    DECORATOR 装饰模式 对象结构性模式 1 意图 动态地给一个对象增加一些额外的职责 就增加功能来说 Decorator模式相比生成子类更为灵活 2 别名 包装器Wrapper 3 动机 有时我们希望给某对象而不是整个类添加一些功能
  • UnityVR--机械臂场景9-简单流水线应用1

    目录 一 整体介绍 二 准备工作 三 建立流水线 1 流水线包含的功能 2 流水线的代码结构 3 场景实现 4 测试运行 一 整体介绍 流水线是在空间和时间上合理安排和组织工艺线路的一种形式 它涉及到一种或多种生产设备 传感器 物料传输设备