谁能帮帮我做机械狗

奈何桥头逗鬼 2023-10-5 5049

上了高中要做傻卵课题,报了个工作站,分到了机械狗的课题,对我这个外行,这东西越上手越头大,到了后面你会发现步态是真没有思路。

先是建模,最后做成了这个样子,中途搞搞弄弄了好几回,就不该在这上面花功夫太久的

实物如下

此时3/4的暑假已经过去......本以为可以歇一会了,马上工作站通知要中期答辩了,我就赶紧上手看看怎么做步态,发现是真不会,这条狗这怎么让它动起来啊啊啊啊啊啊啊啊啊!!!!!!去问老师,老师的回答非常浅显易懂:你上网焯一下,反正你一个高中牲没必要全部原创。

行,到网上搜了一下,要么长得不像,要么用的不是arduino,最终找到一个能抄的,但由于不是各个的机械狗不是同一个样的,所以步态非常奇葩,步态的视频我放在后面。

我知道里世界有很多大佬,像天羽,就帮我理解一下pos()这个函数到底是怎么样运作(?或者说这个方程的具体详解)就行了,我是真的搞不明白。以下是代码。

#include <Servo.h>

Servo s[12];
int zeroPositions[12] = {90, 95, 90, 90, 80, 90, 90, 95, 90, 90, 80, 90};
int directions[12] = {-1, -1, -1, -1, +1, +1, +1, -1, -1, +1, +1, +1};

const float l = 5.8;
const float L = 6.0;

void pos(float x, float y, float z, int leg){
  float groinRadians = atan(y/z);
  float groinDegrees = groinRadians * (180/PI);

  float hipRadians1 = atan(x/z);

  float z1 = sqrt(sq(z) + sq(y) + sq(x));
 
  float hipRadians2 = acos(z1/(2*l));
  float hipDegrees = (hipRadians1 + hipRadians2) * (180/PI);
 
  float kneeRadians = PI - 2*hipRadians2;
  float kneeDegrees = 180 - kneeRadians * (180/PI);

  s[3*leg].write(zeroPositions[3*leg] + directions[3*leg]*groinDegrees);
  s[3*leg+1].write(zeroPositions[3*leg+1] + directions[3*leg+1]*hipDegrees);
  s[3*leg+2].write(zeroPositions[3*leg+2] + directions[3*leg+2]*kneeDegrees);
}

void translate(float x, float y, float z){
  for (int leg = 0; leg<=3; leg++){
    pos(x,y,z,leg);
  }
}

void rotate(float theta){
  float thetaRadians = theta * (PI/180);
  float d = tan(thetaRadians) * (L/2);

  Serial.println(d);

  pos(0,0,8.0+d,0);
  pos(0,0,8.0+d,1);
  pos(0,0,8.0-d,2);
  pos(0,0,8.0-d,3);
}

void takeStep(float stepSpeed, float stepLength){
  pos(+stepLength,0,9,0);
  pos(-stepLength,0,9,1);
  pos(-stepLength,0,9,2);
  pos(+stepLength,0,9,3);
  delay(stepSpeed);
  pos(+stepLength,0,8,0);
  pos(-stepLength,0,9,1);
  pos(-stepLength,0,9,2);
  pos(+stepLength,0,8,3);
  delay(stepSpeed);
  pos(-stepLength,0,8,0);
  pos(+stepLength,0,9,1);
  pos(+stepLength,0,9,2);
  pos(-stepLength,0,8,3);
  delay(stepSpeed);
  pos(-stepLength,0,9,0);
  pos(+stepLength,0,9,1);
  pos(+stepLength,0,9,2);
  pos(-stepLength,0,9,3);
  delay(stepSpeed);
  pos(-stepLength,0,9,0);
  pos(+stepLength,0,8,1);
  pos(+stepLength,0,8,2);
  pos(-stepLength,0,9,3);
  delay(stepSpeed);
  pos(+stepLength,0,9,0);
  pos(-stepLength,0,8,1);
  pos(-stepLength,0,8,2);
  pos(+stepLength,0,9,3);
  delay(stepSpeed);
}

