濾波器的三重境界:從信號處理到自動駕駛測試的基石

在這里插入圖片描述

在自動駕駛的宏大敘事中,我們常常聚焦于人工智能、深度學習、高精地圖等"明星技術"。然而,在這些耀眼的光環背后,有一個低調卻至關重要的"幕后英雄"——濾波器。它不僅是信號處理的工具,更是連接物理世界與數字算法的橋梁,是自動駕駛感知、決策、控制乃至測試驗證的數學基石

本文將帶你深入濾波器的世界,從車輛加速度的噪聲抑制,到其在自動駕駛系統中的核心應用,再到測試驗證中的關鍵抉擇,揭示其如何從一個簡單的數學公式,演變為決定系統成敗的"雙刃劍"。我們將補充常用濾波器的核心公式,并提供不同應用場景下的選擇指南。


第一重境界:降噪——讓信號回歸真實

想象一輛車在顛簸的路面上行駛。其搭載的加速度計會忠實地記錄下每一個微小的振動——輪胎碾過石子、懸掛系統彈跳、發動機抖動。這些高頻噪聲,與車輛真正加速、減速或轉彎產生的低頻慣性力混雜在一起,形成了我們常說的"臟信號"。

如果直接使用這種信號計算速度或位移,高頻噪聲會在積分過程中被急劇放大,導致結果嚴重失真。例如,一次平穩的剎車過程,可能在計算出的"速度曲線"上表現為劇烈的震蕩。這便是濾波器登場的時刻。

目標:保留反映車輛真實運動的低頻信息,抑制無用的高頻噪聲。

常用方法與核心公式

濾波器類型核心公式說明
移動平均 (Moving Average)y[n]=1N∑k=0N?1x[n?k] y[n] = \frac{1}{N} \sum_{k=0}^{N-1} x[n-k] y[n]=N1?k=0N?1?x[n?k]計算最近N個采樣點的算術平均。實現簡單,但延遲大(約 N?12\frac{N-1}{2}2N?1? 個周期),會削弱信號峰值。
一階低通 (First-Order Low-Pass)y[n]=α?x[n]+(1?α)?y[n?1] y[n] = \alpha \cdot x[n] + (1 - \alpha) \cdot y[n-1] y[n]=α?x[n]+(1?α)?y[n?1]
其中 α=dtτ+dt,τ=12πfc \alpha = \frac{dt}{\tau + dt},\quad \tau = \frac{1}{2\pi f_c} α=τ+dtdt?,τ=2πfc?1?
dt為采樣周期,fc為截止頻率。通過調整fc控制平滑程度。相位延遲小于移動平均,廣泛用于車載ECU。
卡爾曼濾波 (Kalman Filter)預測
x^?[k]=Fx^[k?1]+Bu[k] \hat{\mathbf{x}}^{-}[k] = \mathbf{F}\hat{\mathbf{x}}[k-1] + \mathbf{B}\mathbf{u}[k] x^?[k]=Fx^[k?1]+Bu[k]
P?[k]=FP[k?1]FT+Q \mathbf{P}^{-}[k] = \mathbf{F}\mathbf{P}[k-1]\mathbf{F}^T + \mathbf{Q} P?[k]=FP[k?1]FT+Q
更新
K[k]=P?[k]HT(HP?[k]HT+R)?1 \mathbf{K}[k] = \mathbf{P}^{-}[k]\mathbf{H}^T(\mathbf{H}\mathbf{P}^{-}[k]\mathbf{H}^T + \mathbf{R})^{-1} K[k]=P?[k]HT(HP?[k]HT+R)?1
x^[k]=x^?[k]+K[k](z[k]?Hx^?[k]) \hat{\mathbf{x}}[k] = \hat{\mathbf{x}}^{-}[k] + \mathbf{K}[k](\mathbf{z}[k] - \mathbf{H}\hat{\mathbf{x}}^{-}[k]) x^[k]=x^?[k]+K[k](z[k]?Hx^?[k])
P[k]=(I?K[k]H)P?[k] \mathbf{P}[k] = (\mathbf{I} - \mathbf{K}[k]\mathbf{H})\mathbf{P}^{-}[k] P[k]=(I?K[k]H)P?[k]
線性系統的最優估計算法。F\mathbf{F}F為狀態轉移矩陣,H\mathbf{H}H為觀測矩陣,Q\mathbf{Q}QR\mathbf{R}R分別為過程噪聲和觀測噪聲協方差。需要建立準確的系統模型。
擴展卡爾曼濾波 (EKF)同KF,但F\mathbf{F}FH\mathbf{H}H替換為非線性函數f()f()f()h()h()h()的雅可比矩陣。用于非線性系統(如車輛運動學)。通過局部線性化近似處理非線性。
互補濾波 (Complementary Filter)θest=α?(θprev+ω?dt)+(1?α)?θacc \theta_{est} = \alpha \cdot (\theta_{prev} + \omega \cdot dt) + (1 - \alpha) \cdot \theta_{acc} θest?=α?(θprev?+ω?dt)+(1?α)?θacc?融合陀螺儀(高頻準)和加速度計(低頻準)。ω\omegaω為角速度,θacc\theta_{acc}θacc?為由加速度計計算的姿態角。α\alphaα通常接近1。

本質:這一境界的濾波器,是信號的"清潔工",旨在還原物理世界的真實動態。


第二重境界:融合——在不確定性中構建認知

當自動駕駛車輛駛上道路,它不再僅僅依賴單一傳感器。激光雷達、攝像頭、毫米波雷達、GPS、IMU、輪速計……多種傳感器從不同維度感知環境。然而,每個傳感器都有其局限:攝像頭怕暗,雷達角分辨率低,GPS在隧道中失效,IMU積分會漂移。

此時,濾波器的角色從"清潔工"升級為**“融合大師”**。它利用數學工具,在不確定性中構建對世界最可能的認知。

核心應用場景

  1. 環境感知與目標跟蹤:使用KF/EKF預測動態目標軌跡,維持ID連續性。
  2. 高精度定位:通過EKF/UKF融合RTK-GPS、IMU、輪速計,實現厘米級定位。
  3. 車輛狀態估計:用EKF估計側滑角、真實速度;用互補濾波分離重力分量。

本質:這一境界的濾波器,是系統的"小腦",負責協調多源信息,生成連貫、可靠的狀態估計,為決策提供堅實基礎。


第三重境界:抉擇——測試中的雙刃劍

在自動駕駛的研發閉環中,測試驗證是確保安全的最終防線。然而,測試工程師面臨一個悖論:原始數據充滿噪聲,難以分析;但濾波處理又可能扭曲事實,掩蓋問題。

濾波器在此刻成為一把"雙刃劍"

  • 用得好:它是"數據醫生",能生成高精度真值、準確評估性能、輔助故障診斷。
  • 用得不好:它是"遮羞布",可能抹平緊急制動的峰值、掩蓋傳感器的周期性抖動,讓測試結果失去意義。
如何科學選擇濾波器?——場景化決策指南

選擇濾波器必須基于明確的測試目標。以下是常見測試場景下的推薦策略:

