2 Разработка программного инструмента для проектирования систем имитационного моделирования
2.1 Архитектура системы проектирования имитационного моделирования мобильных роботов
Схема архитектуры системы проектирования имитационного моделирования мобильных робототехнических систем представлена на рисунке 2.1.1.
Проект построен на архитектуре, включающей в себя основные и наиболее часто используемые модули, применяющиеся в создании мобильных робототехнических систем. Архитектура построена таким образом, чтобы обеспечить гибкость настройки и возможность расширения возможностей проекта.
2.2 Элементы системы проектирования имитационного моделирования мобильных роботов
2.2.1 ModuleBaseScript
ModuleBaseScript соединяет два объекта, фиксируя их положение относительно друг друга. Функционирование реализовано с использованием FixedJoint. Если у соединяемых элементов отсутствует компонент RigidBody, то он будет добавлен автоматически атрибутом RequireComponent. Класс наследуется от MonoBehaviour.
Используемые поля:
● Rigidbody _rigidBody – компонент физическое тело объекта;
● FixedJoint _fixedJoint – компонент фиксированного крепления;
● Rigidbody connectedBody – присоединяемое физическое тело другого объекта.
Методы класса:
● void setConnectedBody (Rigidbody rigidbody) – записывает в поле connectedBody физическое тело передаваемого в метод объекта.
2.2.2 GPIOBaseScript
GPIOBaseScript добавляет игровому объекту возможность настройки интерфейса ввода/вывода общего назначения (GPIO), в том числе:
● объявление цифровых портов с поддержкой широтно-импульсной модуляции (PWM) и без нее;
● сохранение значения состояния порта, после его установки;
● передача и получение значений состояния портов.
Используемые поля:
● bool[] digitalPort – массив состояний цифровых портов без поддержки PWM;
● float[] PWMPort – массив состояний цифровых портов с поддержкой PWM.
Методы класса:
● void setDigitalPort(int port, bool value) – устанавливает значение цифрового порта без поддержки PWM по указанному адресу.
● bool getDigitalPort(int value) – возвращает значение цифрового порта без поддержки PWM по указанному адресу.
● void setPWMPort(int port, float value) - устанавливает значение цифрового порта с поддержкой PWM по указанному адресу.
● float getPWMPort(int value) – возвращает значение цифрового порта с поддержкой PWM по указанному адресу.
2.2.3 LedBaseScript
Добавляет игровому объекту функционал светодиода:
● подключение к цифровому порту GPIO (без PWM);
● включение/выключение электропитания.
Используемые поля:
● bool mode – режим работы светодиода;
● Material activeLEDMaterial – материал светодиода в активном состоянии;
● Material disabledLEDMaterial – материал светодиода в отключенном состоянии;
● int portID – номер порта GPIO, к которому подключен светодиод.
● GPIOBaseScript GPIOScript – ссылка на устройство, к которому подключен светодиод.
Методы класса:
● bool getMode() – возвращает режим работы светодиода.
2.2.4 MotorDriverScript
MotorDriverScript добавляет игровому объекту функционал драйвера двигателя:
● подключение к цифровым портам GPIO;
● получение значения с портов GPIO и управляет мотором;
Используемые поля:
● int portIn1Id – номер порта для движения вперед;
● int portIn2Id – номер порта для движения назад;
● int portSpeedId – номер порта, отвечающего за скорость вращения мотора;
● GPIOBaseScript GPIOScript – ссылка на устройство, к которому подключен драйвер.
Методы класса:
● float getOutput() – формирует управляющий сигнал подаваемый на двигатель.
2.2.5 MotorBaseScript
MotorBaseScript добавляет игровому объекту функционал электродвигателя:
● подключение к драйверу двигателя;
● получение управляющего сигнала с драйвера, регулирующий скорость и направление вращения вала двигателя;
Используемые поля:
● Rigidbody rotor – физическое тело объекта, соединенного с валом мотора;
● MotorDriverScript motorDriver – драйвер двигателя;
● float maxVelocity – максимальная угловая скорость выходного вала (измеряется в градусах/секунду);
Методы класса:
● void motorInit()–добавляет физическое тело и шарнирное соединение двигателю;
● void setMotorAxis(Vector3 newMotorAxis) – устанавливает ось вращения вала двигателя;
● void setMotorActive(bool isMotorActive) – активирует двигатель;
● void setRotor(Rigidbody newRotor) – задает объект соединенный с валом двигателя;
● void setVelocity(float newVelocity) – задает угловую скорость вращения вала двигателя;
● void setForce(float newForce) – устанавливает крутящий момент двигателя.
2.2.6 I2CMasterScript
I2CMasterScript добавляет игровому объекту функционал управляющего устройства (master) для передачи данных по протоколу I2C:
● подключение к управляемым (slave) устройствам;
● запрос данных с управляемых устройств;
● отправка данных на управляемое устройство;
● получение ответа от управляемых устройств.
Используемые поля:
● List<I2CSlaveScript> busI2C – список объектов, подключенных к шине I2C.
Методы класса:
● void setData(string newData) – устанавливает данные, для передачи по шине I2C;
● virtual void sendData(int targetAddress) – отправляет данные в устройство по указанному адресу.
● virtual void request(int targetAddress) – запрашивает отправку данных с устройства по указанному адресу.
● virtual void requestName(int targetAddress) – запрашивает имя устройства по указанному адресу.
2.2.7 I2CSlaveScript
I2CSlaveScript добавляет игровому объекту функционал slave устройства для передачи данных по протоколу I2C:
● подключение к master по шине данных I2C;
● ответ на запрос от master;
● отправка данных по запросу master;
● получение данных от master.
Используемые поля:
● string data – данные, получаемые/передаваемые по шине I2C;
● string deviceName – имя устройства.
Методы класса:
● void setDeviceName(string newDeviceName) – устанавливает имя устройства;
● string getDeviceName() – возвращает имя устройства;
● void setData(string newData) – устанавливает значение получаемых/передаваемых данных по шине I2C;
● string getData()– возвращает значение получаемых/передаваемых данных по шине I2C;
● virtual string sendData() – запрос данных управляющим устройством;
● virtual string sendName() – запрос имени устройства от master;
● virtual void onRequest() – запрос на выполнение команды от master;
● virtual void reciveData(string recivedData) – получениt данных от master.
2.2.8 DisplayI2C
DisplayI2C добавляет игровому объекту функционал дисплея для вывода текстовой информации, полученной по шине I2C:
● подключение к master по шине данных I2C;
● получение и отображение данных.
Используемые поля:
● TextMesh text – поле для вывода текста.
Методы класса:
● override void reciveData(string recivedData) – получение и вывод данных от master на дисплей.
2.2.9 MicrocontrollerBaseScript
MicrocontrollerBaseScript добавляет игровому объекту функционал микроконтроллера:
● управляющее устройство;
● изменяет значения портов GPIO;
● работа с таймерами.
Используемые поля:
● bool isActive – состояние активности микроконтроллера;
● GPIOBaseScript GPIO – GPIO порты микроконтроллера;
● I2CMasterScript I2CBus – I2C шина подлеченная к контроллеру;
Методы класса:
● void MicroStart() – включение микроконтроллера;
● IEnumerator MicroLoop() – цикл, вызывающийся в соответствие с частотой работы микроконтороллера.
2.2.10 RangeFinderBaseScript
RangeFinderBaseScript добавляет игровому объекту функционал дальномера:
● подключение к master по шине I2C;
● измерение расстояния до ближайшего объекта перед дальномером;
● передача измеренного расстояния по шине I2C;
Используемые поля:
● float maxRange – максимальная дальность работы дальномера.
Методы класса:
● float measureRange() – измеряет расстояние до ближайшего объекта перед дальномером
● override string sendData() – отправляет данные измерений по шине I2C.
Заключение по разделу 2.
В ходе работы над проектом с использованием Unity были разработаны средства моделирования основных компонентов мобильных робототехнических систем. Разработана архитектура проекта с возможностью ее доработки и расширения. Реализованы способы взаимодействия компонентов робота.
Для проверки достоверности и точности моделей, построенных с применением разработанных инструментов, а также испытания стабильности полученных программных средств была поставлена задача апробации проекта.