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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

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


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

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


Физические характеристики робота определены в программе в виде набора конфигурационных параметров и вынесены в отдельный конфигурационный файл 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/

Интересные статьи

Интересные статьи

Это четвертая и финальная часть из серии моих публикаций, посвященных вопросу ввоза обедненного гексафторида урана (ОГФУ) из Европы в Россию. Первая посвящена технологиям обогащения у...
Алексей Найдёнов, CEO ITooLabs, рассказывает про разработку телекоммуникационной платформы для операторов связи на языке программирования Go (Golang). Алексей также делится опытом развертывания и...
Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и занимаюсь внедрением Dynamic Features в наши проекты. Dynamic Delivery — технология, позволяющая устанавливать и удалят...
Брифинг: Ким Дотком (до 2005 года Ким Шмитц, родился 21.01.1974), также известный как Kimble и Kim Tim Jim Vestor – основатель и владелец крупнейшего файлообменника Megaupload, с 2013 года – ...
Привет, друзья! Меня зовут Петр, я представитель малого белорусского бизнеса со штатом чуть более 20 сотрудников. В данной статье хочу поделиться негативным опытом покупки 1С-Битрикс. ...