void sideStep(){
  pos(0,0,8,0);
  pos(0,0,8,1);
  pos(0,0,8,2);
  pos(0,0,8,3);
  delay(100);
  pos(0,0,10,0);
  pos(0,2,8,1);
  pos(0,0,10,2);
  pos(0,2,8,3);
  delay(100);
  pos(0,3,9,0);
  pos(0,-3,9,1);
  pos(0,3,9,2);
  pos(0,-3,9,3);
  delay(500);
  pos(0,0,9,0);
  pos(0,-3,9,1);
  pos(0,0,9,2);
  pos(0,-3,9,3);
  delay(100);
  pos(0,0,9,0);
  pos(0,0,9,1);
  pos(0,0,9,2);
  pos(0,0,9,3);
  delay(100);
}

void setup() {
  // put your setup code here, to run once:
  delay(1000);
  Serial.begin(9600);
  for(int i=0; i<12; i++){
     s[i].attach(i + 2);
  }
  for(int i=0; i<12; i++){
     s[i].write(zeroPositions[i]);
  }
  delay(300);
  Serial.print("Ready.");
}

void loop() {
  // put your main code here, to run repeatedly:
}

帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我帮帮我

谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你谢谢你

最后于 2023-10-5 被奈何桥头逗鬼编辑 ,原因:
上传的附件:
交嘉隶人,饮水堵源
最新回复 (5)
  • 奈何桥头逗鬼 2023-10-5
    0 2

    其实只要能看懂C++,加上优秀的数学就能看懂pos()了,虽然我明天也会硬着头皮把它弄明白,但还是希望有能力的人今天帮帮我

    最后于 2023-10-5 被奈何桥头逗鬼编辑 ,原因:
    交嘉隶人,饮水堵源
  • 奈何桥头逗鬼 2023-10-5
    0 3
    喀秋莎 为啥不做个按摩棒之类的啊,能震动就行,多简单。
    这个玩意要去比赛,有专家评审,结果你在众目睽睽之下掏出来...震动棒?
    我怕连三等奖都拿不到
    除此以外,去大学面试人家也会看你的课题,人家问你做了个啥,你在面试考官面前自信说出...震动棒?
    我怕没人敢要我
    交嘉隶人,饮水堵源
  • 奈何桥头逗鬼 2023-10-29
    0 4
    星辰乄 c++你这些个函数我都没用过,我就是猜测acos atan之类的应该是arccos和arctan吧?因为看着好像需要输出的参数是角度。 代码都不复杂, 1.通过arctan和arccos xy ...
    代码我完全明白的,但作为一个普通的高中学生,微分方程,或者是数学建模,完全搞不懂,而我希望有个大佬能像奶妈一样把这些东西直接塞到我嘴里
    交嘉隶人,饮水堵源
  • 奈何桥头逗鬼 2023-10-29
    0 5
    星辰乄 c++你这些个函数我都没用过,我就是猜测acos atan之类的应该是arccos和arctan吧?因为看着好像需要输出的参数是角度。 代码都不复杂, 1.通过arctan和arccos xy ...

    幸好找到了一位大佬,他带我慢慢调试。毕竟就算腿长d是对的,这些都是从网上抄下来的,什么公式啥的都没给,也不可能完全适配,只能慢慢调。

    交嘉隶人,饮水堵源
  • 奈何桥头逗鬼 2023-10-29
    0 6
    星辰乄 代码不难,但是建模数据有吗?这个东西应该都是自己定制吧。 你这个代码我看懂了但我一下子看不懂里边蕴含的数学信息,你要说让人从代码逆推建模推导式,那有点太累了,我不干。 如果这个代码不是你的,那么我 ...
    对,看的时候就是过程都明白,但就是不明白怎么计算的
    交嘉隶人,饮水堵源
    • ACG里世界
      7
          
返回
发新帖