Tool 활용법/Sionna 활용법

Sionna RT (Ray Tracing) 기반 6G 채널 모델 분석하기 (Sionna Tutorial)

gksyb4235 2026. 2. 11. 19:04

Sionna RT 시작하기: Import와 Scene 로딩


여기에서는 Sionna RT에서 제공하는 Tutorial을 직접 WSL2 환경에 세팅해서 돌려보고, 그 과정을 해석해본다.

Tutorial 링크 : https://nvlabs.github.io/sionna/rt/tutorials/Introduction.html

 

Introduction to Sionna RT — Sionna 1.2.1 documentation

Ray tracing is a technique to simulate environment-specific and physically accurate channel realizations for a given scene and user position. Please see the EM Primer for further details on the theoretical background of ray tracing of wireless channels. Si

nvlabs.github.io

 

 

 

라이브러리 Import


import sionna.rt
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

no_preview = False # Toggle to True to not use the preview widget

# Import relevant components from Sionna RT
from sionna.rt import load_scene, PlanarArray, Transmitter, Receiver, Camera,\
                      PathSolver, RadioMapSolver, subcarrier_frequencies

 

Sionna RT 주요 컴포넌트 Import는 다음과 같다.

 

  • load_scene : 3D 환경(Scene) 로딩
  • PlanarArray : 안테나 배열 정의
  • Transmitter, Receiver : 송수신기 배치
  • Camera : 시각화 카메라 설정
  • PathSolver : 전파 경로 계산
  • RadioMapSolver : 공간 기반 신호 세기 계산
  • subcarrier_frequencies : OFDM 서브캐리어 주파수 생성

 

 

Scene 로딩


scene = load_scene(sionna.rt.scene.munich)

 

여기서는 Sionna RT에 내장된 Munich Frauenkirche 주변 3D 도시 환경을 로딩한다.

우리가 직접 생성한 Mitsuba XML 파일도 로딩할 수 있지만, 기본 제공 Scene을 활용하면 빠르게 실험을 시작할 수 있다.

 

 

 

3D Preview 기능


preview()는 Jupyter Notebook 환경에서만 동작하는 인터랙티브 3D 뷰어를 실행한다.

if not no_preview:
    scene.preview();

 

 

마우스 조작 방식은 다음과 같다.

  • 왼쪽 버튼: 회전
  • 휠: 확대/축소
  • 오른쪽 버튼: 이동

 

 

Preview 카메라 활용


Preview에서 설정한 시점을 기반으로 고품질 이미지를 렌더링할 수도 있다.

즉, 인터랙티브 탐색 → 최종 이미지 렌더링이라는 흐름으로 작업하게 된다.

 

if not no_preview:
    scene.preview();

 

고품질로 렌더링한 이미지

 

 

그 외에도 카메라 시점, 렌더링 해상도 등을 설정하고, 생성된 이미지를 png 파일로 저장할 수 있다.

 

 

 

 

 

SceneObject 이해하기: 환경을 직접 조작하는 방법


Sionna RT에서 Scene은 단순한 배경이 아니라, 물리적으로 상호작용하는 객체들의 집합이다.

각 건물, 바닥, 벽, 구조물은 모두 SceneObject로 구성되어 있으며, 이 객체들을 직접 조작할 수 있다는 점이 매우 중요하다.

이제 Munich 환경 대신 6개의 건물로 이뤄진 간단한 환경에서 테스트를 진행한다.

 

simple_street_canyon의 경우 위와 같이 생겼다.

 

scene = load_scene(sionna.rt.scene.simple_street_canyon, merge_shapes=False)
scene.objects

 

Scene을 Load한 후 objects의 요소를 출력하면 Scene을 구성하는 Object 목록을 확인할 수 있다.

출력 결과는 다음과 같이 Scene을 구성하는 객체 목록을 보여준다.

 

 

 

 

위치, 회전, 크기 조정


SceneObject는 다음과 같은 기하학적 속성을 가진다.

  • position (위치)
  • orientation (회전)
  • scaling (크기)
  • look_at (특정 방향을 바라보게 설정)

 

특정 객체에 접근하려면 다음과 같이 사용한다.

아래에선는 floor Object의 물리적 속성을 확인할 수 있다.

floor = scene.get("floor")

print("Position (x,y,z) [m]: ", floor.position)
print("Orientation (alpha, beta, gamma) [rad]: ", floor.orientation)
print("Scaling: ", floor.scaling)

>>> 
Position (x,y,z) [m]:  [[-0.769669, 0.238537, -0.0307941]]
Orientation (alpha, beta, gamma) [rad]:  [[0, 0, 0]]
Scaling:  [[1, 1, 1]]

 

만약 건물의 위치를 변경하려면 다음과 같이 설정할 수 있다.

floor.position = [0, 0, 0]

 

이러한 공간적 변형은 전파 경로 구조에 직접적인 영향을 준다.

특히 mmWave 환경에서는 작은 위치 변화도 경로 수와 반사 각도에 큰 영향을 미친다.

 

 

 

Velocity와 Doppler 효과


이 부분이 가장 디테일하다고 느끼는 부분인데,모든 SceneObject는 velocity 벡터를 가진다.

 

print("Velocity (x,y,z) [m/s]: ", floor.velocity)

>>> 
Velocity (x,y,z) [m/s]: [[0, 0, 0]]
 

이 값은 Ray Tracing 과정에서 각 경로의 Doppler shift 계산에 사용된다.

즉, 이동하는 객체가 있으면 시간에 따라 채널이 변하는 페이딩 현상을 시뮬레이션할 수 있다.

위와 같이 바닥이 움직이는 상황은 현실적이지 않지만,

차량이나 드론 객체에 velocity를 부여하면 다음과 같이 모든 Propagation path에 대한 도플로 효과를 계산할 수 있다.

 

scene.get("tx").velocity = [10, 0, 0]

 

이 경우 송신기가 x축 방향으로 10 m/s로 이동하는 상황을 모델링하게 된다.

 

 

 

RadioMaterial: 전파와의 상호작용 정의


SceneObject의 가장 중요한 속성 중 하나는 radio_material이다.

floor.radio_material

 

 

이 파라미터들은 다음을 의미한다.

  • eta_r: 상대 유전율
  • sigma: 전도도
  • thickness: 재료 두께
  • scattering_coefficient: 산란 계수
  • xpd_coefficient: 편파 분리 관련 계수

이 값들은 반사 손실, 투과 감쇠, 위상 변화에 직접적인 영향을 준다.

 

 

주파수 의존성


고주파 대역에서는 재료 특성이 주파수에 따라 달라진다. Sionna RT는 이를 자동으로 반영한다.

scene.frequency = 28e9  # 28 GHz
floor.radio_material

 

예를 들어 conductivity(sigma)가 자동으로 변경되는 것을 확인할 수 있다.

sigma=0.626
// sigma=0.123이었음

 

 

 

 

전파 경로 계산하기: PathSolver로 실제 무선 채널 만들기



 

 

Scene을 구성했다면 이제 실제로 전파가 어떻게 이동하는지를 계산해야 한다.

이 단계가 바로 Ray Tracing의 핵심이며, 물리 기반 무선 채널 모델링 부분이라고 할 수 있다.

Sionna RT에서는 이 과정을 PathSolver라는 함수가 담당한다.

다시 Munich의 Scene을 불러온다.

scene = load_scene(sionna.rt.scene.munich, merge_shapes=True)

 

 

 

송수신기와 안테나 배열 설정


Scene을 불러온 다음 단계는 송신기(TX)와 수신기(RX)에 사용할 안테나 배열을 정의하는 것이다.
Sionna RT에서는 배열 객체를 먼저 만들고, 이를 씬에 속한 모든 송신기와 수신기에 공통으로 적용한다.

여기서는 다음과 같이 설정하였다.

// 송신 안테나 배열 설정
scene.tx_array = PlanarArray(
    num_rows=4,
    num_cols=4,
    vertical_spacing=0.5,
    horizontal_spacing=0.5,
    pattern="tr38901",
    polarization="V"
)


