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

방법(MAVLINK사용)

Untitled

MAVLINK란

MAVLINK(Micro Air Vehicle Link)는 무인 항공 기기(UAV)와 지상 기기 사이의 통신 프로토콜입니다. 주로 드론 및 기타 무인 항공 기기의 제어와 상태 모니터링을 위해 사용됩니다.

또한 우분투 상에서 px4 와 연동하여 px4 모델의 센서값을 변경할 수 있습니다.

(본 실습에서는 GPS_INT라는 센서값을 변경)

코드는 가짜 GPS 데이터를 생성하여 MAVLINK 메시지로 PX4에게 전송하는 역할을 합니다.

MAVLINK 제어 코드

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)

Untitled

사진) GPS Jamming Plot화

https://youtu.be/w2_aoBZuGSA

영상) PX4(ROS), Mavlink GPS Jamming 테스트 영상