測試目標關鍵分析需求推薦濾波器參數建議與注意事項
AEB/FCW功能觸發評估精確的相對距離、相對速度變化率,捕捉瞬時事件。輕度一階低通零相位低通截止頻率:10-20 Hz。
禁止重度濾波!需保留剎車尖峰。建議同時展示原始與濾波后信號對比。
乘坐舒適性分析 (Ride Comfort)人體感知的低頻晃動(點頭、俯仰、橫擺),抑制高頻路面噪聲。中度一階低通帶阻濾波器截止頻率:3-5 Hz。
若存在明顯發動機共振(如30Hz),使用帶阻濾波器精準切除。
高精度軌跡生成 (Ground Truth)厘米級絕對位置、速度、姿態,長期穩定性。擴展卡爾曼濾波器 (EKF)必須融合RTK-GPS、高精度IMU、輪速計。
仔細標定噪聲協方差 Q\mathbf{Q}QR\mathbf{R}R
能耗與續航測試平均加速度、宏觀速度曲線,對瞬時抖動不敏感。重度一階低通移動平均截止頻率:1-2 Hz 或 N=50-100 的移動平均。
目標是得到平滑的宏觀趨勢。
傳感器故障診斷分析原始噪聲的頻譜、方差、周期性,定位干擾源。禁止濾波必須使用原始信號進行FFT頻譜分析、統計分析。
濾波會"擦除"故障證據。
規劃控制算法驗證平滑的車輛狀態輸入,避免控制器因噪聲抖動。實時一階低通EKF截止頻率:5-10 Hz。
注意相位延遲對控制的影響,必要時進行延遲補償。
仿真場景復現 (HIL/SIL)提供穩定、合理的車輛狀態給仿真平臺。零相位濾波 (離線)EKF (實時)離線分析用 filtfilt 消除相位延遲。
確保虛擬傳感器輸入的合理性。

黃金法則

  • 目標驅動:先問"為什么濾波",再決定"怎么濾"。
  • 保留原始數據:原始數據是"法律證據",永遠不要丟棄。
  • 透明公開:在報告中明確標注:濾波器類型、截止頻率、階數、是否零相位、實現庫(如scipy.signal)。
  • 驗證對比:始終進行"濾波前后"對比,檢查是否引入虛假特征或丟失關鍵信息。

結語:濾波器即哲學

濾波器的故事,遠不止于數學公式。它體現了工程實踐中最深刻的哲學——在噪聲與真實、平滑與細節、效率與準確之間尋求平衡

在自動駕駛這條充滿不確定性的道路上,濾波器教會我們:真正的智能,不在于擁有完美的數據,而在于如何在不完美的世界中,做出最優的估計與決策

當你下次看到一條平滑的車輛軌跡曲線時,請記住,那不僅是技術的勝利,更是無數工程師在"濾波"二字上反復權衡、嚴謹求證的結果。因為在這里,一個小小的截止頻率,可能就決定了安全與危險的距離

— by AGI 本文部分內容由通義千問生成整理匯總,僅供入門參考。歡迎學習交流!

參考文獻

[1] Euro NCAP. (2022). Test Protocol Bulletin TB021: Data Acquisition and Injury Calculation (Version 4.1). Euro NCAP Technical Report. Retrieved from https://www.euroncap.com/media/79880/tb-021-data-acquisition-and-injury-calculation-v41.pdf

