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 |