目的
UnityのMLAgentsを使って機会学習をしています。
ボールを投げるような学習をさせようと、環境を作っています。
困っている点
投げるためのボールと、コップの様な形をしたHandAgentを3Dオブジェクトで作りました。
Handの中にボールが入るようにしたいため、Rigidbodyのconvexをオフにしたところ、
Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported since Unity 5.
If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component. Scene hierarchy path "ThrowAwayHandAgent", Mesh asset path "" Mesh name "pb_Mesh6878"
というエラーが出たため、iskinematicをオンにしました。
しかし、iskinematicをオンにすると、物理演算の影響を無くすことになり、addForceなどを使ってHandを制御することが出来なくなります。
試したこと
addForceではなく、Transform.positionを操作することによりHandAgentsを移動させることは出来ましたが、目的であるボールを投げるためには、positionの操作では力が伝わらないため思い通りになりません。
質問
- convexをオフにした状態で、addForceを使う方法
- iskinematicをオンにした状態で、addForceを使用する方法
- Non-convex MeshCollider と non-kinematic Rigidbodyを両立させる方法 (旧バージョンにすればよいのでしょうか?)
- その他の解決方法
以上について、なにかアイディアがありましたら教えていただきたいです。
開発環境など
ボールは3Dオブジェクトから作成し、Sphere Colliderのコンポーネントがついています。
Handはprobuilderを使用して作成し、Mesh Colliderがついています。
ボールとHandAgentはどちらもRigidbodyがついており、Use Gravityはオンになっています。
開発環境 windows 10 Home
mlagentsのバージョン0.6.0
Unityのバージョン 2018.4.10.f1
ソースコード
関係あるかわかりませんが、一応ソースコードを載せておきます。
C#
1using System.Collections; 2using System.Collections.Generic; 3using MLAgents; 4using UnityEngine; 5 6public class TrowAwayHandAgent : Agent { 7 public Transform tBall; 8 public Rigidbody rBall; 9 int catchFlag; 10 11 Rigidbody rBody; 12 Transform tBody; 13 // Start is called before the first frame update 14 void Start () { 15 rBody = GetComponent<Rigidbody> (); 16 tBody = GetComponent<Transform> (); 17 catchFlag = 0; 18 } 19 20 public override void AgentReset () { 21 Debug.Log ("Reset"); 22 tBall.position=new Vector3 (-1.0f, 5.0f, 0); 23 rBall.position = new Vector3 (-1, 5, 0); 24 rBody.position = new Vector3 (-1, 1, 0); 25 tBody.transform.rotation = Quaternion.Euler(0.0f, 0.0f, 0.0f); 26 rBody.velocity = Vector3.zero; 27 rBall.velocity = Vector3.zero; 28 catchFlag = 0; 29 } 30 31 public override void CollectObservations () { 32 AddVectorObs (rBall.position); 33 AddVectorObs (rBody.position); 34 AddVectorObs (rBody.rotation); 35 } 36 37 public override void AgentAction (float[] vectorAction, string textAction) { 38 Vector3 RSignal = Vector3.zero; 39 Vector3 ForceSginal = Vector3.zero; 40 float distanceToBall = Vector3.Distance (tBall.position, rBody.position); 41 42 RSignal.x = vectorAction[0]; 43 RSignal.y = vectorAction[1]; 44 RSignal.z = vectorAction[2]; 45 46 ForceSginal.x = vectorAction[3]; 47 ForceSginal.y = vectorAction[4]; 48 ForceSginal.z = vectorAction[5]; 49 50 rBody.angularVelocity = RSignal * 0.1f * Mathf.PI; 51 if (catchFlag>4) { 52 // rBody.AddForce (ForceSginal*10, ForceMode.Impulse); 53 tBody.position=tBody.position+ForceSginal; 54 AddReward (2); 55 56 } else { 57 // rBody.AddForce (ForceSginal*10,ForceMode.Force); 58 tBody.position=tBody.position+ForceSginal; 59 AddReward (5-RSignal.magnitude); 60 if (distanceToBall < 0.1) { 61 Debug.Log ("catch"); 62 AddReward (100); 63 catchFlag++; 64 } 65 } 66 if (tBall.position.y < 1.1) { 67 AddReward (tBall.position.x * 1); 68 Debug.Log ("Fall Ball"); 69 Done (); 70 } 71 if (rBody.position.x > 0) { 72 AddReward (-100); 73 Debug.Log ("Hand out"); 74 Done (); 75 } 76 } 77}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/02 12:33