Обратная кинематика на дуине

Тема в разделе "Arduino & Shields", создана пользователем cody_c++, 15 мар 2018.

  1. cody_c++

    cody_c++ Нерд

    Кратко: хочу функцию, которая получает x,y,z,угол инструмента относительно оси OY, и будет выдавать мне углы для четырех серв. Формулу написал, в коде воплотил, но...
    Дуина не дружит с плавающей точкой и возвращает NAN NAN NANI

    Был бы очень благодарен, если кто то сможет подправить этот код и заставить его работать. Что Я пробовал:

    1.Поменять типы данных на int, выдает белиберду
    2.Поменять локальные переменные на глобальные и наоборот
    3.Вынести вычисления из этой функции и считать напрямик
    4.Танцевать с бубном и принести в жертву кота
    5.Послать все и использовать готовую либу (отборный шлак)

    Сам код, библиотек не требует:

    Код (C++):
    const float a = 125;
    const float b = 125;
    const float L3 = 50;
    const float L0 = 80;
    float axis1;
    float axis2;
    float axis3;
    float axis4;
    void setup() {
      Serial.begin(9600);

      IK(0,125,155,90);

      Serial.print(axis2);
      Serial.print(' ');
      Serial.print(axis3);
      Serial.print(' ');
      Serial.println(axis4);
    }

    void loop() {


    }

    void IK(float x, float y, float z, float beta){
      y = y-(cos(beta)*L3);
      z = z+L0+(sin(beta)*L3);
      float l = sqrt(x*x + y*y);
      float c = sqrt(l*l + z*z);
      axis1=acos(y/l);
      axis2=acos(b*b+c*c-a*a)/(2*b*c)+acos(l*l+c*c-y*y)/(2*x*c);
      axis3=180-axis2-acos(a*a+c*c-b*b)/(2*a*c);
      axis4=180-axis2-axis3+beta;
    }
     
     
  2. AlexU

    AlexU Гуру

    Дружит вполне себе нормально. Вот только нужно следить, что бы аргумент у функции 'acos' не выходил за пределы -1 .. 1. Иначе ей (функции 'acos') немножечко плохо становится.
     
    cody_c++ и arkadyf нравится это.
  3. b707

    b707 Гуру

    и еще не стоит забывать, что аргументы функций cos() sin() tan() - задаются в радианах. Судя по числам в коде ТС, я бы предположил, что у него там градусы.
     
    cody_c++ и arkadyf нравится это.
  4. cody_c++

    cody_c++ Нерд

    Не совсем понял, как это? Раньше пользовался в вычислениях попроще, проблем не было
     
  5. cody_c++

    cody_c++ Нерд

    Попробовал посчитать это на калькуляторе, все правильно
     
  6. parovoZZ

    parovoZZ Гуру

    Что не понял? Чем радианы отличаются от градусов? Так в 10-ом классе, дисциплина "тригонометрия" называется.
    Напомню - 180 градусов - это ПИ радиан. Полный оборот вектора - это 2ПИ радиан. Остальные градусы по аналогии.
     
  7. b707

    b707 Гуру

    Тригонометрию в школе прогулял? - на калькуляторе у тебя в косинусе градусы. а в ардуине - радианы. Разницу понимаешь? - твой код может в калькуляторе правильный ответ давать, а в ардуине нет.
     
    Последнее редактирование: 16 мар 2018
  8. cody_c++

    cody_c++ Нерд

    У меня тригонометрии пока не было. Как я понял от parovoZZ, перевод градусов в радианы будет (Х*ПИ)/2, а наоборот 180Х/ПИ, все верно? Переделаю формулу под это и поделюсь результатом!
     
  9. AlexU

    AlexU Гуру

    (X*ПИ)/180
     
    cody_c++ нравится это.