admin
 admin

ВИД ИЗ КОМАНДНОЙ РУБКИ

Под видом из рубки откладываются заданное пользователем отстоянние от дна (профиль дна меняется) и то расстояние, на котором находится управляемая линейным регулятором субмарина: график перемещения выводится периодически. Субмарина виртуальная, но компьютер моделирующий ее динамику на ответном конце "провода" вполне реальный. В этом смысле это полунатурный стенд, управляемый пользователями (глубиной). Скорость обмена невысока – запрос на управление проверяется раз в 5 минут, чтобы не "утомлять" сервер.

Система отлажена студентами и успешно работает на протяжении нескольких лет. Один из студентов "приживил" в виртуальном океане осьминога.

Время можно сократить, но зачем? Вспомним марсоход, там то же самое, задержка входит в концепцию моделирования. Собственно, аналогично может быть построен виртуальный роботрек на Марсе. Откладываемая на сервере траектория служит доступными вам исходными данными, например, для решения задач параметрической индентификации моделей динамики (аппроксимации, интерполяции) при помощи исполняемых в сети алгоритмов. Это серьезное поприще и реальный роботрек. Для справки ниже – алгоритм командной части (пульта управления).


% THE VIRTUAL OCEAN, 
% Submarine calls server every 5 minutes,
% Command: 10-200 meters above the bottom, 

% SUBMARINE REAL TIME CONTROL, 
 
hello, folder(orangery), 

s=InitSample(),  
if floor(tick/5)*5=tick, 
% TAKE SUBMARINE SERVER DATA,
F=readSample('sample'), 
if floor(tick/50)*50=tick, % GRAPH,
V=[H Y], V={-V}, if tick=0, HY={V}, else,  
tr(HY), HY={[HY V]}, tr(HY), bar(HY:G), end, end, 
end, 

Distance=receive('command'), 
Distance=?,  DEL=H-Y, DEL=?,  tick=?,

if clock(1)>8, SHW=0, %DAY-NIGHT,
newFG(B 'bubblez.gif' 'floor.gif' 436 119), 
if floor(clock(2)/5)*5=clock(2),
newFG(B 'octopus.gif' clock(3)*3 clock(3)*1.75),
else, newFG(B 'octopus.gif' 0 0), end,  
moveYat(B 120+0.3*(H-Y)+4*s), show(B), 
else,
newFG(B 'floor.gif' 'bubblez.gif' 436 303),
newFG(B 'octopus.gif' 0 0), moveYat(B 0), 
if SHW<>1, show(B), SHW=1, end,
end, 

ticker(2000),

% ALGORITHM LIBRARY,

function: InitSample,
if tick=0, SHW=0,
B=Bottom(), I=1, MaxI=1, MX=0, 
end, s=rand(1), return s, end, 

function: Bottom(),
B=iniFG(0 '#113359' 0 0), 
addFG(B 'T' 'floor.gif' [0 436] [0 119]),
addFG(B 'T' 'octopus.gif' [250 142] [10 52]),
addFG(B 'F' 'window.gif' [0 436] [0 303]),
moveYat(B 270),
return B, 
end,

function: readSample(file),
% GET DATA MATRIX MX,
% MaxI - max of points, % I - point,
if I<MaxI, F=1, X={MX[I]}, I=I+1, else, 
norm1=norm(MX), MX=receive(file), 
norm2=norm(MX), F=abs(norm1-norm2),
% FLAG of NEW DATA F>0,
if F>0, I=1, MaxI=1,
if rows(MX)*cols(MX)=5, X={MX}, else, 
MaxI=rows(MX), tr(MX), X={MX[0]}, end, end, end,
% GET INFORMATION STRING, 
% X=[u X1 X2 Y H] Z=[u X1 X2], % X=?,
if F>0, Y=X[3], H=X[4], Z=block(X 0 2), end,
return F,
end,

 admin

ВИРТУАЛЬНАЯ СУБМАРИНА

