Revivemos o hexapod. Parte TRÊS

Como a prática demonstrou, a abundância de código no artigo não afeta muito sua legibilidade. Mas, para entender como tudo funciona, às vezes custa sobrecarregar o cérebro. A que se destinava a publicação anterior. Hoje, tentarei concluir uma série de artigos sobre o preenchimento do software hexapod, fornecendo uma breve visão geral do que não conhecemos.

O ciclo dos artigos anteriores:


Como imprimimos o hexapod e o que veio
dele, revivemos o hexapod. Parte I
Revivemos o hexapod. Parte dois

Configuração


As características físicas do robô são definidas no programa como um conjunto de parâmetros de configuração e transferidas para um arquivo de configuração separado config.h . Entre esses parâmetros, os seguintes grupos principais podem ser distinguidos:

Tamanhos dos membros e características de seus movimentos
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


A localização e orientação dos membros do robô em relação ao seu centro
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


Intervalos de ângulo admissíveis para servoconversores
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


Características de movimento do robô
MOTION_JOB_PERIOD()
MOVE_STEP()
ROTATE_STEP()


Matemática


Para calcular a cinemática direta e reversa do robô, são necessários cálculos vetoriais e matriciais. Isso é feito usando as classes Vector3D e Matrix3D declaradas em 3d_math.h

struct Vector3D
struct Vector3D {
  float x,y,z;

  Vector3D operator -(void) {
    return {-x, -y ,-z};
  }                        

  Vector3D& operator=(const Vector3D a);
  
  float len();
};


struct Matrix3D
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;
  };
};

Sobrecarga do operador e funções auxiliares
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);


Código fonte


Todos os arquivos de origem estão agora disponíveis no GitHub . Lá você encontra o aplicativo de rascunho para Android e modelos para impressão 3D. A seção do arduino consiste em duas seções:

  • main - o conjunto principal de arquivos para o controlador Arduino
  • wifi - firmware para esp8622 necessário para organizar um canal de comunicação via Wi-Fi

Qual é o próximo?


Apesar de este artigo ser de natureza final, os tópicos de organização de um canal de comunicação via Wi-Fi e controle via Android permaneceram fora de vista. Se esses tópicos forem de interesse ou se ainda houver outros problemas pendentes, escreva sobre isso nos comentários ou na correspondência pessoal. Definitivamente tentarei dar uma resposta detalhada ou dedicar um artigo separado a isso.

O projeto Geksa continuará seu desenvolvimento. Em um futuro próximo, está planejado alterar a composição dos componentes eletrônicos, expandir a funcionalidade, finalizar a carcaça do robô e fazer adições de software. Ficarei feliz em ouvir de você comentários ou sugestões construtivas.

Obrigado!

All Articles