運動仿真——phased.Platform

在雷達仿真過程中,運動仿真的必要性,以及運動仿真可以實現哪些功能,在matlab對應的user guide中已經講的很清楚了,這里不再贅述。

本文主要介紹phased.Platform的一些“坑”,和典型的用法。

第一坑:系統對象機制

系統對象(system object)在調用的時候,返回當前的狀態值,并計算下一狀態值存儲在系統對象中,直到調用release函數復位。假如仿真的時間步長為T,第一次調用系統對象返回零時刻的狀態值。如果我們想要知道nT時刻的返回值,則需要調用系統對象函數n+1次。

第二坑:InitialVelocity屬性

幫助文檔是這么描述該屬性

![[file-20250324223332955.png]]

紅框中說:當MotionModel設置為VelocityVelocitySource設置為Input port的時候,InitialVelocity起作用。但是問題來了,當VelocitySource設置為Input port的時候,系統對象調用的形式必須滿足[Pos,Vel] = platform(T,V),那么在調用的時候必須還要輸入V參數,可以推斷,第一次調用系統對象時,返回的Vel值應該是Initialvelocity,而輸入參數V則是為了更新下一次數據使用。更新原則為:Pos = Pos + T*VVel = V

驗證代碼如下:

clear;clc;v0 = [1, 2, 3]';
v1 = [2, 3, 4]';
v2 = [3, 4, 5]';rdPlatform = phased.Platform();
rdPlatform.MotionModel = 'Velocity';
rdPlatform.InitialPosition = [0;0;0];
rdPlatform.VelocitySource = 'Input port';
rdPlatform.InitialVelocity = v0;T = 1;% 輸出pos=initialPosition=[0,0,0],vel=[1,2,3],
% 更新vel = [2,3,4]
% 更新pos = initialPosition + T*v1 =[2,3,4]
[pos, vel] = rdPlatform(T, v1)% 輸出pos = [2,3,4]和vel=[2,3,4]
% 更新vel = [3,4,5]
% 更新pos=[2,3,4]+[3,4,5]=[5,7,9]
[pos, vel] = rdPlatform(T, v2)% 輸出pos = [5,7,9]和vel=[1,2,3]
% 更新vel = [1,2,3]
% 更新pos=[5,7,9]+[1,2,3]=[6,9,12]
[pos, vel] = rdPlatform(T, v0)

第三坑:Velocity屬性

每次調用函數的時候,都不需要更新velocity,這是最基本的用法。

![[file-20250323211714998.png]]

由于velocity這個屬性tunable,所以在仿真過程中可以更新velocity的值,。

clear;clc;rdPlatform = phased.Platform();
rdPlatform.MotionModel = 'Velocity';
rdPlatform.InitialPosition = [0;0;0];
rdPlatform.VelocitySource = 'Property';
rdPlatform.Velocity = [10;20;-10];T = 1;[pos, vel] = rdPlatform(T)
rdPlatform.Velocity = [10;10;-10];
[pos, vel] = rdPlatform(T)rdPlatform.Velocity = [0;10;-10];
[pos, vel] = rdPlatform(T)

第四坑:旋轉模式

旋轉模式比較復雜,需要搞清楚兩個問題:1)旋轉什么東西?2)繞著什么旋轉?

首先看旋轉模式的定義:
![[file-20250324230251365.png]]

這里說,在Circulor模式下,沿著平臺方向坐標系中方位指向的順時針方向旋轉,這個說法非常難懂。因此是orientation axes繞著aizmuth direction旋轉。這里出現了第一個問題:orientation axes是如何定義的?azimuth direction如何定義

幫助文檔中關于旋轉模式的解釋還出現在InitialOrientationAxes的定義中:
在這里插入圖片描述
意思是orientation axes(簡稱oa)就是局部坐標系,這解釋了第1個問題的一半疑問。緊接著第2個問題,平臺有transitional和rotational的運動分量,這兩種運動分量是如何影響oa的值

根據系統對象調用的規則:[Pos,Vel,Laxes] = step(___)可以返回局部坐標系,而局部坐標系Laxes定義如下:
file-20250323224914971

可以知道Laxes就是platform orientation axes,也叫platform axes,Laxes是繞著運動軌跡的方向進行旋轉,這句話解釋了第一個問題的后半個問題,aizmuth direction就是運動軌跡的法向量。

總結下,仿真模型中定義了平臺的局部坐標系,該坐標系繞著運動軌跡的法向量旋轉。這里出現了第三個問題,運動軌跡的法向量可能是隨時間變化的,如何描述繞著非固定旋轉軸的旋轉?為了解答這個問題,我對分別只有transitional和rotational運動分量的oa變化做了研究。以下是研究過程是結論。