Abstract. Submarine calls server every 5 minutes and takes command: to be 10-200 meters above the bottom. Model: Y=A1*X1+A2*X2+b*u, where Y - the deep of submarine, H - the deep of bottom, X1, X2 - a state space (Frobenius Form), u - control. Submarine sends matrix MX, it consists rows X=[u X1 X2 Y H].

Подводная лодка посылает данные на сервер каждые 5 минут ("облегченный трафик") и в этот момент принимает команду на заданное отстояние от дна: 10-200 метров над дном. Ее математическая модель: Y=A1*X1+A2*X2+b*u, где Y - глубина погружения субмарины, H - глубина дна, X1, X2 - вектор состояния (Фробениусова форма), u - управление. Принимаемая с сервера матрица MX содержит строчки X=[u X1 X2 Y H]. Этого достаточно, чтобы визуализировать субмарину и вывести, помимо задания, реальное отстояние до дна и номер тика таймера.

ИДЕНТИФИКАЦИЯ ПАРАМЕТРОВ СУБМАРИНЫ

Алгоритмы идентификации параметров модели субмарины оставлены здесь для справки, разобраться в них сможет только специалист по динамике и адаптивным системам, см. "новый курс теории управления" на сервере.

Real Time Experiments. The first experiment realises the animation of ocean during the submarine walks (with day/night segmentation). The second one demonstrates LSM algorithms of identification: to get vector A=[b A1 A2] by equations Y=A'Z, Z=[u X1 X2].

 admin

% IDENTIFICATION

% DIGITAL MODEL IS Y=A1*X1+A2*X2+b*u,
% WHERE X=[X1 X2] is A STATE SPACE VECTOR,
% Y IS VERTICAL COORDINATE & u IS CONTROL,
% A IS A[0]=b=0.1 A[1]=A1=1.7 A[2]=A2=-0.7, 
 
folder(orangery), s=InitSample(),
if floor(tick/5)*5=tick, 
F=readSample('sample'), if F>0,
r=0, alg=1, % IDENTIFICATION  ALGORITHM,
if alg=0, if tick=0, % Y=A'Z,
A=InitZLSM(Z), else, A=ZLSM(Y Z), r=rank(P), end, 
else, if tick=0, 
A=InitRLSM(Z), else, A=RLSM(Y Z), end, end, 
end, end, 

A=?, r=?, 

% DRAW OCEAN AND SUBMARINE, 
moveYat(B 40+H), moveYat(S 40+Y+5*s), show(B S),

ticker(1000), tick=?, 

% LIBRARY,

function: InitSample,
if tick=0, S=submarine(), B=bottom(), 
I=1, MaxI=1, MX=0, end, 
Distance=receive('command'), Distance=?, 
s=rand(1), return s, end, 

function: readSample(file),
% GET DATA MATRIX MX,
% MaxI - max of points, % I - point,
if I<MaxI, F=1, X={MX[I]}, I=I+1, else, 
norm1=norm(MX), MX=receive(file), 
norm2=norm(MX), F=abs(norm1-norm2),
% FLAG of NEW DATA F>0,
if F>0, I=1, MaxI=1,
if rows(MX)*cols(MX)=5, X={MX}, else, 
MaxI=rows(MX), tr(MX), X={MX[0]}, end, end, end,
% GET INFORMATION STRING, 
% X=[u X1 X2 Y H] Z=[u X1 X2], % X=?,
if F>0, Y=X[3], H=X[4], Z=block(X 0 2), end,
return F,
end, 

% LIBRARY LSM,

function: InitZLSM(Z),
var n, n=rows(Z), 
P=zeros(n), R=zero(n), A={R}, 
return A, 
end, 

function: ZLSM(Y Z),
P=res(P+Z*Z), R=res(R+Y*Z), A={P\R}, 
return A, 
end,

function: InitRLSM(Z),
var n, n=rows(Z), 
P=eye(n), R=zero(n), P={100*P}, A={R}, 
return A, 
end,

function: RLSM(Y Z), 
var L T k e, L={P*Z}, k={Z'*L}, k=1+k, T={L/k}, 
P=res(P-L*T), e={A'*Z}, e=Y-e, e={e/k}, 
A=res(A+e*L), 
return A,
end,

% TOOLBOX SEA,

function: submarine(),
Z=iniFG('submarine.gif' 32 27),
moveXat(Z 200), moveYat(Z 100),
return Z, 
end,

function: bottom(),
Z=iniFG(0 '#aaddff' 0 0),
% WATER,
addFG(Z 'F' 'F' '#0077bb' [0 0 436 436] [47 300 300 47]), 
% SAND,
addFG(Z 'F' 'F' '#ffaa00' [0 0 436 436] [240 300 300 240]), 
% BUBBLES,
addFG(Z 'F' 'bubbles.gif' [220 64] [120 64]),
% BOTTOM,
addFG(Z 'T' 'F' '#997722' [-9 -9 9 9] [-1 0 0 1]), 
moveXat(Z 215), moveYat(Z 270),
return Z, 
end,

 admin

% THE VIRTUAL OCEAN (VERSION 1), 
% Submarine calls server every 5 minutes,
% Command: 10-200 meters above the bottom, 

% SUBMARINE REAL TIME CONTROL, 

 folder(orangery), 

s=InitSample(),  
if floor(tick/5)*5=tick, 
% TAKE SUBMARINE SERVER DATA,
F=readSample('sample'), 

if floor(tick/50)*50=tick, % GRAPH,
V=[H Y], V={-V}, if tick=0, HY={V}, else,  
tr(HY), HY={[HY V]}, tr(HY), bar(HY:G), end, end, 
end, 

Distance=receive('command'), 
Distance=?,  DEL=H-Y, DEL=?,  tick=?,  

if clock(1)>8,  %DAY-NIGHT,
newFG(B 'bubblez.gif' 'ocean.gif'), 
newFG(B 'bottomnight.gif' 'bottom.gif'), else,
newFG(B 'ocean.gif' 'bubblez.gif'), 
newFG(B 'bottom.gif' 'bottomnight.gif'), end, 
moveYat(B 80+0.3*(H-Y)+4*s), 

if floor(clock(2)/5)*5=clock(2),
newFG(B 'octopus.gif' clock(3)*3 clock(3)*1.75),
else, newFG(B 'octopus.gif' 0 0), end,

show(B), ticker(2000), 

% ALGORITHM LIBRARY,

function: InitSample,
if tick=0, B=Bottom(), I=1, MaxI=1, MX=0, 
end, s=rand(1), return s, end, 

function: Bottom(),
Z=iniFG(0 '#aaddff' 0 0), 
addFG(Z 'F' 'ocean.gif' [0 436] [0 303]),
addFG(Z 'bottom.gif' [0 436] [0 155]),
addFG(Z 'octopus.gif' [250 142] [50 52]),
addFG(Z 'F' 'window.gif' [0 436] [0 303]),
moveYat(Z 270),
return Z, 
end,

function: readSample(file),
% GET DATA MATRIX MX,
% MaxI - max of points, % I - point,
if I<MaxI, F=1, X={MX[I]}, I=I+1, else, 
norm1=norm(MX), MX=receive(file), 
norm2=norm(MX), F=abs(norm1-norm2),
% FLAG of NEW DATA F>0,
if F>0, I=1, MaxI=1,
if rows(MX)*cols(MX)=5, X={MX}, else, 
MaxI=rows(MX), tr(MX), X={MX[0]}, end, end, end,
% GET INFORMATION STRING, 
% X=[u X1 X2 Y H] Z=[u X1 X2], % X=?,
if F>0, Y=X[3], H=X[4], Z=block(X 0 2), end,
return F,
end,



Rambler's Top100