我们复兴了六足动物。第三部分

如实践所示,文章中的大量代码不会很好地影响其可读性。但是,要了解它们的工作原理,有时会花费您的大脑。先前出版物的目的是什么。今天,我将通过简要概述我们没有时间开会的内容,尝试完成有关hexapod软件填充的系列文章。

先前文章的周期:


我们如何印刷六足动物以及
它的来龙去脉。第一部分
我们复兴了六足动物。第二部分

组态


机械手的物理特性在程序中定义为一组配置参数,并传输到单独的配置文件config.h中在这些参数中,可以区分以下主要组:

四肢的大小及其运动特征
识别码功能说明
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


机器人四肢相对于其中心的位置和方向
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


伺服驱动器的允许角度范围
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


机器人运动特性
MOTION_JOB_PERIOD()
MOVE_STEP()
ROTATE_STEP()


数学


为了计算机器人的正向和反向运动学,需要向量和矩阵计算。这是使用3d_math.h中声明Vector3DMatrix3D完成的

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

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

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


结构体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;
  };
};

操作员重载和辅助功能
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);


源代码


现在,所有源文件都可以在GitHub找到您可以在其中找到适用于Android的草稿应用程序以及用于3D打印的模型。arduino部分包括两个部分:

  • main -Arduino控制器的主要文件集
  • wifi -esp8622的固件需要通过Wi-Fi组织通信通道

下一步是什么?


尽管本文具有最终性质,但通过Wi-Fi组织通信渠道和通过Android控制组织的话题仍然遥遥无期。如果您对这些主题感兴趣,或者还有其他未解决的问题,请在评论或个人信件中写上有关此主题的信息。我一定会尝试给出详细的答案或在此单独发表文章。

Geksa项目将继续发展。在不久的将来,计划改变电子元件的组成,扩展功能,最终确定机器人机体,增加软件。我很高兴收到您的建设性意见或建议。

谢谢!

All Articles