Search Unity

Resolved Hinge Joint Control in MLAgent

Discussion in 'ML-Agents' started by Uni-Jeon, May 9, 2022.

  1. Uni-Jeon

    Uni-Jeon

    Joined:
    Dec 27, 2021
    Posts:
    7
    Hello, I`m working on a rotary inverted pendulum system like this video:


    upload_2022-5-9_9-51-30.png
    So, I added a hinge component in connection part and agent script to control a targetVelocity

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using Unity.MLAgents;
    5. using Unity.MLAgents.Sensors;
    6. using Unity.MLAgents.Actuators;
    7. using Random = UnityEngine.Random;
    8.  
    9. public class RLAgent : Agent
    10. {
    11.     public GameObject targetPendulum;
    12.     public GameObject hinge_joint;
    13.     Rigidbody m_Rb;
    14.     HingeJoint hinge;
    15.     JointMotor motor;
    16.     JointLimits limits;
    17.    
    18.     public override void Initialize(){
    19.         hinge = hinge_joint.GetComponent<HingeJoint>();
    20.         motor = hinge.motor;
    21.         limits = hinge.limits;
    22.         limits.min = -60;
    23.         limits.max = 60;
    24.     }
    25.  
    26.     public override void OnEpisodeBegin(){
    27.         motor.force = 100;
    28.         motor.targetVelocity = 0;
    29.         motor.freeSpin = false;
    30.         hinge.motor = motor;
    31.     }
    32.  
    33.     public override void CollectObservations(VectorSensor sensor){
    34.         sensor.AddObservation(targetPendulum.transform.localPosition);
    35.         sensor.AddObservation(targetPendulum.transform.rotation);
    36.         sensor.AddObservation(motor.targetVelocity);
    37.         sensor.AddObservation(limits.min);
    38.         sensor.AddObservation(limits.max);
    39.     }
    40.  
    41.     public override void OnActionReceived(ActionBuffers actionBuffers){
    42.         var continuousActions = actionBuffers.ContinuousActions;
    43.         var velocityValue = Mathf.Clamp(continuousActions[0], -1f, 1f) * 30f;
    44.         motor.targetVelocity = velocityValue;
    45.  
    46.         AddReward(targetPendulum.transform.localPosition.y);
    47.     }
    48.  
    49.     void FixedUpdate(){
    50.         AddReward(-0.001f);
    51.     }
    52. }
    But, the hinge joint does not work.
    What am I missing? Thank you!
     

    Attached Files:

    Last edited: May 9, 2022