附錄
文首的測試demo

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
from scipy.signal import butter, filtfiltdef butter_lowpass_filter(data, cutoff, fs, order=4):"""Apply Butterworth lowpass filterParameters:data : array_like - Input datacutoff : float - Cutoff frequency (Hz)fs : float - Sampling frequency (Hz)order : int - Filter orderReturns:y : array_like - Filtered data"""nyquist = 0.5 * fsnormal_cutoff = cutoff / nyquistb, a = butter(order, normal_cutoff, btype='low', analog=False)y = filtfilt(b, a, data)return y# Parameter settings
duration = 20  # Duration (seconds)
fs = 100  # Sampling frequency (Hz)
cutoff_freq_05 = 0.5  # Original cutoff frequency (Hz)
cutoff_freq_2 = 2.0   # New 2Hz cutoff frequency (Hz)
cutoff_freq_5 = 5.0   # New 5Hz cutoff frequency (Hz)
cutoff_freq_10 = 10.0 # New 10Hz cutoff frequency (Hz)
filter_order = 4  # Standard filter order
filter_order_12 = 4 # Standard filter order# Generate time axis
t = np.linspace(0, duration, int(fs * duration), endpoint=False)# Simulate lateral acceleration data (including multiple frequency components and noise)
# Low frequency components (real lateral acceleration changes)
true_acceleration = 2 * np.sin(2 * np.pi * 0.1 * t) + 1.5 * np.sin(2 * np.pi * 0.3 * t)# Additional components at 2Hz and 5Hz
additional_components = 0.8 * np.sin(2 * np.pi * 2 * t) + 0.6 * np.sin(2 * np.pi * 5 * t)# High frequency noise
noise = 0.5 * np.random.normal(0, 1, len(t)) + 0.3 * np.sin(2 * np.pi * 5 * t) + 0.2 * np.sin(2 * np.pi * 15 * t)# Original measurement data (real signal + additional components + noise)
raw_acceleration = true_acceleration + additional_components + noise# Apply Butterworth lowpass filters with different cutoff frequencies
filtered_acceleration_05 = butter_lowpass_filter(raw_acceleration, cutoff_freq_05, fs, filter_order)
filtered_acceleration_2 = butter_lowpass_filter(raw_acceleration, cutoff_freq_2, fs, filter_order)
filtered_acceleration_5 = butter_lowpass_filter(raw_acceleration, cutoff_freq_5, fs, filter_order)
filtered_acceleration_10 = butter_lowpass_filter(raw_acceleration, cutoff_freq_10, fs, filter_order_12)# Create separate plots for each filter
plt.figure(figsize=(15, 15))# Plot 1: Original data
plt.subplot(3, 3, 1)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, label='Raw Data')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('Original Lateral Acceleration Data')
plt.grid(True, alpha=0.3)
plt.legend()# Plot 2: 0.5Hz filter
plt.subplot(3, 3, 2)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, alpha=0.3, label='Raw Data')
plt.plot(t, filtered_acceleration_05, 'r-', linewidth=1.5,label=f'Butterworth LPF ({cutoff_freq_05} Hz, Order {filter_order})')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('0.5Hz Lowpass Filter')
plt.grid(True, alpha=0.3)
plt.legend()# Plot 3: 2Hz filter
plt.subplot(3, 3, 3)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, alpha=0.3, label='Raw Data')
plt.plot(t, filtered_acceleration_2, 'g-', linewidth=1.5,label=f'Butterworth LPF ({cutoff_freq_2} Hz, Order {filter_order})')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('2Hz Lowpass Filter')
plt.grid(True, alpha=0.3)
plt.legend()# Plot 4: 5Hz filter
plt.subplot(3, 3, 4)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, alpha=0.3, label='Raw Data')
plt.plot(t, filtered_acceleration_5, 'm-', linewidth=1.5,label=f'Butterworth LPF ({cutoff_freq_5} Hz, Order {filter_order})')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('5Hz Lowpass Filter')
plt.grid(True, alpha=0.3)
plt.legend()# Plot 5: 10Hz filter (12th order)
plt.subplot(3, 3, 5)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, alpha=0.3, label='Raw Data')
plt.plot(t, filtered_acceleration_10, 'c-', linewidth=1.5,label=f'Butterworth LPF ({cutoff_freq_10} Hz, Order {filter_order_12})')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('10Hz Lowpass Filter (12th Order)')
plt.grid(True, alpha=0.3)
plt.legend()# Plot 6: Combined comparison of all filters
plt.subplot(3, 3, 6)
plt.plot(t, raw_acceleration, 'b-', linewidth=0.8, alpha=0.3, label='Raw Data')
plt.plot(t, filtered_acceleration_05, 'r-', linewidth=1.5,label=f'LPF ({cutoff_freq_05} Hz, Order {filter_order})')
plt.plot(t, filtered_acceleration_2, 'g-', linewidth=1.5,label=f'LPF ({cutoff_freq_2} Hz, Order {filter_order})')
plt.plot(t, filtered_acceleration_5, 'm-', linewidth=1.5,label=f'LPF ({cutoff_freq_5} Hz, Order {filter_order})')
plt.plot(t, filtered_acceleration_10, 'c-', linewidth=1.5,label=f'LPF ({cutoff_freq_10} Hz, Order {filter_order_12})')
plt.xlabel('Time (s)')
plt.ylabel('Lateral Acceleration (m/s2)')
plt.title('Combined View: All Filters Comparison')
plt.grid(True, alpha=0.3)
plt.legend()# 調整布局,增加上下部分之間的間距
plt.tight_layout(pad=3.0, h_pad=3.0, w_pad=1.0)
plt.show()# Print filter information
print(f"Sampling Frequency: {fs} Hz")
print(f"Standard Filter Order: {filter_order}")
print(f"10Hz Filter Order: {filter_order_12}")
print(f"Number of Data Points: {len(t)}")
print(f"Data Duration: {duration} s")
print("\nApplied Filters:")
print(f"  - Lowpass Filter 1: {cutoff_freq_05} Hz (Order {filter_order})")
print(f"  - Lowpass Filter 2: {cutoff_freq_2} Hz (Order {filter_order})")
print(f"  - Lowpass Filter 3: {cutoff_freq_5} Hz (Order {filter_order})")
print(f"  - Lowpass Filter 4: {cutoff_freq_10} Hz (Order {filter_order_12})")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97893.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Part4.第8章:神經網絡