僅有Transitional運動分量

首先,編寫代碼,可視化oa和當前運動之間的關系。仿真一個平拋運動,仿真代碼如下:

clear;clc;
close all;% 非零初始速度
v = [10; 10; 0];% 初始局部坐標系
initaxes = azelaxes(0, 0);% 仿真時間步長
T = 0.1% 選擇加速運動模式
rdPlatform = phased.Platform(...
'MotionModel','Acceleration', ...
'InitialPosition',[0,0,0]',...
'InitialVelocity',v, ...
'AccelerationSource','Property', ...
'Acceleration',[0,0,-9.8]');% 選擇非旋轉模式
% 初始的局部坐標系設置為initaxes;
rdPlatform.ScanMode = 'None';
rdPlatform.InitialOrientationAxes = initaxes;
rdPlatform.OrientationAxesOutputPort = true;% 創建繪圖窗口
figure;
ha = axes("Parent", gcf);
hold(ha, 'on');
xlabel('x')
ylabel('y')
zlabel('z')% 循環仿真
for i = 1:50 [pos, vel, lax] = rdPlatform(T);xaxes(vel)*transpose(xaxes(v))*initaxeslaxpltax(ha, pos, vel, lax);
endaxis(ha, 'equal')

仿真結果如下:

![[相控陣工具箱/assets/運動仿真——phased.Platform/file-20250325093656820.png]]

可以看出,oa隨著速度矢量的變化而變化。假如每一時刻的速度矢量為 v i v_i vi?,由速度矢量確定的坐標系(我自己寫一個函數,來確定平臺局部坐標系,該函數根據 x x x軸來確定局部坐標系,因此叫xaxes)為 P i P_i Pi?,那么 P i P_i Pi?可以由 P 1 P_1 P1?通過線性變換 T i T_i Ti?得到,寫作

P i = T i × P 1 P_i=T_i\times P_1 Pi?=Ti?×P1?

由此可以得到線性變換為 T i = P i × P 1 T T_i=P_i\times P_1^T Ti?=Pi?×P1T?,假設平臺沒有旋轉運動,那么平臺初始局部坐標系為 L 1 L_1 L1?,第 i i i時刻的局部坐標系 L i L_i Li?就是 L i = T i × L 1 = P i × P 1 T × L 1 L_i=T_i\times L_1=P_i\times P_1^T\times L_1 Li?=Ti?×L1?=Pi?×P1T?×L1?

為了驗證我的結論,可以修改上述代碼的初始速度、加速度矢量為任意值,比較每一次仿真輸出的局部坐標系的值和我們自己計算的局部坐標系的值是否相等。經過我的測試驗證,滿足結論。

僅有Rotational運動分量

在這個模式下,就很容易理解The current platform axes rotate around the normal vector to the path of the platform.。具體含義為:平臺有一個和全局坐標系重合的局部坐標系,在局部坐標系中構建旋轉坐標系,記為 R 1 R_1 R1?。沿著方位角方向旋轉角度 θ \theta θ,就是沿著z軸看向局部坐標系的原點,繞著局部坐標系的z軸,順時針旋轉。那么旋轉變換可以表示為 r o t z ( ? θ ) \rm{rotz}(-\theta) rotz(?θ),那么加旋轉的局部坐標系就是 r o t z ( ? θ ) × R 1 \rm{rotz}(-\theta)\times R_1 rotz(?θ)×R1?

另外還有一個參數是InitialScanAngle,該參數決定了初始角度。由于我們已經定義了和全局坐標系重合局部坐標系,那么考慮初始角度 r o t z ( ? θ ) × r o t z ( i n i t A n g ) × R 1 \rm{rotz}(-\theta)\times \rm{rotz}(initAng)\times R_1 rotz(?θ)×rotz(initAng)×R1?

用代碼實現如下:

clear;clc;close all;% 初始速度為零
v = [0; 0; 0];T = 1;% 初始orientation axes
initOA = azelaxes(0, 10);% 初始旋轉角度
initAng = 90;% 掃描速度為10deg/sec
scanrate = 45;% 無加速度
rdPlatform = phased.Platform(...
'MotionModel','Acceleration', ...
'InitialPosition',[0,0,0]',...
'InitialVelocity',v, ...
'AccelerationSource','Property', ...
'Acceleration',[0, 0, 0]');% 圓周掃描,初始掃描角度為45deg。
rdPlatform.ScanMode = 'Circular';
rdPlatform.InitialScanAngle = initAng;
rdPlatform.AzimuthScanRate = scanrate;
rdPlatform.InitialOrientationAxes = initOA;
rdPlatform.OrientationAxesOutputPort = true;figure;
ha = axes("Parent", gcf);
hold(ha, 'on');
xlabel('x')
ylabel('y')
zlabel('z')for i = 1:3[pos, vel, lax] = rdPlatform(T);rotz(-scanrate*(i-1)*T) * rotz(initAng) * initOAlaxpltax(ha, pos, vel, lax);
endaxis(ha, 'equal')

仿真結果如下,可以看出仿真結果和我的猜想一致。

在這里插入圖片描述

含有Transitional和Rotational運動分量

包含平動和轉動的運動狀態,該狀態下返回的Laxes值目前機理還不清楚,待討論。

附件

function lax = xaxes(x)x = x / norm(x);
% define vector v in x-y plane of global coordinate system
v = [0; 0; 1];
% compute y;
y = cross(v, x);
y = y / norm(y);
% compute z;
z = cross(x, y);
% construct local axes;
lax = [x, y, z];
end
function pltax(ha, pos, vel, ax)vel = vel / norm(vel);
scatter3(ha, pos(1), pos(2), pos(3), 'k');
quiver3(ha, pos(1), pos(2), pos(3), vel(1), vel(2), vel(3), 'k', 'MaxHeadSize', 2, 'AutoScale', 'off');
quiver3(ha, pos(1), pos(2), pos(3), ax(1, 1), ax(2, 1), ax(3, 1), 'b', 'MaxHeadSize', 2, 'AutoScale', 'off');
quiver3(ha, pos(1), pos(2), pos(3), ax(1, 2), ax(2, 2), ax(3, 2), 'r', 'MaxHeadSize', 2, 'AutoScale', 'off');
quiver3(ha, pos(1), pos(2), pos(3), ax(1, 3), ax(2, 3), ax(3, 3), 'r', 'MaxHeadSize', 2, 'AutoScale', 'off');end

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

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

相關文章

緩存刪除三級補償方案:延遲隊列+消息隊列+定時任務兜底

問題背景: 在 Cache-Aside 模式中,更新數據庫后刪除緩存失敗會導致數據不一致。本文提供工業級三級補償方案,實現最終一致性保障。 整體架構: 更新操作觸發 → 一級延遲隊列 → 二級消息隊列 → 三級定時任務方案實現: 一、第一級補償:延遲隊…

從零開始實現 C++ TinyWebServer 數據庫連接池 SqlConnectPool詳解

文章目錄 數據庫連接池是什么?Web Server 中為什么需要數據庫連接池?SqlConnectPool 成員變量實現 Init() 函數實現 ClosePool() 函數SqlConnectRAII 類SqlConnectPool 代碼SqlConnectPool 測試 從零開始實現 C TinyWebServer 項目總覽 項目源碼 數據庫連…

C++題目

1、內存管理 1.內存模型 棧:在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。 堆:就是那些由new分配的內存塊,其釋放由程序員控制(一個new對應一個delete&#xff09…

天地圖InfoWindow插入React自定義組件

截至2025年03月21日天地圖的Marker不支持添加Label; 同時Label和Icon是不支持自定義HTMLElement只支持String;目前只有InfoWindow支持自定義HTMLElement; 效果圖 React核心api import ReactDOM from react-dom/client const content document.createElement(div);…

Java并發編程面試匯總

Java并發編程 一、 基礎概念1. 進程與線程的區別是什么?2. 創建線程的幾種方式?3. 線程的生命周期(狀態)有哪些?4. 什么是守護線程(Daemon Thread)?5. 線程優先級(Priori…

【STM32】第一個工程的創建

目錄 1、獲取 KEIL5 安裝包2、開始安裝 KEIL52.1、 激活2.2、安裝DFP庫 3、工程創建4、搭建框架5、開始編寫代碼 1、獲取 KEIL5 安裝包 要想獲得 KEIL5 的安裝包,在百度里面搜索“KEIL5 下載”即可找到很多網友提供的下載文件,或者到 KEIL 的官網下載&a…

動態規劃~01背包問題

01背包問題 經典的0 - 1背包問題的解決方案。 二維數組的版本 代碼功能概述 0 - 1背包問題指的是有 n 個物品和一個容量為 m 的背包,每個物品有對應的體積 v[i] 和價值 w[i],需要從這些物品里挑選若干個放入背包,讓背包內物品的總價值達到最…

深入理解Java享元模式及其線程安全實踐

引言 在軟件系統中,當需要處理海量細粒度對象時,直接創建大量實例可能會導致內存消耗激增和性能下降。享元模式(Flyweight Pattern)通過共享對象內部狀態,成為解決這類問題的經典方案。然而在多線程環境下&#xff0c…

1、mysql基礎篇--概述

關系型數據庫(RDBMS) 概念特點:數據模型: 概念 建立在關系模型基礎上,有多張表相互連接的二維表組成的數據庫 特點: 1、使用表存儲,格式統一,便于維護 2、使用sql語言操作&#…

如何提升庫存系統的高并發和穩定性:算法與設計模式

庫存系統是企業運營的核心模塊,尤其是在電商、零售和供應鏈管理中,系統的高并發和穩定性直接影響訂單處理的準確性和效率。面對海量訂單、復雜的庫存管理需求,如何在高并發環境下確保庫存數據的準確性和系統的穩定性?本文將從架構…

【多線程】synchronized底層實現的方式

前言 在java 開發中對于鎖的應用非常的常見,如果對于什么時候該用什么鎖,以及鎖實現的原理有所不知道的,或者面試過程中面試官問你不知道怎么回答的,歡迎來看下面的文章 1、synchronized和ReentrantLock的區別 2、synchronized的…

Pytorch中Tensorboard的學習

1、Tensorboard介紹 TensorBoard 是 TensorFlow 開發的一個可視化工具,用于幫助用戶理解和調試機器學習模型的訓練過程。盡管它最初是為 TensorFlow 設計的,但通過 PyTorch 的 torch.utils.tensorboard 模塊,PyTorch 用戶也可以方便地使用 Te…

ETL 自動化:提升數據處理效率與準確性的核心驅動力

在數字化轉型的浪潮中,數據已成為企業戰略資產,高效處理數據的能力直接關系到企業的競爭力。ETL(Extract, Transform, Load)自動化作為數據處理領域的關鍵技術,正逐漸成為企業在數據時代脫穎而出、實現高效運營與精準決…

std::endl為什么C++ 智能提示是函數?

在使用vscode 的C智能提示后&#xff0c;輸入endl 后&#xff0c;提示的卻是std::endl(basic_ostream<CharT, Traits> &os), 感覺比較奇怪&#xff0c;各種代碼里都是直接用的std::endl 啊&#xff0c; 這里怎么變成函數了呢&#xff1f; 在 C 中&#xff0c;std::en…

簡潔、實用、無插件和更安全為特點的WordPress主題

簡站WordPress主題是一款以簡潔、實用、無插件和更安全為特點的WordPress主題&#xff0c;自2013年創立以來&#xff0c;憑借其設計理念和功能優勢&#xff0c;深受用戶喜愛。以下是對簡站WordPress主題的詳細介紹&#xff1a; 1. 設計理念 簡站WordPress主題的核心理念是“崇…

數據結構篇:空間復雜度和時間復雜度

目錄 1.前言&#xff1a; 1.1 學習感悟 1.2 數據結構的學習之路(初階) 2.什么是數據結構和算法 2.1 數據結構和算法的關系 2.2 算法的重要性 2.3 如何衡量算法的好壞 3.時間復雜度 3.1 時間復雜度的概念 3.2 大O的漸進表示法 O() 4.空間復雜度 5. 常見的時間復雜度和…

node-ddk,electron,截屏封裝(js-web-screen-shot)

node-ddk 截屏封裝(js-web-screen-shot) https://blog.csdn.net/eli960/article/details/146207062 也可以下載demo直接演示 http://linuxmail.cn/go#node-ddk 感謝/第三方 本截屏工具, 使用的是: js-web-screen-shot https://www.npmjs.com/package/vue-web-screen-shot…

泰坦軍團攜手順網旗下電競連鎖品牌樹呆熊 共創電競新紀元

在電競行業的浪潮中&#xff0c;品牌之間的戰略合作愈發成為推動市場前行的重要動力。最近&#xff0c;電競顯示器領域領軍品牌泰坦軍團高層領導出席順網旗下電競連鎖品牌樹呆熊十周年盛典。會議現場&#xff0c;雙方高層領導宣布泰坦軍團與樹呆熊正式達成戰略合作伙伴關系。 在…

HandyJSON原理

HandyJSON 的優勢 JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式, 應用廣泛. 在 App 的使用過程中, 服務端給移動端發送的大部分都是 JSON 數據, 移動端需要解析數據才能做進一步的處理. 在解析JSON數據這一塊, 目前 Swift 中流行的框架基本上是 SwiftyJSON, …

信號的產生和保存

信號的產生 信號就是操作系統對用戶操作做出的反應&#xff0c;但它的本質就是往操作系統寫入信號&#xff0c;這是由操作系統的結構決定的。通過修改比特位來告訴操作系統接收信號和傳了幾號信號。 也正是因為我們身為用戶無法親自修改內核數據&#xff0c;所以我們需要通過操…