Смекни!
smekni.com

Система сканирования и стабилизации изображения (стр. 5 из 5)

Рис 4.2.3 График ошибки углового положения ротора

Теперь найдём значения отклонения положения луча от точки А, в которой он должен находится.

У нас есть формула, которая определяет значение угла поворота ротора, в зависимости от того в какую точку указывает луч:

, где х – координата точки.

Из этой формулы мы можем найти значение х, подставляя в качестве φ значение углового положения платформы в данный момент, а в качестве α – значение реального угла поворота ротора в данный момент:

На рисунке 4.2.4 показан график изменения ошибки. Максимальная ошибка получилась меньше 1мм.


Рис 4.2.4 График отклонения положения луча от точки А

Заключение

В представленной дипломной работе была описана система сканирования и стабилизации изображения.

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

Описаны принципы функционирования данной системы, алгоритм её работы. Проведено моделирование результатов работы системы по описанному алгоритму.

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

Получены результаты работы данных алгоритмов.

Приложение

void CDiplom1Dlg::OnBnClickedStartButton()

{

int iInstallResult;

double ft;

iInstallResult=SetTimer(1, 10, NULL);

if(iInstallResult==FALSE)

{

MessageBox((LPCTSTR)L"Cannot install timer",

(LPCTSTR)L"Error message",

MB_OK+MB_ICONERROR);

}

m_XPrev = m_Graph.left + 5;

m_XPrev2 = m_Graph3.left + 5;

m_YPrev = m_Graph.bottom - 5 * 16 - 2 - 60;

m_YPrev3 = m_Graph3.bottom - 5 * 16 - 2;

m_YPrev4 = m_Graph4.bottom - 5 * 16 - 2;

ft = atan( sin(3.1415926/6)/(4 - cos(3.1415926/6)) );

m_ftPrev = 30;

m_YPrev2 = m_Graph2.bottom - 5 * 16 - 2 + 2 * (unsigned long)floor(ft*57.29578);

OnBnClickedClearButton();

DrawGrid(1);

DrawGrid(2);

DrawGrid(3);

DrawGrid(4);

m_Time = 0;

}

void CDiplom1Dlg::OnTimer(UINT_PTR nIDEvent)

{

double ft,t,t1,ft1,ft2,w,fi,dx;

m_Time += 0.01;

t = m_Time;

t1 = t;

ft = 30 * exp(-0.2*t) * cos(t*(2*3.1415926));

ft1 = - atan( sin(ft * 3.1415926/180)/(4 - cos(ft * 3.1415926/180)) );

w = (- 6 * exp(-0.2*(t-0.01)) * cos((t-0.01)*(2*3.1415926)) -

30 * (2*3.1415926) * exp(-0.2*(t-0.01)) * sin((t-0.01)*(2*3.1415926)) ) * 3.1415926/180;

fi = m_ftPrev * 3.1415926/180 + w / 100;

ft2 = - atan( sin(fi)/(4 - cos(fi)) );

dx = sin(ft * 3.1415926/180) - tan(-ft2) * (4 - cos(ft * 3.1415926/180));

if ((fmod(t,0.0625)<=0.005)||(fmod(t,0.0625)>0.0575))

{

m_XNext = m_XPrev + 1;

m_XNext2 = m_XPrev2 + 1;

m_YNext = m_Graph.bottom - 5 * 16 - 2 - 2*(unsigned long)floor(ft);

m_YNext2 = m_Graph2.bottom - 5 * 16 - 2 - (unsigned long)floor(2*ft2*57.29578);

m_YNext3 = m_Graph3.bottom - 5 * 16 - 2 - (unsigned long)floor(80*(ft1-ft2)*57.29578/0.025);

m_YNext4 = m_Graph4.bottom - 5 * 16 - 2 - (unsigned long)floor(80*1000*dx);

DrawLine();

m_XPrev = m_XNext;

m_XPrev2 = m_XNext2;

m_YPrev = m_YNext;

m_YPrev2 = m_YNext2;

m_YPrev3 = m_YNext3;

m_YPrev4 = m_YNext4;

}

m_ftPrev = ft;

if (m_XNext == m_Graph.left + 245)

OnBnClickedStopButton();

CDialog::OnTimer(nIDEvent);

}

