로봇/ROS

URDF를 이용해 만든 로봇에 Unity 자동차 연결하기 (2)

with-RL 2023. 8. 15. 17:20

이번 포스팅은 URDF를 이용해 만든 로봇에 Unity 자동차 연결하기 (1) 과정을 통해서 만들어진 로봇을 Unity 로봇을 C# 코드를 이용해서 직접 운전해 보는 기능을 만들어 보는 과정입니다.

 

이 포스트는 다음 과정을 완료한 후에 참고하시길 바랍니다.

1. Camera Controller Script 추가하기

  • 이전 과정을 통해서 만들어진 자동차는 10m x 10m의 땅을 이동하는 자동차입니다. 고정된 카메라로는 자동차의 이동을 확인하기 어려우므로 카메라가 자동차를 따라다니도록 하는 기능을 만드는 과정입니다.
  • Project 탭에서 'Assets' 폴더 아래 'Scripts >> 2WD Car' 폴더를 만듭니다.
  • '2WD Car' 폴더를 선택하고 마우스 메뉴버튼을 누른 후 메뉴에서 'Create >> C# Script'를 선택합니다.

  • Script 이름을 'CameraController'로 지정 후 Script를 선택하고 마우스 메뉴 버튼을 누른 후 메뉴에서 'Open C# Project'를 선택합니다.

  • 실행되는 Visual Studio에서 CameraController.cs의 내용을 아래와 같이 수정하고 저장합니다.
using UnityEngine;

public class CameraController : MonoBehaviour
{

    [SerializeField] private Vector3 offset;
    [SerializeField] private Transform target;
    [SerializeField] private float translateSpeed;
    [SerializeField] private float rotationSpeed;

    private void FixedUpdate()
    {
        HandleTranslation();
        HandleRotation();
    }

    private void HandleTranslation()
    {
        var targetPosition = target.TransformPoint(offset);
        transform.position = Vector3.Lerp(transform.position, targetPosition, translateSpeed * Time.deltaTime);
    }

    private void HandleRotation()
    {
        var direction = target.position - transform.position;
        var rotation = Quaternion.LookRotation(direction, Vector3.up);
        transform.rotation = Quaternion.Lerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime);
    }

}

  • 'Main Camera' Object를 선택 후 'Camera Controlller' Script를 추가합니다.

  • 'Main Camera' Object의 'Camera Controlller' 정보를 아래와 같이 설정합니다.
    Offset: (0, 0.2, -1)
    Target: Car Object
    Translate Speed: 2
    Rotation Speed: 2

  • Play 번튼을 눌러보면 아래와 같이 카메라가 자연스럽게 이동하는 것을 확인할 수 있습니다.

2. Car Controller Script 추가하기

  • 화살표 키보드를 이용해 자동차를 운전하는 Script를 추가하는 과정입니다.
  • '2WD Car' 폴더를 선택하고 마우스 메뉴버튼을 누른 후 메뉴에서 'Create >> C# Script'를 선택 후 이름을 CarController로 변경합니다.
  • Visual Studio에서 CarController.cs의 내용을 아래와 같이 수정하고 저장합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarController : MonoBehaviour
{

    private const string HORIZONTAL = "Horizontal";
    private const string VERTICAL = "Vertical";

    private float horizontalInput;
    private float verticalInput;

    [SerializeField] private float motorForce;
    [SerializeField] private float horizontalRate;

    [SerializeField] private WheelCollider leftWheelCollider;
    [SerializeField] private WheelCollider rightWheelCollider;

    private void FixedUpdate()
    {
        GetInput();
        HandleMotor();
    }

    private void GetInput()
    {
        horizontalInput = Input.GetAxis(HORIZONTAL);
        verticalInput = Input.GetAxis(VERTICAL);
    }

    private void HandleMotor()
    {
        leftWheelCollider.motorTorque = (verticalInput + horizontalInput * horizontalRate) * motorForce;
        rightWheelCollider.motorTorque = (verticalInput - horizontalInput * horizontalRate) * motorForce;
    }

}

  • 우선 Play를 중지합니다.
  • Car Object를 선택하고 'Car Controller' Component를 추가합니다.
  • Car Component에 아래 내용을 설정합니다.
    Mortor Force: 0.01
    Horizontal Rage: 0.5
    Left Weel Collider: LeftWheel Object
    Right Wheel Collider: RightWheel Object

  • Play 버튼을 누르고 키보드의 화살표 키를 이용해서 자동차를 조정해 봅니다. 키보드 입력에 따라서 자동차가 이동하는 것을 확인할 수 있습니다.