Данный проект создан для изучения возможностей тренажёра (зелёный), спроектированного на базе 6-ти степенной платформы Стюарта на угловых актуаторах.
а). | б). |
Рисунок 1 - тренажёр AST: а - тренажёр; б - схематичная визуализация результата расчёта (см. ветвь visualization).
Проект содержит 3 ветви:
- main - реализация скрипта на python, возвращающего углы угловых актуаторов (редукторов) по заданным координатам и углам верхней платформы;
- visualization - схематичная визуализация результата расчёта. Предварительный просмотр тут.
- test - используемая в проекте теория по платформе.
main.py несёт в себе функцию:
def solve(x, y, z, alpha, beta, gamma): # Example: (25, 25, 300, 5, 5, 5)
На вход подаётся 6 параметров:
- x - координата X (мм);
- y - координата Y (мм);
- z - координата Z (мм);
- alpha - угол OX (градусы);
- beta - угол OY (градусы);
- gamma - угол OZ (градусы).
Результатом работы функции будет список из 6-ти НАИМЕНЬШИХ углов (относительно вертикальной оси OZ. OZ = 0 град) редукторов:
return arm_angle # Example: [-55.88 -54.72 -92.84 -54.10 -58.97 -50.18] перевёл в градусы для удобства*
# На рисунке 2, а приведено значение угла для solve(25, 25, 300, 5, 5, 5)[0] (знаки углов разные, см. пункт 6).
Если заданные на входе параметры приведут к выходу за диапазон работы платформы, Вам вернут сообщение об этом (будет конкретно написано, какая часть платформы сломана).
Допустимые диапазоны характеристик (находятся в constants.py):
- max угол шаровых = 35 град;
- min/max длина пружины (от шаровой до шаровой) = [464, 714] мм;
- max/min угол актуаторов = [-112.38, 52.62] град.
- папка func - содержит в себе необходимые функции:
- cross_normal_to_oz.py - точки пересечения между окружностью (редуктором) и сферой (тяга). См. подробный разбор тут или тут;
- matrix_1_4.py - запись получаемых координат XYZ (из cross_normal_to_oz.py) в ортогональных координатах (добавляем 1 в конец списка);
- rotation_matrix.py - реализация матрицы поворота по последовательности XYZ и запись её в ортогональных координатах (матрица 4х4);
- transition_matrix.py - матрица линейного переноса координат (матрица 4х4) - сюда записываем НА сколько перемещаемся;
- папка SW - файлы SolidWorks 2020 со схемой(AST-5.2.0-A1-scetch.SLDASM) платформы для проверки (см. рисунок 1, а) получаемых углов шаровых опор актуаторов и уравновешивающих механизмов (менять углы/координаты верхней плиты необходимо через управляемые сопряжения, см. рисунок 1, б).
- constants.py - файл с константами.
- main.py - исполнительный файл.
- numpy
Все используемые библиотеки python указаны в файле requirements.txt. Для быстрой установки отсутствующих библиотек в терминале выполните:
pip install -r requirements.txt
- Изменить координаты точек крепления шаровых редукторов/пружин можно в матрицах в файле constants.py со строки 22.
- Изменить допустимые диапазоны характеристик можно в файле constants.py со строки 11.
- Проверку полученных углов можно совершить в SW/AST-5.2.0-A1-scetch.SLDASM. Sketch "Рычаг[i+1]" = углу актуатора. На рисунке 2, а мы видим, что угол равен 55.88 град, что совпадает с solve(25, 25, 300, 5, 5, 5)[0] (знаки углов разные, см. пункт 6).
- В Sketch "Угол шаровой[i+1]-1 или 2" можно увидеть угол шаровой опоры.
a). | б). |
Рисунок 2 - схема тренажера: а - угол нулевого актуатора = 55.88 град; б - способ изменения параметров.
Введём локальную систему координат (далее СК) для определения углов. За ось поворота принимаем OZ (как в Matlab Simscape Multibody. синяя линия рисунке 3, а). Ось OY (зелёная линия на рисунке 3, а) направлена на противоположную плиту. Ось OX (красная линия на рисунке 3, а) направлена на OX редуктора, расположенного в одной плоскости.
Угол редуктора вычисляем относительно OY (рисунок 3, б). Важно отметить, что в SW отрицательных углов нет, в скрипте угол вычисляется через atan2: в I четверти знак положительный, во второй => отрицательный. Мы выбираем НАИМЕНЬШИЙ угол, который вписывается в диапазон max/min углов редукторов = [-112.38, 52.62] град (это конструкционные ограничения).
См. подробный разбор нахождения углов тут или [тут] в файле (https://github.com/LiDline/6DOF/tree/test) "2. Sphere&circle.ipynb".
a). | б). |
Рисунок 2 - Определение угла редуктора: а - локальные СК для плит; б - определение угла редуктора в локальных СК.
Для определения угла шаровой опоры на рычаге редуктора (файл leg_ball_corners.py) необходимо:
- Найти координаты точки пересечения (см. рисунок 3, а) окружности (рычага редуктора) и сферы (тяги) и записать её в матричном виде.
- Определим координаты верхней шаровой опоры тяги относительно точки пересечения путём перемножения обратной матрицы перемещений точки пересечения и матрицы координат верхней точки (строка 78).
- Найдём угол между проекцией тяги (на локальной XY) и верхней точки (см. рисунок 3, б), чтобы повернуть локальную СК на полученный угол (строка 82). Создадим матрицу поворота из полученного угла и домножим её на матрицу из пункта 2 (строка 88).
- Узнаем координаты верхней шаровой опоры тяги относительно точки пересечения в полученной СК путём перемножения обратной матрицы из пункта 3. на матрицу координат верхней точки (строка 97).
- Находим угол (рисунок 3, в) через вычисление math.atan2(X, Z), где X и Z - координаты верхней точки из пункта 4 (строка 102).
a). | б). | в). |
Рисунок 3 - Определение угла шаровой опоры: а - точка пересечения окружности и сферы; б - угол между проекцией тяги (на локальной XY) и верхней точки; в - угол нижней шаровой опоры.
Угол верхней шаровой опоры находится аналогичным способом.