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

?v=1

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

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


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

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


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

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


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


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


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


Математика


Для расчета прямой и обратной кинематики робота требуется выполнять векторные и матричные вычисления. Это осуществляется с помощью классов 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 продолжит свое развитие. В ближайшей перспективе планируется изменение состава электронных компонентов, расширение функционала, доработка корпуса робота, внесение дополнений ПО. Буду рад услышать от вас конструктивные замечания или предложения.

Спасибо!

© Habrahabr.ru