文章目录
前言
利用Unity中的Ml-agent的模块实现两个模块的自动装配。主要包括前期环境的配置、状态、动作和奖励的编程,以及最后利用强化学习实现两个模块的自动装配。
提示:以下是本篇文章正文内容,下面案例可供参考
一、前期准备
1.Unity的Ml-agent模块
Unity的ML-Agent-Toolkit是一个工具,它通过游戏和模拟的方式构建一个可供智能体训练的环境,然后通过简单易用的Python API调用强化学习、模拟学习、神经进化(Neuroevolution)或者其他机器学习的方式对智能体进行训练。
ML-Agent-Toolkit工具是独立于Unity的,下载Unity后需要单独下载ML-Agent工具进行下载。同时需要注意的是不同的Unity版本与不同的ML-Agent工具的版本的适配性。本文采用的是Unity,2019.1.2f1的版本和ML-Agent。
具体的Unity中ML-Agent的安装和使用请参考ML-Agent的使用。
2.3D的建模和导入
通过在Solidworks建立3D模型,然后将3D模块转成 FBX文件,方便后期导入进Unity。具体的3D模型如图
二、环境的配置
1.引入ML-Agent库与工具包
ML-Agent库导入代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MLAgents;
官网下载的工具包放入asset下
2.Unity中装配的定义
测量平面与平面之间的角度计算
具体思路为:获取想要测量平面的法向量,通过法向量计算角度。平面法向量可以通过Unity中的内置函数Ray实现测量。实现方法如下:
在想要测量的平面外建立一个空物体,然后在空物体下添加代码测量平面的法向量:
通过Ray计算所需平面的法向量,其代码如下:
Vector3 PlaneNormal;
Vector3 Direction = target - empty;//target是物体,present是empty
Ray ray = new Ray(empty, Direction);
RaycastHit Hit;
if (Physics.Raycast(ray, out Hit))
{
// print("法线" + hit.normal);
}
PlaneNormal = Hit.normal;
//print("Hit.normal" + Hit.normal);
return PlaneNormal;//通过函数获得
获取两个平面的法向量后可以通过反三角函数计算两个平面的角度,在Unity中代码如下:
float VectorRadian = Vector3.Dot(plane1.normalized, plane2.normalized);
float VectorAngle = Mathf.Acos(VectorRadian) * Mathf.Rad2Deg;
其中plane1是第一个平面的法向量,plane2是第二个平面的法向量。
测量平面与平面之间的距离计算
具体的思路是在两个平面之间设置一个空物体,通过Ray函数分别计算到达平面1的距离和到达平面2的距离,然后相加即为两个平面的距离,具体的代码如下:
Vector3 Distance;
#第一个距离
Vector3 Direction1 = plane1 - empty;//plaen1是物体,present是empty
Ray ray = new Ray(empty, Direction1);
RaycastHit Hit;
if (Physics.Raycast(ray