Цикл предыдущих статей:
Как мы печатали гексапода и что из этого получилось
Оживляем гексапода. Часть первая
Оживляем гексапода. Часть вторая
Конфигурация
Физические характеристики робота определены в программе в виде набора конфигурационных параметров и вынесены в отдельный конфигурационный файл 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 { float x,y,z; Vector3D operator -(void) { return {-x, -y ,-z}; } Vector3D& operator=(const Vector3D a); float len(); };
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/
Добавить комментарий