第8章 激活函數 如果沒有激活函數,不論幾層的神經網絡都是一個線性回歸。激活函數的作用是引入非線性。

nextjs+shadcn+tailwindcss實現博客中的overview

最近在用nextjsshadcntailwindcss練手,實現一個博客。做到了overView這里,可實現如下效果1.首先要安裝tailwindcss,這個在創建項目的時候就安裝了。2.然后安裝shadcn,官網教程:3.代碼如下:import {Card,CardContent } …

Kotlin 高階語法解析

Kotlin 高級語法深度解析1. 協程(Coroutines)1.1 基礎概念1.掛起和恢復2.協程構建器 (Coroutine Builders)3.協程作用域4.調度器1.2 核心用法1.3 實戰示例2. 密封類(Sealed Classes)2.1 定義與特性2.2 模式匹配2.3 應用場景3. 內聯…

9 基于機器學習進行遙感影像參數反演-以隨機森林為例

目錄 1 讀取數據 2 數據預處理 3模型訓練 4模型預測 5精度分析 由于回歸任務的標簽數據獲取比較困難,我們這次用水體指數NDWI來模擬作為回歸任務的標簽,通過隨機森林來擬合回歸NDWI,其計算公式如下: NDWI = (band3 - band5) / (band3 + band5) 實際情況下需要回歸的數…

C++多線程編程:跨線程操作全解析

C中的"線程"通常指單個執行流(如std::thread對象),而"多線程"指程序中同時存在多個這樣的執行流,并涉及它們的創建、管理和同步。實現跨線程操作的核心在于安全地處理共享數據和線程間通信。 以下是實現跨線程…

【腦電分析系列】第13篇:腦電源定位:從頭皮到大腦深處,EEG源定位的原理、算法與可視化

前言腦電信號(Electroencephalography, EEG)是一種非侵入性的神經成像技術,能夠實時捕捉大腦的電活動。然而,頭皮上記錄到的信號是腦源活動經過頭皮、顱骨等介質“模糊”后的投影。想要從這些頭皮EEG信號追溯到大腦深處的電活動&a…

MySQL知識筆記

DATE_ADD(date,INTERVAL expr type) date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。多查官方手冊!!命令行啟動和停止sql服務net start 數據庫名; 這是啟動服務命令; 例如:net start Mysql56…

2025算法八股——深度學習——MHA MQA GQA

MHA、MQA、GQA 都是深度學習中注意力機制的相關概念,其中 MHA 是標準的多頭注意力機制,MQA 和 GQA 則是其優化變體,以下是它們的區別、優缺點介紹:區別MHA(多頭注意力):是 Transformer 架構的核…

Vue3》》eslint Prettier husky

安裝必要的依賴 npm install -D eslint eslint/js vue/eslint-config-prettier prettier eslint-plugin-vue 初始化 ESLint 配置 npm init eslint/config// eslint.config.js // 針對 JavaScript 的 ESLint 配置和規則。保持 JavaScript 代碼的一致性和質量 import js from &qu…

Custom SRP - Point and Spot Lights

