Оживляем гексапода. Часть третья

от автора

Как показала практика, обилие кода в статье не очень хорошо сказывается на ее читабельности. Но для понимания того, как это все работает стоить иногда напрячь мозги. На что и была нацелена предыдущая публикация. Сегодня я постараюсь завершить цикл статей по программной начинке гексапода, сделав краткий обзор того, что с чем не успели познакомится.

Цикл предыдущих статей:

Как мы печатали гексапода и что из этого получилось
Оживляем гексапода. Часть первая
Оживляем гексапода. Часть вторая

Конфигурация

Физические характеристики робота определены в программе в виде набора конфигурационных параметров и вынесены в отдельный конфигурационный файл config.h. Среди этих параметров можно выделить следующие основные группы:

Размеры конечностей и особенности их движения

Идентификатор Описание характеристики
COXA_LENGTH Длина плеча (мм)
FEMORA_LENGTH Длина бедра (мм)
TIBIA_LENGTH Длина голени (мм)
TIBIA_OFFSET Смещение плеча относительно сустава (мм)
COXA_ANGLE_0 Угол среднего (нулевого) положения плеча
FEMORA_ANGLE_0 Угол среднего (нулевого) положения бедра
TIBIA_ANGLE_0 Угол среднего (нулевого) положения голени
COXA_ANGLE_INVERSE Признак инверсии направления вращения плечевого сервопривода
FEMORA_ANGLE_INVERSE Признак инверсии направления вращения сервопривода бедра
TIBIA_ANGLE_INVERSE Признак инверсии направления вращения сервопривода голени

Расположение и ориентация конечностей робота относительно его центра

Идентификатор Описание характеристики
LEFT_FRONT_FOOT_POSITION Точка крепления левой передней лапы
LEFT_MIDLE_FOOT_POSITION Точка крепления левой средней лапы
LEFT_BACK_FOOT_POSITION Точка крепления левой задней лапы
RIGTH_FRONT_FOOT_POSITION Точка крепления правой передней лапы
RIGTH_MIDLE_FOOT_POSITION Точка крепления правой средней лапы
RIGTH_BACK_FOOT_POSITION Точка крепления правой задней лапы
LEFT_FRONT_FOOT_ROTATION Ориентация левой передней лапы
LEFT_MIDLE_FOOT_ROTATION Ориентация левой средней лапы
LEFT_BACK_FOOT_ROTATION Ориентация левой задней лапы
RIGTH_FRONT_FOOT_ROTATION Ориентация правой передней лапы
RIGTH_MIDLE_FOOT_ROTATION Ориентация правой средней лапы
RIGTH_BACK_FOOT_ROTATION Ориентация правой задней лапы

Допустимые диапазоны углов при работе сервоприводов

Идентификатор Описание характеристики
COXA_MIN_ANGLE Минимальное отклонение плеча от среднего положения
COXA_MAX_ANGLE Максимальное отклонение плеча от среднего положения
FEMORA_MIN_ANGLE Минимальное отклонение бедра от среднего положения
FEMORA_MAX_ANGLE Максимальное отклонение бедра от среднего положения
TIBIA_MIN_ANGLE Минимальное отклонение голени от среднего положения
TIBIA_MAX_ANGLE Максимальное отклонение голени от среднего положения
COMPLEX_ANGLE_LIMITS_1 Предельные максимальные одновременные значения углов наклона бедра и голени
MIDLE_COXA_MIN_ANGLE Минимальное отклонение среднего плеча от среднего положения
MIDLE_COXA_MAX_ANGLE Максимальное отклонение среднего плеча от среднего положения

Характеристики движения робота

Идентификатор Описание характеристики
MOTION_JOB_PERIOD Периодичность пересчета положения конечностей (мсек)
MOVE_STEP Длина шага по прямой (мм)
ROTATE_STEP Длина шага по дуге при развороте (мм)

Математика

Для расчета прямой и обратной кинематики робота требуется выполнять векторные и матричные вычисления. Это осуществляется с помощью классов Vector3D и Matrix3D объявленных в файле 3d_math.h

struct Vector3D

struct Vector3D {   float x,y,z;    Vector3D operator -(void) {     return {-x, -y ,-z};   }                            Vector3D& operator=(const Vector3D a);      float len(); }; 

struct Matrix3D

struct Matrix3D {   float a[3][3];    Vector3D operator *(Vector3D& v) {     Vector3D p;     p.x = v.x*a[0][0] + v.y*a[0][1] + v.z*a[0][2];     p.y = v.x*a[1][0] + v.y*a[1][1] + v.z*a[1][2];     p.z = v.x*a[2][0] + v.y*a[2][1] + v.z*a[2][2];     return p;   };                                                   Matrix3D operator *(Matrix3D m) {     Matrix3D r;     for(int i=0; i<3; i++) {       for(int j=0; j<3; j++) {         r.a[i][j] = 0;         for(int k=0; k<3; k++)           r.a[i][j] += a[i][k]*m.a[k][j];       }     }     return r;   }; }; 

Перегрузка операторов и вспомогательные функции

Vector3D operator +=(Vector3D left, const Vector3D right); Vector3D operator -=(Vector3D left, const Vector3D right); Vector3D operator- (Vector3D a, Vector3D b); Vector3D operator+ (Vector3D a, Vector3D b); Vector3D operator* (Vector3D a, Vector3D b); Vector3D operator* (float a, Vector3D b); Vector3D operator* (Vector3D a, float b); Vector3D operator/ (Vector3D a, int b); // возвращает матрицу поворота для углов вектора углов r = {rx, ry, rz} Matrix3D rotMatrix(Vector3D r);  // углы в радианах Matrix3D rotMatrix2(Vector3D r);  // углы в градусах // арккотангенс угла float arcctn(float); 

Исходники

Все исходные файлы теперь доступны на GitHub. Там же можно найти проект приложения для Android и модели для 3D печати. Раздел arduino состоит из двух подразделов:

  • main — основной набор файлов для контроллера Arduino
  • wifi — прошивка для esp8622 необходимая для организации канала связи по Wi-Fi

Что дальше?

Несмотря на то, что данная статья имеет заключительный характер, вне поля зрения остались темы организации канала связи через Wi-Fi и управление через Android. Если данные темы вызывают интерес или остались другие не рассмотренные вопросы, пишите об этом в комментариях или личной переписке. Я обязательно постараюсь дать развернутый ответ или посвятить этому отдельную статью.

Проект Geksa продолжит свое развитие. В ближайшей перспективе планируется изменение состава электронных компонентов, расширение функционала, доработка корпуса робота, внесение дополнений ПО. Буду рад услышать от вас конструктивные замечания или предложения.

Спасибо!

ссылка на оригинал статьи https://habr.com/ru/post/490950/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *