Pull to refresh

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 уже не нужен.

Sign up to leave a comment.

Articles