// 수신 안테나 배열 설정
scene.rx_array = PlanarArray(
    num_rows=1,
    num_cols=1,
    vertical_spacing=0.5,
    horizontal_spacing=0.5,
    pattern="dipole",
    polarization="cross"
)

 

 

여기서 설정한 요소들은 다음 의미를 가진다.

 

  • TX Array
    • num_rows, num_cols (배열 구조): 1×1 Planar Array
    • spacing (안테나 간 간격): 수직/수평 간격 0.5
    • pattern (방사 패턴): 3GPP TR 38.901 패턴 사용
    • polarization (단일/이중 편파 설정): 수직 편파("V")
  • RX Array
    • 1×1 단일 안테나
    • dipole 패턴
    • cross polarization

 

모든 송신기는 이 배열 구조를 공유한다.

위와 같은 설정은 mmWave 또는 6G 환경에서의 빔포밍 실험을 위한 전형적인 구조이다.
4×4 배열은 지향성 전파를 생성하며, RX는 단일 안테나로 수신 성능을 관찰한다.

 

 

송수신기 배치


tx = Transmitter(name="tx",
                 position=[8.5,21,27],
                 display_radius=2)

scene.add(tx)

rx = Receiver(name="rx",
              position=[45,90,1.5],
              display_radius=2)

scene.add(rx)

tx.look_at(rx)

 

  • position은 3D 공간 내 좌표
  • look_at은 송신기 빔 방향을 수신기로 정렬

이 설정에 따라 LoS 여부, 반사 각도, 경로 수가 달라진다.

 

 

 

 

PathSolver로 전파 경로 계산


이제 PathSolver를 생성한다.

p_solver = PathSolver()

 

다음과 같이 실행한다.

paths = p_solver(
    scene=scene,
    max_depth=5,
    los=True,
    specular_reflection=True,
    diffuse_reflection=False,
    refraction=True,
    synthetic_array=False,
    seed=41
)

 

이때 주요 파라미터는 다음과 같다.

  • max_depth → 한 경로가 최대 몇 번 물체와 상호작용할 수 있는가
    (0이면 LoS만 계산, 1이면 1차 반사 포함, 5이면 다중 반사까지 고려)
  • los  → 직선 경로 포함 여부
  • specular_reflection → 거울 반사 포함 여부
  • diffuse_reflection → 난반사 포함 여부 (랜덤성 증가)
    이때, diffuse reflection은 랜덤 샘플링을 사용하므로 seed를 설정하지 않으면 실행마다 결과가 달라질 수 있다.
  • refraction → 굴절 포함 여부
  • synthetic_array
    False: 모든 안테나 쌍에 대해 실제 경로 계산 (정확하지만 계산량 증가)
    True: 배열 중심 기준 계산 후 위상 보정 적용 (빠르지만 근사 모델)
  • seed → 난수 기반 경로 탐색의 재현성 확보

 

 

계산된 경로 결과 시각화


scene.preview(paths=paths, clip_at=20);

 

 

이 코드는 계산된 전파 경로를 3D 환경 위에 시각화하며 clip_at = 20은 20m 이후 경로는 표시하지 않는 옵션이다.

이 시각화를 통해 다음을 직관적으로 확인할 수 있다.

  • LoS 존재 여부
  • 주요 반사 경로
  • 다중 경로 구조
  • NLoS 환경에서의 전파 메커니즘

 

 

Paths 객체의 의미


PathSolver의 결과인 paths 객체에는 다음 정보가 포함된다.

  • 각 경로의 복소 계수
  • 지연 시간
  • 편파 정보
  • Doppler shift
  • 반사 횟수

이 정보는 이후 다음 계산의 기반이 된다.

  • CIR (Channel Impulse Response)
  • CFR (Channel Frequency Response)
  • 시간 변화 채널 모델
  • Mobility 시뮬레이션

즉, PathSolver는 물리적 경로를 계산하고, 이후 모든 통신 시뮬레이션은 이 물리 모델 위에서 이루어진다.