Динамика servo_ident
Компонет вычисляет невязку по силе моментами приводов, рассчитаными по задающему воздействию и по реальной траектории движения.
Это данные также используются для идентификации 4-х параметров alpha из 7-параметрической модели привода ServoModel.
Входные порты
joints_sorted(JointState) --- желаемое состояние робота в угловой СК: позиции, скорости, моменты приводов. Полный вектор состояния робота, отсортирован в соответвие сRobotModel.joints_measured(JointState, EventPort) --- измеренные позиции и скорости приводов. Может присутсвовать только часть приводов, моет прийти несколько сообщений за такт.
Выходные порты
servo_model(ServoModel[]) --- используется для пересылке модели к компоненту обращения приводовservo_inv_7paramпосле ее идентификации.torque_error_sorted(JointState) --- ошибка предсказания модели приводов, пересчитанная в момент. Полный, отсортированный вектор всех динамически управляемых приводов.
Параметры
control_delay(uint) --- задержка исполнения команд приводами в тактах системы управления.relaxaton_factor(double) --- фактор забывания при МНК идетификации.error_averaging_time(double) --- характерное время усреднения ошибки предсказания.treshhold(double) --- минимально допустимая точность по средней ошибке предсказания позиции, радианы.battery_voltage(double) --- напряжение батареи по умолчанию.servo_models(ServoModel[]) --- список моделей приводов. Могут быть переупорядочены или модифицированы компонентом.
Операции
Интерфейс операций: ручное использование идентификации.
- Предоставляет:
bool startIdentification(strings servos), ` --- начать идентификацию заданного набора приводов. Возвращает false, если начать процедуру невозможно. - Предоставляет:
strings endIdentification()--- завершить идентификацию, если критерий качестваtreshholdдостигнут, то отослать модели через портservo_model, возвращает список успешно идентифицированных моделей. - Предоставляет:
bool abortIdentification()--- завершить идентификацию, если критерий качестваtreshholdдостигнут, то отослать модели через портservo_model.
Для управления из ROS потребубются аналоги этих операций. Вероятно, можно сделать одну операцию для запуска/получения статуса/прекращения/завершения.
Альтернативный вариант --- интерфейс actionlib, но он не позволяет осуществлять операции abort/end.
Сервисы и плагины
- Требует:
RobotModelURDFдля получения списка приводов при инициализации.
Семантика исполнения
Получение сообщения joints_measured. Используя соответвующую модель из параметра servo_models вычисляет невязку по силе tau_e и публикует ее.
Для приводов, о которых нет информации --- невязка ноль, для остальных --- сохраняются предыдущие значения.
Если для привода начата процедура идентификации (была вызвана startIdentification), то проводит идентификацию МНК. Она продолжается до вызова
endIdentification() или abortIdentification(). В первом случае, если усредненная по времени error_averaging_time ошибка пресказания позиции меньше treshhold,
то результат идентификации попадает в сообщение servo_model. Во втором идентификация просто прерывается.
Детали реализации
Из-за задержки в исполнительной системе придется хранить control_delay векторов с задающим воздействием. Это надо делать без копирования (циклический буффер).
Т.к. joints_measured не упорядочен, то для быстрого получения номера привода и доступа к структурам, мспользующимся при его идентификации предлагается создать
unordered_map<string,ServoIdent>. ServoIdent содержит промежуточные параметры идентификации (матрицу ковариации, среднуюю ошибку предсказания и т.п.
Для ускорения доступа servo_models должен переупорядочиваться и дополняется в соответвие с порядком приводов в RobotModel. Результат идентификации можно сразу хранить в servo_models,
либо загружать туда только, если вывана операция endIdentification().
Исключения и ошибки
Ошибки:
1. Некорректное имя привода.
1. Некоррекный joints_sorted.
Предупрежденрия:
1. Некоррекный joints_measured.
Информация: 1. Запуск, ход и остановка идентификации.