https://catlikecoding.com/unity/tutorials/custom-srp/point-and-spot-lights/Lights with Limited Influence1 Point Lights1.1 Other Light Data (Point )同方向光一樣,我們支持有限數量的 Other Light.盡管場景中可能有很多 Other Lights,可能有超過光源上限的光源時可見的…

hive數據倉庫的搭建

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄前言一、內嵌模式二、本地模式三、遠程模式前言 HIVE是基于HDFS的數據倉庫,要首先搭建好HADOOP的集群才可以正常使用HIVE,HADOOP集運搭建詳見…

域名SSL證書免費申請lcjmSSL

.-.lcjmSSL(又名“來此加密”)是一個提供免費SSL證書申請的一站式平臺。它支持單域名、多域名以及泛域名證書申請,且單張證書最高可覆蓋100個域名,讓您輕松實現全站HTTPS加密。為什么您的網站必須安裝SSL證書?數據加密…

“能量逆流泵”:一種基于電容陣與開關矩陣的超高效大功率降壓架構

摘要本文提出并驗證了一種面向大功率降壓應用的革命性電源架構——"能量逆流泵"(Energy Inversion Pump, EIP)。該架構摒棄了傳統Buck轉換器中的電感元件,通過高速開關矩陣控制的電容陣列,將高壓側能量以"分時、分…

打造精簡高效的 uni-app 網絡請求工具

在 uni-app 開發中,網絡請求是連接前端與后端的核心橋梁。一個設計良好的請求工具能夠顯著提升開發效率,減少重復代碼。本文將分享一個精簡版的 uni-app 網絡請求工具實現,它保留了核心功能同時保持了足夠的靈活性。設計思路一個優秀的網絡請…

【面試場景題】交易流水表高qps寫入會有鎖等待或死鎖問題嗎

文章目錄一、先明確交易流水表的核心特性二、InnoDB的鎖機制在流水表寫入場景的表現1. 行鎖(Record Lock):基本不涉及2. 間隙鎖(Gap Lock)與Next-Key Lock:幾乎不觸發3. 表鎖:僅在極端場景出現三…

項目部署——LAMP、LNMP和LTMJ

前情提要問:如何通過nginx的反向代理,代理多臺虛擬主機(一臺apache服務器上的虛擬主機)?1.在nginx的配置文件中,將基于域名的訪問改為基于端口的訪問(nginx.conf)upstream daili{ser…

晨曦中,它已勞作:一臺有溫度的機器人如何重塑我們的潔凈日常

清晨六點,城市的輪廓在微光中逐漸清晰。某高端小區的路面上,一臺灰色機身、線條流暢的機器正在安靜地工作。它繞過停靠的車輛,精準地沿著路緣石前進,吸走落葉與塵土,遇到突然竄出的流浪貓時輕巧避讓,仿佛有…

【最新高級版】酷柚易汛生產管理系統v1.2.8 +uniapp全開源+文檔教程

酷柚易汛生產管理系統是基于FastAdminThinkPHPLayuiuniapp開發的生產管理系統,幫助企業數字化轉型,打造智能工廠,專業為生產企業量身開發的一套完整的生產管理系統。主要包含以下模塊:購貨模塊、生產模塊、倉庫模塊、資料模塊&…

40分鐘的Docker實戰攻略

一:什么是Docker (1)基本概念 Docker 是一種開源的 容器化平臺,用于快速構建、部署和運行應用程序。它通過將應用程序及其依賴項打包到輕量級的、可移植的容器中,實現了環境一致性,解決了“在我機器上能運…

qt使用camke時,采用vcpkg工具鏈設置OSG的qt模塊osgQOpenGLWidget

【免費】osgQOpenGLWidget嵌入qt模塊,VS2022使用cmake的方式,工具鏈vcpkg資源-CSDN下載 CMake中設置 1.查找osg相關的庫,同時也會設置對應include的路徑 # 檢查是否找到 osg find_package(OpenSceneGraph 3.6.5REQUIRED COMPONENTS osgosgUtilosgGAosgViewerosgDBosgAnimatio…