void CDiplom1Dlg::DrawGrid(int numG)

{

unsigned long y_b;

unsigned long y_t;

unsigned long x_l;

unsigned long x_r;

unsigned long x[16],y[11],f[11],s1,s2;

double dx,dy;

int i;

if (numG == 1)

{

y_b = m_Graph.bottom - 2;

y_t = m_Graph.top - 2;

x_l = m_Graph.left + 5;

x_r = m_Graph.right;

}

if (numG == 2)

{

y_b = m_Graph2.bottom - 2;

y_t = m_Graph2.top - 2;

x_l = m_Graph2.left + 5;

x_r = m_Graph2.right;

}

if (numG == 3)

{

y_b = m_Graph3.bottom - 2;

y_t = m_Graph3.top - 2;

x_l = m_Graph3.left + 5;

x_r = m_Graph3.right;

}

if (numG == 4)

{

y_b = m_Graph4.bottom - 2;

y_t = m_Graph4.top - 2;

x_l = m_Graph4.left + 5;

x_r = m_Graph4.right;

}

CClientDC dc(this);

dx = (x_r - x_l) / 15;

dy = (y_b - y_t) / 10;

s1 = floor(dx);

s2 = floor(dy);

COLORREF m_PenColor = RGB(0,0,255);

CPen m_Pen;

m_Pen.CreatePen(2/*PS_SOLID*/, 1, m_PenColor);

dc.SelectObject(&m_Pen);

for (i=0;i<11;i++)

{

x[i] = x_l + i * s1;

y[i] = y_b - i * s2;

}

for (i=11;i<16;i++)

x[i] = x_l + i * s1;

for (i=0;i<11;i++)

{

dc.MoveTo(x[i],y[0]);

dc.LineTo(x[i],y[10]);

dc.MoveTo(x[0],y[i]);

dc.LineTo(x[15],y[i]);

}

for (i=11;i<16;i++)

{

dc.MoveTo(x[i],y[0]);

dc.LineTo(x[i],y[10]);

}

m_Pen.DeleteObject();

m_Pen.CreatePen(PS_SOLID, 1, m_PenColor);

dc.SelectObject(&m_Pen);

dc.MoveTo(x[0],y[0]);

dc.LineTo(x[0],y[10]);

dc.MoveTo(x[0],y[5]);

dc.LineTo(x[15],y[5]);

m_Pen.DeleteObject();

m_ResultsEdit.Format(L"bottom = %d, top = %d, left = %d, right = %d, dx = %d, dy = %d",y_b,y_t,x_l,x_r,s1,s2);

UpdateData(FALSE);

}

void CDiplom1Dlg::DrawLine(void)

{

CClientDC dc(this);

COLORREF m_PenColor = RGB(255,0,0);

CPen m_Pen;

m_Pen.CreatePen(0, 1, m_PenColor);

dc.SelectObject(&m_Pen);

dc.MoveTo(m_XPrev,m_YPrev);

dc.LineTo(m_XNext,m_YNext);

dc.MoveTo(m_XPrev,m_YPrev2);

dc.LineTo(m_XNext,m_YNext2);

dc.MoveTo(m_XPrev2,m_YPrev3);

dc.LineTo(m_XNext2,m_YNext3);

dc.MoveTo(m_XPrev2,m_YPrev4);

dc.LineTo(m_XNext2,m_YNext4);

m_Pen.DeleteObject();

}

списокиспользованнойлитературы

1. Самарский А. А., Михайлов А. П. «Математическое моделирова-

ние: Идеи. Методы. Примеры» Физматлит, 2001 г, 320 с;

2. http://aqua.sm.bmstu.ru/study/student/Library/CoodrSys.htm;

3. Проектирование следящих систем. Колл. авторов. Под ред. Л.В. Рабиновича.М.: Машиностроение, 1969.-500 с.

4. Следящие приводы. В 2-х кн. Под ред. Б.К. Чемоданова.-М.: Энергия, 1976.-384 с., ил.

5. http://ru.wikipedia.org;

6. http://www.optolink.ru;

7. http://www.modem-techno.ru;

8. http://www.skbis.ru.