Comments 7
Кажется, что квадроподам (паукам) не сильно подходят сервоприводы обычные, имхо что-бы они быстрее передвигались нужно исключить контроллер из каждой сервы оставив только механнику, энкодер и двигатель и подключить их через драйверы к МК на прямую, тогда МК будет знать положение каждой ноги в реальном времени и без ожиданий на поворот каждой сервы двигаться быстрее. temp_speed предпологает, что скорость у сервы какая-то константа однако в реальности движение состоит из ускорений и замедлений + различные внешние силы когда нога становится на землю и получает нагрузку, когда отталкивается.
- set one of end points' expect site
- this founction will set temp_speed[4][3] at same time
- non - blocking function
---------------------------------------------------------------------------*/
void set_site(int leg, float x, float y, float z)
{
float length_x = 0, length_y = 0, length_z = 0;
if (x != KEEP)
length_x = x - site_now[leg][0];
if (y != KEEP)
length_y = y - site_now[leg][1];
if (z != KEEP)
length_z = z - site_now[leg][2];
float length = sqrt(pow(length_x, 2) + pow(length_y, 2) + pow(length_z, 2));
temp_speed[leg][0] = length_x / length * move_speed * speed_multiple;
temp_speed[leg][1] = length_y / length * move_speed * speed_multiple;
temp_speed[leg][2] = length_z / length * move_speed * speed_multiple;
if (x != KEEP)
site_expect[leg][0] = x;
if (y != KEEP)
site_expect[leg][1] = y;
if (z != KEEP)
site_expect[leg][2] = z;
}
/*
- wait one of end points move to expect site
- blocking function
---------------------------------------------------------------------------*/
void wait_reach(int leg)
{
while (1)
if (site_now[leg][0] == site_expect[leg][0])
if (site_now[leg][1] == site_expect[leg][1])
if (site_now[leg][2] == site_expect[leg][2])
break;
}
/*
- wait all of end points move to expect site
- blocking function
---------------------------------------------------------------------------*/
void wait_all_reach(void)
{
for (int i = 0; i < 4; i++)
wait_reach(i);
}```Вполне возможно. Но это “игрушечный” проект, построенный на доступных компонентах. Переделку серв я не рассматриваю. По крайней мере сейчас.
Если же рассматривать переделку сервоприводов, то потребуется 12 каналов аналогово-цифровых входов, что не у каждого MCU есть.
Можно использовать CD74HC4067 это 16-канальный двунаправленный аналоговый и цифровой мультиплексор/демультиплексор (коммутатор). Он позволяет подключить до 16 датчиков или сигналов к одному пину.
Да, порой не хватает знания о реальном текущем положении сервопривода, но не думаю, что такое усложнение нужно в этой “игрушке”. И напомню, что код принадлежит не мне - я только попытался разобраться, как он работает.
У меня есть сервы, со созжеными неправильным подключением внутренними платами. Возможно до них дойдут руки. Когда нибудь.
Вы описали прямой привод с FOC – это ровно то, на чём ездит MIT Cheetah. Ключ там не в скорости отклика, а в том, что МК управляет моментом, а не углом: нога сама амортизирует удар, и никакой temp_speed уже не нужен.
Разбор мат-модели четырехногого робота-«паука»