본문 바로가기

로봇/Airsim

AirSim에서 RL 하기 (3) - API 분석

AirSim에서 API를 모두 분석하고, 직접 사용하기 위해서 python 파일 생성 및 설명을 해 보았다.

모든 API 분석을 블로그에 기재를 한다면 내용이 너무 길어지니 제작한 부분만 업로드를 하고, 기존의 것은 Git에 저장을 하였다.


> hmue_drone.py : 드론을 이동시키는 코드

import airsim
import numpy as np

# AirSim 클라이언트 생성
client = airsim.MultirotorClient()

# 드론 연결
client.confirmConnection()

def get_drone_direction_vector():
    # 드론 상태 정보 가져오기
    state = client.getMultirotorState()

    # 드론 요(Yaw) 각도 가져오기
    yaw = airsim.to_eularian_angles(state.kinematics_estimated.orientation)[2]

    # 방향 벡터 계산
    x = np.cos(yaw)
    y = np.sin(yaw)
    z = 0.0  # Z 축 방향은 피치와 롤이 고정되어 있으므로 항상 0으로 가정

    direction_vector = np.array([x, y, z])

    return direction_vector

# 드론 방향 벡터 가져오기
direction_vector = get_drone_direction_vector()

# 출력
print("Drone Direction Vector: {}".format(direction_vector))

> hmue_angular_test.py : 드론의 각도를 테스트 하는 코드

import airsim
import os

# connect to the AirSim simulator
# MultirotorClient 객체를 생성하여 client 변수에 할당한다. 이 객체는 통신을 관리하고, 드론을 제어하는 기능을 제공한다.
client = airsim.MultirotorClient()

# client 객체를 이용해 AirSim 시뮬레이터와의 연결을 확인한다.
client.confirmConnection()

# 드론의 API 제어를 활성화한다. 이로 인해 코드를 통해 드론을 제어할 수 있다.
client.enableApiControl(True)

#드론의 시동을 건다.
client.armDisarm(True)

# Async methods returns Future. Call join() to wait for task to complete.
#드론을 이륙한다. join 메서드를 사용하면 작업이 완료될 때 까지 기다린다.
client.takeoffAsync().join()
#어느 포지션으로 이동시키는 것을 의미한다.
client.moveToPositionAsync(-30, 10, -10, 5).join()

> hmue_lidar_info.py : lidar의 정보를 받아와서 RL 환경에서 사용할 수 있도록 처리를 하는 코드

import airsim
import numpy as np
import matplotlib.pyplot as pltdef 

def lidar_to_image():
    # AirSim에 연결
    client = airsim.MultirotorClient()
    client.confirmConnection()

    # LIDAR 데이터 수집
    lidar_data = client.getLidarData()
    
    points = np.array(lidar_data.point_cloud, dtype=np.dtype('f4'))
    points = np.reshape(points, (int(points.shape[0] / 3), 3))
    points_ = points[:,:-1]
    points_ /= 20
    # print(len(points_))
    # print(points_)

    result_array = np.zeros((500, 2), dtype=np.dtype('f4'))
    result_array[:points_.shape[0]] = points_
    print(result_array)
    # print(result_array)
    # # 이미지 크기 및 범위 설정
    # image_size = 256  # 이미지 크기 (가로, 세로 픽셀 수)
    # max_range = 30.0  # LIDAR에서 최대로 측정 가능한 거리 (meters)

    # # 이미지 생성 및 초기화 (배경을 흰색으로 설정)
    # image = np.ones((image_size, image_size), dtype=np.uint8) * 255

    # # 베셀 범위 이미징 수행
    # for point in points:
    #     x, y, z = point
    #     if 0 < z < max_range:  # 최대 거리 이내의 점만 이미지에 표시
    #         pixel_x = int((x / max_range + 0.5) * image_size)
    #         pixel_y = int((y / max_range + 0.5) * image_size)

    #         # 이미지 범위를 벗어나는 좌표 값을 제한
    #         pixel_x = np.clip(pixel_x, 0, image_size - 1)
    #         pixel_y = np.clip(pixel_y, 0, image_size - 1)

    #         image[pixel_y, pixel_x] = 0  # 점의 위치를 검은색으로 표시

    return 0

if __name__ == "__main__":
    lidar_image = lidar_to_image()

    # # 이미지를 표시
    # plt.imshow(lidar_image, cmap='gray')
    # plt.axis('off')
    # plt.show()

 

이외에도 다양한 코드가 있지만, 주 코드는 다음들로 사용을 하였기 때문에 넘어가도록 하겠다.

'로봇 > Airsim' 카테고리의 다른 글

AirSim에서 RL하기 (4) - Env(환경) 제작  (0) 2023.08.11
AirSim에서 RL 하기 (2) - 목표  (0) 2023.08.11
AirSim에서 RL하기 (1)  (0) 2023.08.11