Вам нужнадипломная работа?
Интересует Программирование?
Оставьте заявку
на Дипломную работу
Получите бесплатную
консультацию по
написанию
Сделайте заказ и
скачайте
результат на сайте
1
2
3

Цифровая система управления движением легкого автомобиля по заданным координатам.

  • 75 страниц
  • 15 источников
  • Добавлена 17.09.2021
6 930 руб.7 700 руб.
  • Содержание
  • Часть работы
  • Список литературы
СОДЕРЖАНИЕ
АННОТАЦИЯ 6
ВВЕДЕНИЕ 7
1 Анализ современного состояния вопроса 9
1.1 Обзор литературных источников по теме исследования 9
1.2 Характеристика объекта управления 11
1.3 Постановка цели и задачи работы 12
2 Математическое моделирование динамики движения транспортного средства по заданным координатам 13
2.1 Кинематическая модель 13
2.2 Динамическая модель 15
2.3 Линеаризация модели 23
3 Компьютерное моделирование динамики движения транспортного средства по заданным координатам 24
3.1 Разработка структуры и алгоритма регулятора скорости 24
3.2 Разработка структуры и алгоритма регуляторов угла поворота 28
3.2.1 Работа модели без регулятора скорости 28
3.2.2 Работа модели с непрерывным регулятором скорости 31
3.3 Разработка структуры и алгоритма регулятора угла поворота 34
3.3.1 Работа модели без регулятора угла поворота 34
3.3.2 Работа модели с непрерывным регулятором угла поворота 35
3.4 Синтез цифровой МСУ 37
4 Аппаратная реализация микропроцессорной системы управления 42
4.1 Микроконтроллеры и микропроцессорные комплекты для системы управления роботами 42
4.2 Анализ и выбор методов распознавания 44
4.3 Выбор элементов технического зрения 51
5 Экономическая часть 54
5.1 Резюме 54
5.2 План производства 54
5.3 Организационный план 55
5.4 Расчет себестоимости и договорной цены 57
5.5 Обоснование экономической целесообразности проекта 61
ЗАКЛЮЧЕНИЕ 64
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 65
ПРИЛОЖЕНИЕ А. Программный код цифровой системы управления 67
ПРИЛОЖЕНИЕ Б. Структурная схема управления скорость АКР 78
ПРИЛОЖЕНИЕ В. Алгоритм управления скорость АКР 79
ПРИЛОЖЕНИЕ Г. Алгоритм управления углом поворота АКР 80
ПРИЛОЖЕНИЕ Д. Результаты моделирования управления скоростью АКР 81
ПРИЛОЖЕНИЕ Е. Результаты моделирования управления углом поворота АКР 82




Фрагмент для ознакомления

Таблица 5.5 – Калькуляция себестоимости изделияСтатьи затратЗатраты на единицу, тыс.р.ОбоснованиеПеременные затраты1.Материальные затраты6749.35По данным предприятия2.Основная заработная плата производственных рабочих215.667По данным предприятия3.Дополнительная заработанная плата производственных рабочих43.13320% от п.24.Отчисления на социальные нужды78.15730.2% от п.2и п.3Постоянные затраты5. Накладные расходы431.334200% от осн. З.п.6. Амортизация250Итого полная себестоимость Сп7767.641Для расчета отпускной цены готового изделия возьмем ставку 25%, с учетом компенсации удорожания производства, тогда плановая цена реализации составит: 9709,55руб.5.5 Обоснование экономической целесообразности проектаПервоначальный оборотный капитал необходим для запуска проекта. Когда проект еще не «продвинут» и не переведен на самофинансирование, потребность в начальных оборотных средствах рассматривается как потребность в инвестициях. Чтобы упростить выпускной проект, потребность в начальном оборотном капитале можно принять равной годовым операционным затратам (общий операционный бюджет проекта).Наиболее распространенным критерием эффективности инвестиций в мировой практике является чистая приведенная стоимость проекта (чистая приведенная стоимость –NVP), которая представляет собой приведенную стоимость будущих проектов денежных средств, генерируемых инвестиционным проектом в течение жизненного цикла (жизненного цикла) проекта:где,t – количество интервалов жизни проекта;T – срок жизни проекта;Dt – чистый денежный поток в t – году ;i – ставка дисконта.Реальная годовая ставка сравнения iкак правило может составить в размере 10%. Результаты расчета эффективности по критерию NPVприведены в таблице 5.6. Годовые продажи составят:Годовые эксплуатационные расходы:Годовая чистая прибыль:Если предположить, что для запуска проекта требуется 12% операционных затрат, тогда:Представим сумму инвестиционных затрат в основной капитал в размере:Тогда общие инвестиционные затраты составят:Если мы предположим, что жизненный цикл товара составляет 4 года и в течение этого периода необходимо возместить инвестору стоимость инвестиционных затрат в основные средства (20 млн руб.), То ежегодные амортизационные отчисления составят 4 млн руб./год при равномерной амортизации.Таблица 5.6 – Расчет чистой приведенной стоимости будущих денежных потоков от проектаПоказателиИнтервал планирования, год01231. Годовой объем продаж, млн. рублей97.09597.09597.0952. Инвестиционные затраты, млн. рублей-29.3213. Годовые эксплуатационные расходы, млн. рублей77.67677.67677.6764. Валовая прибыль, млн. рублей19.41919.41919.4195. Налог на прибыль, млн рублей3.8343.8343.8346. Чистая прибыль, млн. рублей15.53515.53515.5357. Амортизация, млн рублей4448.Чистый денежный поток, млн. рублей-29.32119.53519.53519.5359. Дисконтный множитель (i=0.1)10.910.830.7610. Приведенный поток денежных средств , млн. рублей-29.32117.77616.80014.84711. Чистая приведенная стоимость будущих потоков денежных средств NPV, тысяч рублей-29.321-11.5455.25520.102Из таблицы 5.6 мы можем видеть, что проект за жизненный цикл, 4 года, обеспечил миллионов рублей, что говорит об экономической целесообразности проекта.ЗАКЛЮЧЕНИЕВ соответствии с поставленной целью, в рамках выпускной квалификационной работы была разработана и исследована цифровая система управления легкового автомобиля по заданным координатам в городской среде. В ходе работы были решены следующие задачи: 1. составлены структурная и функциональные схемы системы управления скоростью и углом поворота; 2. выполнено математическое описание и проведено имитационное моделирование на ЭВМ прямолинейного движения автомобильного робота; 3. выполнено математическое описание и проведено компьютерное моделирование процесса разгона без регулятора и с ПИД-регулятором; 4. разработана структура и алгоритм управления скоростью и углом поворота автомобильного робота; 5. синтезирован непрерывный и цифровой регулятор системы управления скоростью и углом поворотаавтомобильного робота; 6. сгенерирован С – код цифрового регулятора скоростью и углом поворота.СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ1. Зенкевич, С.Л., Назарова, А.В. Система управления мобильного колесного робота// Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2006. №3 51.2. Караваев Ю. Л., Трефилов С. А. Дискретный алгоритм управления по отклонению мобильным роботом сомниколесами // Нелинейная динамика. 2013. Т. 9, № 1. С. 91—100.3. ВласовС.М.,БойковВ.И.,БыстровС.В.,ГригорьевВ.В.Бесконтактныесредства локальной ориентации роботов. — СПб: Университет ИТМО, 2017.—169с.4. Красовский А. А. Справочник по теории автоматического управления. М.: Наука, 1987. 712 с.5. Официальный сайт Raspberry Pi: электронный ресурс: 6. Мартыненко, Ю.Г. Управление движением колесных роботов// Ю. Г. Мартыненко, изд-во МГУ, 2005 г. – 52 с. 7. В.Н. Белотелов, А. А. Голован, А.А. Гришин, Д. Н. Жихарев, А. В. Ленский, В. Б. Пахомов. Математические модели и алгоритмы управления движением мобильного робота// изд-во МГУ, 2001 г. – 32 с. 8. Мартыненко, Ю. Г. Динамика мобильныхроботов// Советский образовательный журнал Т6 №5. – М., 2000. – С. 107–123.9. Девянин, Е. А. О движении колесных роботов // Труды конф. “Мобильныероботы и мехатронные системы”. – М., 1998. – С. 169–200.10. Леонов Д.С. Управление мобильным роботом в условиях проскальзывания колес// Д.С. Ленов. – Спб: 2020 г. – 17 с.11. Евстигнеев М. И., Литвинов Ю. В., Мазулина В. В., Мищенко Г. М.Алгоритмыуправления четырехколесным роботом при движении по пересеченной местности // Изв. вузов. Приборостроение. 2015. Т. 58, № 9. С. 738—741.12. Епифанов Р. Ю. Управление движением мобильной колесной платформы2017 г. – 18 с.13. К.Ю. Котов, А.С. Мальцев, М.А. Соболев, М.Н. Филиппов. Использование локальной системы технического зрения для оценки координат мобильного робота. Институт автоматики и электрометрии СО РАН, г. Новосибирск.14. Золотухин Ю.Н., Котов К.Ю., Мальцев А.С., Нестеров А.А. Управление траекторным движением группы мобильных роботов: моделирование иэксперимент // В кн. Материалы Х Международной конференции “Актуальные проблемы электронного приборостроения (АПЭП-2010)”, Новосибирск, с. 101-106, Россия: 2010. 15. Е.А. Девятериков, Б.Б. Михайлов. Система управления движение мобильного робота с визуальным одометром// Экспериментальная робототехника, 2008 г. – 6 с.ПРИЛОЖЕНИЕАПрограммный код цифровой системы управленияЛистинг 1. Код модели управления скоростью/* * File: DiscretSpeed.c * * Code generated for Simulink model 'DiscretSpeed'. * * Model version : 1.15 * Simulink Coder version : 8.9 (R2015b) 13-Aug-2015 * C/C++ source code generated on : Wed Jun 09 10:38:38 2021 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: * 1. Execution efficiency * 2. RAM efficiency * Validation result: Not run */#include "DiscretSpeed.h"/* Private macros used by the generated code to access rtModel */#ifndef rtmIsMajorTimeStep# define rtmIsMajorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MAJOR_TIME_STEP)#endif#ifndef rtmIsMinorTimeStep# define rtmIsMinorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MINOR_TIME_STEP)#endif#ifndef rtmGetTPtr# define rtmGetTPtr(rtm) ((rtm)->Timing.t)#endif#ifndef rtmSetTPtr# define rtmSetTPtr(rtm, val) ((rtm)->Timing.t = (val))#endif/* Continuous states */X rtX;/* Block signals and states (auto storage) */DW rtDW;/* Real-time model */RT_MODEL rtM_;RT_MODEL *const rtM = &rtM_;extern real_T rt_roundd(real_T u);/* private model entry point functions */extern void DiscretSpeed_derivatives(void);/* * This function updates continuous states using the ODE3 fixed-step * solver algorithm */static void rt_ertODEUpdateContinuousStates(RTWSolverInfo *si ){ /* Solver Matrices */ static const real_T rt_ODE3_A[3] = { 1.0/2.0, 3.0/4.0, 1.0 }; static const real_T rt_ODE3_B[3][3] = { { 1.0/2.0, 0.0, 0.0 }, { 0.0, 3.0/4.0, 0.0 }, { 2.0/9.0, 1.0/3.0, 4.0/9.0 } }; time_T t = rtsiGetT(si); time_T tnew = rtsiGetSolverStopTime(si); time_T h = rtsiGetStepSize(si); real_T *x = rtsiGetContStates(si); ODE3_IntgData *id = (ODE3_IntgData *)rtsiGetSolverData(si); real_T *y = id->y; real_T *f0 = id->f[0]; real_T *f1 = id->f[1]; real_T *f2 = id->f[2]; real_T hB[3]; int_T i; int_T nXc = 2; rtsiSetSimTimeStep(si,MINOR_TIME_STEP); /* Save the state values at time t in y, we'll use x as ynew. */ (void) memcpy(y, x, (uint_T)nXc*sizeof(real_T)); /* Assumes that rtsiSetT and ModelOutputs are up-to-date */ /* f0 = f(t,y) */ rtsiSetdX(si, f0); DiscretSpeed_derivatives(); /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */ hB[0] = h * rt_ODE3_B[0][0]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0]); } rtsiSetT(si, t + h*rt_ODE3_A[0]); rtsiSetdX(si, f1); DiscretSpeed_step(); DiscretSpeed_derivatives(); /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */ for (i = 0; i <= 1; i++) { hB[i] = h * rt_ODE3_B[1][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]); } rtsiSetT(si, t + h*rt_ODE3_A[1]); rtsiSetdX(si, f2); DiscretSpeed_step(); DiscretSpeed_derivatives(); /* tnew = t + hA(3); ynew = y + f*hB(:,3); */ for (i = 0; i <= 2; i++) { hB[i] = h * rt_ODE3_B[2][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]); } rtsiSetT(si, tnew); rtsiSetSimTimeStep(si,MAJOR_TIME_STEP);}real_T rt_roundd(real_T u){ real_T y; if (fabs(u) < 4.503599627370496E+15) { if (u >= 0.5) { y = floor(u + 0.5); } else if (u > -0.5) { y = 0.0; } else { y = ceil(u - 0.5); } } else { y = u; } return y;}/* Model step function */void DiscretSpeed_step(void){ /* local block i/o variables */ real_T rtb_FilterCoefficient; real_T rtb_IntegralGain; real_T rtb_TransferFcn1; real_T rtb_Quantizer; if (rtmIsMajorTimeStep(rtM)) { /* set solver stop time */ rtsiSetSolverStopTime(&rtM->solverInfo,((rtM->Timing.clockTick0+1)* rtM->Timing.stepSize0)); } /* end MajorTimeStep */ /* Update absolute time of base rate at minor time step */ if (rtmIsMinorTimeStep(rtM)) { rtM->Timing.t[0] = rtsiGetT(&rtM->solverInfo); } /* TransferFcn: '<Root>/Transfer Fcn1' */ rtb_TransferFcn1 = 0.003444451333347111 * rtX.TransferFcn1_CSTATE; if (rtmIsMajorTimeStep(rtM)) { /* Step: '<Root>/Step' */ if (rtM->Timing.t[0] < 0.0) { rtb_Quantizer = 0.0; } else { rtb_Quantizer = 29.163; } /* End of Step: '<Root>/Step' */ /* Quantizer: '<Root>/Quantizer' incorporates: * Gain: '<Root>/Gain1' * Gain: '<Root>/Gain2' * Sum: '<Root>/Sum1' */ rtb_Quantizer = rt_roundd((rtb_Quantizer - 0.381 * rtb_TransferFcn1) * 0.9 / 0.1) * 0.1; /* Gain: '<S1>/Filter Coefficient' incorporates: * DiscreteIntegrator: '<S1>/Filter' * Gain: '<S1>/Derivative Gain' * Sum: '<S1>/SumD' */ rtb_FilterCoefficient = (5.0 * rtb_Quantizer - rtDW.Filter_DSTATE) * 100.0; /* Gain: '<S1>/Integral Gain' */ rtb_IntegralGain = 0.0; /* Sum: '<S1>/Sum' incorporates: * DiscreteIntegrator: '<S1>/Integrator' */ rtDW.Sum = (rtb_Quantizer + rtDW.Integrator_DSTATE) + rtb_FilterCoefficient; } /* Gain: '<Root>/Gain' incorporates: * TransferFcn: '<Root>/Transfer Fcn' */ rtDW.Gain = 208.33333333333334 * rtX.TransferFcn_CSTATE * 0.9; /* Sum: '<Root>/Sum' incorporates: * Gain: '<Root>/Gain3' */ rtDW.Sum_g = rtDW.Sum - 0.55 * rtb_TransferFcn1; if (rtmIsMajorTimeStep(rtM)) { if (rtmIsMajorTimeStep(rtM)) { /* Update for DiscreteIntegrator: '<S1>/Filter' */ rtDW.Filter_DSTATE += 0.01 * rtb_FilterCoefficient; /* Update for DiscreteIntegrator: '<S1>/Integrator' */ rtDW.Integrator_DSTATE += 0.01 * rtb_IntegralGain; } } /* end MajorTimeStep */ if (rtmIsMajorTimeStep(rtM)) { rt_ertODEUpdateContinuousStates(&rtM->solverInfo); /* Update absolute time for base rate */ /* The "clockTick0" counts the number of times the code of this task has * been executed. The absolute time is the multiplication of "clockTick0" * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not * overflow during the application lifespan selected. */ ++rtM->Timing.clockTick0; rtM->Timing.t[0] = rtsiGetSolverStopTime(&rtM->solverInfo); { /* Update absolute timer for sample time: [0.01s, 0.0s] */ /* The "clockTick1" counts the number of times the code of this task has * been executed. The resolution of this integer timer is 0.01, which is the step size * of the task. Size of "clockTick1" ensures timer will not overflow during the * application lifespan selected. */ rtM->Timing.clockTick1++; } } /* end MajorTimeStep */}/* Derivatives for root system: '<Root>' */void DiscretSpeed_derivatives(void){ XDot *_rtXdot; _rtXdot = ((XDot *) rtM->ModelData.derivs); /* Derivatives for TransferFcn: '<Root>/Transfer Fcn1' */ _rtXdot->TransferFcn1_CSTATE = 0.0; _rtXdot->TransferFcn1_CSTATE += -0.00064755685066925691 * rtX.TransferFcn1_CSTATE; _rtXdot->TransferFcn1_CSTATE += rtDW.Gain; /* Derivatives for TransferFcn: '<Root>/Transfer Fcn' */ _rtXdot->TransferFcn_CSTATE = 0.0; _rtXdot->TransferFcn_CSTATE += -2.0833333333333335 * rtX.TransferFcn_CSTATE; _rtXdot->TransferFcn_CSTATE += rtDW.Sum_g;}/* Model initialize function */void DiscretSpeed_initialize(void){ /* Registration code */ { /* Setup solver object */ rtsiSetSimTimeStepPtr(&rtM->solverInfo, &rtM->Timing.simTimeStep); rtsiSetTPtr(&rtM->solverInfo, &rtmGetTPtr(rtM)); rtsiSetStepSizePtr(&rtM->solverInfo, &rtM->Timing.stepSize0); rtsiSetdXPtr(&rtM->solverInfo, &rtM->ModelData.derivs); rtsiSetContStatesPtr(&rtM->solverInfo, (real_T **) &rtM->ModelData.contStates); rtsiSetNumContStatesPtr(&rtM->solverInfo, &rtM->Sizes.numContStates); rtsiSetNumPeriodicContStatesPtr(&rtM->solverInfo, &rtM->Sizes.numPeriodicContStates); rtsiSetPeriodicContStateIndicesPtr(&rtM->solverInfo, &rtM->ModelData.periodicContStateIndices); rtsiSetPeriodicContStateRangesPtr(&rtM->solverInfo, &rtM->ModelData.periodicContStateRanges); rtsiSetErrorStatusPtr(&rtM->solverInfo, (&rtmGetErrorStatus(rtM))); rtsiSetRTModelPtr(&rtM->solverInfo, rtM); } rtsiSetSimTimeStep(&rtM->solverInfo, MAJOR_TIME_STEP); rtM->ModelData.intgData.y = rtM->ModelData.odeY; rtM->ModelData.intgData.f[0] = rtM->ModelData.odeF[0]; rtM->ModelData.intgData.f[1] = rtM->ModelData.odeF[1]; rtM->ModelData.intgData.f[2] = rtM->ModelData.odeF[2]; rtM->ModelData.contStates = ((X *) &rtX); rtsiSetSolverData(&rtM->solverInfo, (void *)&rtM->ModelData.intgData); rtsiSetSolverName(&rtM->solverInfo,"ode3"); rtmSetTPtr(rtM, &rtM->Timing.tArray[0]); rtM->Timing.stepSize0 = 0.01; /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn1' */ rtX.TransferFcn1_CSTATE = 0.0; /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn' */ rtX.TransferFcn_CSTATE = 0.0;}/* * File trailer for generated code.* * [EOF] */Листинг 2. Код модели управления углом поворота/* * File: DiscretFi.c * * Code generated for Simulink model 'DiscretFi'. * * Model version : 1.14 * Simulink Coder version : 8.9 (R2015b) 13-Aug-2015 * C/C++ source code generated on : Wed Jun 09 10:26:22 2021 * * Target selection: ert.tlc * Embedded hardware selection: Intel->x86-64 (Windows64) * Code generation objectives: * 1. Execution efficiency * 2. RAM efficiency * Validation result: Not run */#include "DiscretFi.h"/* Private macros used by the generated code to access rtModel */#ifndef rtmIsMajorTimeStep# define rtmIsMajorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MAJOR_TIME_STEP)#endif#ifndef rtmIsMinorTimeStep# define rtmIsMinorTimeStep(rtm) (((rtm)->Timing.simTimeStep) == MINOR_TIME_STEP)#endif#ifndef rtmGetTPtr# define rtmGetTPtr(rtm) ((rtm)->Timing.t)#endif#ifndef rtmSetTPtr# define rtmSetTPtr(rtm, val) ((rtm)->Timing.t = (val))#endif/* Continuous states */X rtX;/* Block signals and states (auto storage) */DW rtDW;/* Real-time model */RT_MODEL rtM_;RT_MODEL *const rtM = &rtM_;extern real_T rt_roundd(real_T u);/* private model entry point functions */extern void DiscretFi_derivatives(void);/* * This function updates continuous states using the ODE3 fixed-step * solver algorithm */static void rt_ertODEUpdateContinuousStates(RTWSolverInfo *si ){ /* Solver Matrices */ static const real_T rt_ODE3_A[3] = { 1.0/2.0, 3.0/4.0, 1.0 }; static const real_T rt_ODE3_B[3][3] = { { 1.0/2.0, 0.0, 0.0 }, { 0.0, 3.0/4.0, 0.0 }, { 2.0/9.0, 1.0/3.0, 4.0/9.0 } }; time_T t = rtsiGetT(si); time_T tnew = rtsiGetSolverStopTime(si); time_T h = rtsiGetStepSize(si); real_T *x = rtsiGetContStates(si); ODE3_IntgData *id = (ODE3_IntgData *)rtsiGetSolverData(si); real_T *y = id->y; real_T *f0 = id->f[0]; real_T *f1 = id->f[1]; real_T *f2 = id->f[2]; real_T hB[3]; int_T i; int_T nXc = 3; rtsiSetSimTimeStep(si,MINOR_TIME_STEP); /* Save the state values at time t in y, we'll use x as ynew. */ (void) memcpy(y, x, (uint_T)nXc*sizeof(real_T)); /* Assumes that rtsiSetT and ModelOutputs are up-to-date */ /* f0 = f(t,y) */ rtsiSetdX(si, f0); DiscretFi_derivatives(); /* f(:,2) = feval(odefile, t + hA(1), y + f*hB(:,1), args(:)(*)); */ hB[0] = h * rt_ODE3_B[0][0]; for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0]); } rtsiSetT(si, t + h*rt_ODE3_A[0]); rtsiSetdX(si, f1); DiscretFi_step(); DiscretFi_derivatives(); /* f(:,3) = feval(odefile, t + hA(2), y + f*hB(:,2), args(:)(*)); */ for (i = 0; i <= 1; i++) { hB[i] = h * rt_ODE3_B[1][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1]); } rtsiSetT(si, t + h*rt_ODE3_A[1]); rtsiSetdX(si, f2); DiscretFi_step(); DiscretFi_derivatives(); /* tnew = t + hA(3); ynew = y + f*hB(:,3); */ for (i = 0; i <= 2; i++) { hB[i] = h * rt_ODE3_B[2][i]; } for (i = 0; i < nXc; i++) { x[i] = y[i] + (f0[i]*hB[0] + f1[i]*hB[1] + f2[i]*hB[2]); } rtsiSetT(si, tnew); rtsiSetSimTimeStep(si,MAJOR_TIME_STEP);}real_T rt_roundd(real_T u){ real_T y; if (fabs(u) < 4.503599627370496E+15) { if (u >= 0.5) { y = floor(u + 0.5); } else if (u > -0.5) { y = 0.0; } else { y = ceil(u - 0.5); } } else { y = u; } return y;}/* Model step function */void DiscretFi_step(void){ /* local block i/o variables */ real_T rtb_FilterCoefficient; real_T rtb_IntegralGain; real_T rtb_Quantizer; int32_T tmp; if (rtmIsMajorTimeStep(rtM)) { /* set solver stop time */ rtsiSetSolverStopTime(&rtM->solverInfo,((rtM->Timing.clockTick0+1)* rtM->Timing.stepSize0)); } /* end MajorTimeStep */ /* Update absolute time of base rate at minor time step */ if (rtmIsMinorTimeStep(rtM)) { rtM->Timing.t[0] = rtsiGetT(&rtM->solverInfo); } if (rtmIsMajorTimeStep(rtM)) { /* Step: '<Root>/Step' */ if (rtM->Timing.t[0] < 0.0) { tmp = 0; } else { tmp = 10; } /* End of Step: '<Root>/Step' */ /* Quantizer: '<Root>/Quantizer' incorporates: * Gain: '<Root>/Gain1' * Sum: '<Root>/Sum1' * TransferFcn: '<Root>/Transfer Fcn2' */ rtb_Quantizer = rt_roundd(((real_T)tmp - rtX.TransferFcn2_CSTATE) * 0.9 / 0.1) * 0.1; /* Gain: '<S1>/Filter Coefficient' incorporates: * DiscreteIntegrator: '<S1>/Filter' * Gain: '<S1>/Derivative Gain' * Sum: '<S1>/SumD' */ rtb_FilterCoefficient = (6.0 * rtb_Quantizer - rtDW.Filter_DSTATE) * 100.0; /* Gain: '<S1>/Integral Gain' */ rtb_IntegralGain = 0.0; /* Sum: '<S1>/Sum' incorporates: * DiscreteIntegrator: '<S1>/Integrator' */ rtDW.Sum = (rtb_Quantizer + rtDW.Integrator_DSTATE) + rtb_FilterCoefficient; } /* Gain: '<Root>/Gain' incorporates: * TransferFcn: '<Root>/Transfer Fcn' */ rtDW.Gain = 208.33333333333334 * rtX.TransferFcn_CSTATE * 0.9; /* TransferFcn: '<Root>/Transfer Fcn1' */ rtb_Quantizer = 0.003444451333347111 * rtX.TransferFcn1_CSTATE; /* Gain: '<Root>/Gain2' */ rtDW.Gain2 = 0.508 * rtb_Quantizer; /* Sum: '<Root>/Sum' incorporates: * Gain: '<Root>/Gain3' */ rtDW.Sum_g = rtDW.Sum - 0.55 * rtb_Quantizer; if (rtmIsMajorTimeStep(rtM)) { if (rtmIsMajorTimeStep(rtM)) { /* Update for DiscreteIntegrator: '<S1>/Filter' */ rtDW.Filter_DSTATE += 0.01 * rtb_FilterCoefficient; /* Update for DiscreteIntegrator: '<S1>/Integrator' */ rtDW.Integrator_DSTATE += 0.01 * rtb_IntegralGain; } } /* end MajorTimeStep */ if (rtmIsMajorTimeStep(rtM)) { rt_ertODEUpdateContinuousStates(&rtM->solverInfo); /* Update absolute time for base rate */ /* The "clockTick0" counts the number of times the code of this task has * been executed. The absolute time is the multiplication of "clockTick0" * and "Timing.stepSize0". Size of "clockTick0" ensures timer will not * overflow during the application lifespan selected. */ ++rtM->Timing.clockTick0; rtM->Timing.t[0] = rtsiGetSolverStopTime(&rtM->solverInfo); { /* Update absolute timer for sample time: [0.01s, 0.0s] */ /* The "clockTick1" counts the number of times the code of this task has * been executed. The resolution of this integer timer is 0.01, which is the step size * of the task. Size of "clockTick1" ensures timer will not overflow during the * application lifespan selected. */ rtM->Timing.clockTick1++; } } /* end MajorTimeStep */}/* Derivatives for root system: '<Root>' */void DiscretFi_derivatives(void){ XDot *_rtXdot; _rtXdot = ((XDot *) rtM->ModelData.derivs); /* Derivatives for TransferFcn: '<Root>/Transfer Fcn2' */ _rtXdot->TransferFcn2_CSTATE = 0.0; _rtXdot->TransferFcn2_CSTATE += rtDW.Gain2; /* Derivatives for TransferFcn: '<Root>/Transfer Fcn' */ _rtXdot->TransferFcn_CSTATE = 0.0; _rtXdot->TransferFcn_CSTATE += -2.0833333333333335 * rtX.TransferFcn_CSTATE; _rtXdot->TransferFcn_CSTATE += rtDW.Sum_g; /* Derivatives for TransferFcn: '<Root>/Transfer Fcn1' */ _rtXdot->TransferFcn1_CSTATE = 0.0; _rtXdot->TransferFcn1_CSTATE += -0.00064755685066925691 * rtX.TransferFcn1_CSTATE; _rtXdot->TransferFcn1_CSTATE += rtDW.Gain;}/* Model initialize function */void DiscretFi_initialize(void){ /* Registration code */ { /* Setup solver object */ rtsiSetSimTimeStepPtr(&rtM->solverInfo, &rtM->Timing.simTimeStep); rtsiSetTPtr(&rtM->solverInfo, &rtmGetTPtr(rtM)); rtsiSetStepSizePtr(&rtM->solverInfo, &rtM->Timing.stepSize0); rtsiSetdXPtr(&rtM->solverInfo, &rtM->ModelData.derivs); rtsiSetContStatesPtr(&rtM->solverInfo, (real_T **) &rtM->ModelData.contStates); rtsiSetNumContStatesPtr(&rtM->solverInfo, &rtM->Sizes.numContStates); rtsiSetNumPeriodicContStatesPtr(&rtM->solverInfo, &rtM->Sizes.numPeriodicContStates); rtsiSetPeriodicContStateIndicesPtr(&rtM->solverInfo, &rtM->ModelData.periodicContStateIndices); rtsiSetPeriodicContStateRangesPtr(&rtM->solverInfo, &rtM->ModelData.periodicContStateRanges); rtsiSetErrorStatusPtr(&rtM->solverInfo, (&rtmGetErrorStatus(rtM))); rtsiSetRTModelPtr(&rtM->solverInfo, rtM); } rtsiSetSimTimeStep(&rtM->solverInfo, MAJOR_TIME_STEP); rtM->ModelData.intgData.y = rtM->ModelData.odeY; rtM->ModelData.intgData.f[0] = rtM->ModelData.odeF[0]; rtM->ModelData.intgData.f[1] = rtM->ModelData.odeF[1]; rtM->ModelData.intgData.f[2] = rtM->ModelData.odeF[2]; rtM->ModelData.contStates = ((X *) &rtX); rtsiSetSolverData(&rtM->solverInfo, (void *)&rtM->ModelData.intgData); rtsiSetSolverName(&rtM->solverInfo,"ode3"); rtmSetTPtr(rtM, &rtM->Timing.tArray[0]); rtM->Timing.stepSize0 = 0.01; /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn2' */ rtX.TransferFcn2_CSTATE = 0.0; /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn' */ rtX.TransferFcn_CSTATE = 0.0; /* InitializeConditions for TransferFcn: '<Root>/Transfer Fcn1' */ rtX.TransferFcn1_CSTATE = 0.0;}/* * File trailer for generated code. * * [EOF] */ПРИЛОЖЕНИЕ БСтруктурная схема управления скоростью АКРПРИЛОЖЕНИЕ ВАлгоритм управления скоростью АКРПРИЛОЖЕНИЕ ГАлгоритм управления углом поворота АКРПРИЛОЖЕНИЕ ДРезультаты моделированияуправления скоростью АКРПРИЛОЖЕНИЕ ЕРезультаты моделирования управления углом поворота АКР

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Зенкевич, С.Л., Назарова, А.В. Система управления мобильного колесного робота// Вестник МГТУ им. Н.Э. Баумана. Сер. “Приборостроение”. 2006. №3 51.
2. Караваев Ю. Л., Трефилов С. А. Дискретный алгоритм управления по отклонению мобильным роботом с омниколесами // Нелинейная динамика. 2013. Т. 9, № 1. С. 91—100.
3. Власов С. М., Бойков В. И., Быстров С. В., Григорьев В. В. Бесконтактные
средства локальной ориентации роботов. — СПб: Университет ИТМО, 2017. — 169с.
4. Красовский А. А. Справочник по теории автоматического управления. М.: Наука, 1987. 712 с.
5. Официальный сайт Raspberry Pi: электронный ресурс:
6. Мартыненко, Ю.Г. Управление движением колесных роботов// Ю. Г. Мартыненко, изд-во МГУ, 2005 г. – 52 с.
7. В.Н. Белотелов, А. А. Голован, А.А. Гришин, Д. Н. Жихарев, А. В. Ленский, В. Б. Пахомов. Математические модели и алгоритмы управления движением мобильного робота// изд-во МГУ, 2001 г. – 32 с.
8. Мартыненко, Ю. Г. Динамика мобильных роботов// Советский образовательный журнал Т6 №5. – М., 2000. – С. 107–123.
9. Девянин, Е. А. О движении колесных роботов // Труды конф. “Мобильные
роботы и мехатронные системы”. – М., 1998. – С. 169–200.
10. Леонов Д.С. Управление мобильным роботом в условиях проскальзывания колес// Д.С. Ленов. – Спб: 2020 г. – 17 с.
11. Евстигнеев М. И., Литвинов Ю. В., Мазулина В. В., Мищенко Г. М. Алгоритмы управления четырехколесным роботом при движении по пересеченной местности // Изв. вузов. Приборостроение. 2015. Т. 58, № 9. С. 738—741.
12. Епифанов Р. Ю. Управление движением мобильной колесной платформы
2017 г. – 18 с.
13. К.Ю. Котов, А.С. Мальцев, М.А. Соболев, М.Н. Филиппов. Использование локальной системы технического зрения для оценки координат мобильного робота. Институт автоматики и электрометрии СО РАН, г. Новосибирск.
14. Золотухин Ю.Н., Котов К.Ю., Мальцев А.С., Нестеров А.А. Управление траекторным движением группы мобильных роботов: моделирование и эксперимент // В кн. Материалы Х Международной конференции “Актуальные проблемы электронного приборостроения (АПЭП-2010)”, Новосибирск, с. 101-106, Россия: 2010.
15. Е.А. Девятериков, Б.Б. Михайлов. Система управления движение мобильного робота с визуальным одометром// Экспериментальная робототехника, 2008 г. – 6 с.


Узнать стоимость работы