시스템 인식을 위한 ToolBox
개시하다
가벼운 시스템 인식용 툴박스를 원하기 때문에 하려고 했으나 실제 활용을 위해 다양한 기능(후술)을 탑재해야 해 제작을 중단했지만, 시스템 인식 학습용으로 좋은 교재가 될 수 있도록 공개하고자 했다.
위에서 말한 바와 같이 칼만 필터를 설계하는 데 있어 시스템 식별도 매우 중요한 준비이다.시스템 식별의 원리 등은 상술한 보도에 있다.
Qt를 사용하여 응용 프로그램을 만들고 있습니다.실행 가능한 파일과 원본 코드는 다음과 같습니다.
https://qiita.com/wcrvt/items/cd1930598ef72055d20b
Mac에서 개발한 것이기 때문에 Mac만 실행할 수 있습니다.Win을 사용하여 소스 파일을 컴파일하는 경우 (FFTW 필요)시스템 인식으로 FFT 코드가 소스에 있으니 그것만 원하시는 분은 가져가세요.
* 이 응용 프로그램에서 실제 측정된 데이터 세트를 사용하는 경우 좋은 모델이 나타날 수 있습니다.도대체 공부용이래.
액션
응용 프로그램을 열면 다음과 같은 화면이 상승합니다.
https://github.com/wcrvt/SystemIdentification
시간 서열의 데이터를 여기에 전달합니다.데이터 형식은 입니다.dat 또는.csv를 읽을 수 있습니다.데이터가 제대로 읽히지 않을 경우 데이터 구분자를 변경하고 Load를 수정한 후 복구하십시오.이번에는 학습용으로 이상적인 조건으로 데이터를 입력하고 관측할 때의 데이터 집합을 제작하여 응용 프로그램에 맡긴다(소스 코드에 데이터 집합을 생성하는 프로그램이 있다).
dataset.pyimport numpy as np
import math
#Time
time=0.0
time_sampling=1e-4
#Motion
position=0
velocity=0
acceleration=0
force=0
#For Intefgration with Tastin Transformation
velocity_z1=0
acceleration_z1=0
#Environment
env_k=3400
env_d=2.35
env_m=1.3
#Input and Sensor
force_ref=0
position_get=0
#simulator
sim_loop=100
#make data set
f=open("b.dat","w")
while time <= 50:
force_ref=10.0*math.sin(5.0*time*time) if time>0.1 else 0.0
force=force_ref+np.random.normal(0.0, 0.001)
for i in range(sim_loop):
#Position
position+=(velocity+velocity_z1)*time_sampling/sim_loop/2.0
velocity_z1=velocity
#Velocity
velocity+=(acceleration+acceleration_z1)*time_sampling/sim_loop/2.0
acceleration_z1=acceleration
#Acceleration
acceleration=(-env_k*position-velocity*env_d+force)/env_m
position_get=position+np.random.normal(0.0, 50e-9)
result = "{:.7f} {:.7f} {:.7f}\n".format(time, force_ref,position_get)
f.write(result)
time+=time_sampling
f.close()
모터로 물체를 누르는 상황을 구상하고 있다.연속 시간의 추진력에서 위치 응답에 대한 전달 함수 $G(s)$입력G(s)=\frac{1}{1.3s^2+2.35s+3400}
의 공장 시뮬레이터가 데이터를 생성했다.스캔 신호를 사용하도록 입력하십시오.이 데이터를 읽으면 시간 파형과 주파수 성분이 자동으로 그려집니다.
그 다음에 Identification의 라벨에 데이터 내의 입력과 출력의 행수를 기입하고 모델의 단계(극과 영점의 수)를 만든 다음에 Identify 단추를 누르면 이산시간 전달 함수, 연속시간 전달 함수, 극, 영점, 안정적 이득, 고유 주파수를 계산한다.
제작된 설비 시뮬레이터와 같은 결과를 얻었다.그리고 맨 아래 도표에는 입력과 출력의 주파수 분량에서 얻은 이득선도와 시스템 식별을 통해 얻은 이득선도가 표시되어 있다.만약 이곳의 파형이 일치한다면 시스템 식별이 성공할 것 같다.
사용 시 주의사항
이 프로그램에서 이루어진 시스템 식별 사용 문장에 기재된 최소 2승법.상술한 바와 같이 저는 PE(Persistent Excitation)성과 티프리츠 행렬의 정정치성을 조금 언급했지만 시스템 식별에서 입력을 선택하는 것이 매우 중요합니다.간단히 말하면 연립 방정식을 풀듯이 여러 주파수의 입력과 출력 관계가 없으면 연립 방정식을 풀 정보가 부족하다.입력할 때 스캔 신호와 M 시리즈 신호를 사용하지만 각각의 특징이 있으니 확인하세요.나는 위상 정보를 보기 위해 자주 스캔 신호를 사용한다.
이외에도 실제 운용에는 아직도 많은 문제점이 있다.
import numpy as np
import math
#Time
time=0.0
time_sampling=1e-4
#Motion
position=0
velocity=0
acceleration=0
force=0
#For Intefgration with Tastin Transformation
velocity_z1=0
acceleration_z1=0
#Environment
env_k=3400
env_d=2.35
env_m=1.3
#Input and Sensor
force_ref=0
position_get=0
#simulator
sim_loop=100
#make data set
f=open("b.dat","w")
while time <= 50:
force_ref=10.0*math.sin(5.0*time*time) if time>0.1 else 0.0
force=force_ref+np.random.normal(0.0, 0.001)
for i in range(sim_loop):
#Position
position+=(velocity+velocity_z1)*time_sampling/sim_loop/2.0
velocity_z1=velocity
#Velocity
velocity+=(acceleration+acceleration_z1)*time_sampling/sim_loop/2.0
acceleration_z1=acceleration
#Acceleration
acceleration=(-env_k*position-velocity*env_d+force)/env_m
position_get=position+np.random.normal(0.0, 50e-9)
result = "{:.7f} {:.7f} {:.7f}\n".format(time, force_ref,position_get)
f.write(result)
time+=time_sampling
f.close()
G(s)=\frac{1}{1.3s^2+2.35s+3400}
Reference
이 문제에 관하여(시스템 인식을 위한 ToolBox), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/wcrvt/items/e9188249a728582f162d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)