시물레이션으로 모사하는 방법에 대하여 기술

MAVLINK란
MAVLINK(Micro Air Vehicle Link)는 무인 항공 기기(UAV)와 지상 기기 사이의 통신 프로토콜입니다. 주로 드론 및 기타 무인 항공 기기의 제어와 상태 모니터링을 위해 사용됩니다.
또한 우분투 상에서 px4 와 연동하여 px4 모델의 센서값을 변경할 수 있습니다.
(본 실습에서는 GPS_INT라는 센서값을 변경)
코드는 가짜 GPS 데이터를 생성하여 MAVLINK 메시지로 PX4에게 전송하는 역할을 합니다.
import random
import matplotlib.pyplot as plt
from pymavlink import mavutil
# GPS 데이터 클래스
class GPSData:
def __init__(self):
self.lat = 0
self.lon = 0
self.alt = 0
def set(self, lat, lon, alt):
self.lat = lat
self.lon = lon
self.alt = alt
return self
def add_noise(self, noise_level):
"""GPS 데이터에 노이즈 추가"""
noisy_lat = self.lat + random.uniform(-noise_level, noise_level)
noisy_lon = self.lon + random.uniform(-noise_level, noise_level)
noisy_alt = self.alt + random.uniform(-noise_level * 10, noise_level * 10)
return GPSData().set(noisy_lat, noisy_lon, noisy_alt)
def to_tuple(self):
return (self.lat, self.lon, self.alt)
def __str__(self):
return f"Lat: {self.lat}, Lon: {self.lon}, Alt: {self.alt}"
# GPS 재밍 시뮬레이션
def simulate_gps_jamming(original_gps, noise_level):
return original_gps.add_noise(noise_level)
# MAVLink를 통해 GPS 데이터를 수신하는 함수
def receive_gps_data(connection):
gps_data = GPSData()
msg = connection.recv_match(type='GLOBAL_POSITION_INT', blocking=True)
if msg:
gps_data.set(msg.lat / 1e7, msg.lon / 1e7, msg.alt / 1000)
return gps_data
# MAVLink 연결 설정
connection = mavutil.mavlink_connection('udp:127.0.0.1:14550')
# GPS 데이터 수집 및 재밍 시뮬레이션
original_gps_data = []
jammed_gps_data = []
noise_level = 0.0001 # 노이즈 정도
for _ in range(100):
original_gps = receive_gps_data(connection)
if original_gps:
jammed_gps = simulate_gps_jamming(original_gps, noise_level)
original_gps_data.append(original_gps.to_tuple())
jammed_gps_data.append(jammed_gps.to_tuple())
# 원본 및 재밍된 GPS 데이터 플롯
def plot_gps_data(original_data, jammed_data):
original_lats, original_lons, original_alts = zip(*original_data)
jammed_lats, jammed_lons, jammed_alts = zip(*jammed_data)
plt.figure(figsize=(12, 6))
# 위도와 경도 플롯
plt.subplot(1, 2, 1)
plt.plot(original_lons, original_lats, label='Original GPS')
plt.plot(jammed_lons, jammed_lats, label='Jammed GPS', linestyle='--')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.legend()
plt.title('GPS Jamming Simulation (Lat/Lon)')
# 고도 플롯
plt.subplot(1, 2, 2)
plt.plot(original_alts, label='Original GPS')
plt.plot(jammed_alts, label='Jammed GPS', linestyle='--')
plt.xlabel('Sample Index')
plt.ylabel('Altitude (m)')
plt.legend()
plt.title('GPS Jamming Simulation (Altitude)')
plt.tight_layout()
plt.show()
# 플롯 호출
plot_gps_data(original_gps_data, jammed_gps_data)

사진) GPS Jamming Plot화
영상) PX4(ROS), Mavlink GPS Jamming 테스트 영상