谁能帮帮我做机械狗

奈何桥头逗鬼 6月前 1972

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

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

实物如下

此时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:
}

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

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

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

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

    最后于 6月前 被奈何桥头逗鬼编辑 ,原因:
    交嘉隶人,饮水堵源
  • 喀秋莎 6月前
    3 3
    为啥不做个按摩棒之类的啊,能震动就行,多简单。
    我在上班,别发骚图了。
  • 0 4
    喀秋莎 为啥不做个按摩棒之类的啊,能震动就行,多简单。
    这个玩意要去比赛,有专家评审,结果你在众目睽睽之下掏出来...震动棒?
    我怕连三等奖都拿不到
    除此以外,去大学面试人家也会看你的课题,人家问你做了个啥,你在面试考官面前自信说出...震动棒?
    我怕没人敢要我
    交嘉隶人,饮水堵源
  • 喀秋莎 6月前
    1 5
    奈何桥头逗鬼 这个玩意要去比赛,有专家评审,结果你在众目睽睽之下掏出来...震动棒? 我怕连三等奖都拿不到 除此以外,去大学面试人家也会看你的课题,人家问你做了个啥,你在面试考官面前自信说出...震动棒? 我 ...
    确实有点社死,但是只要你不尴尬,尴尬的就是评委。
    我在上班,别发骚图了。
  • 良稗君 6月前
    0 6
    紧急避孕
    考大学去了
  • 欧派兽 6月前
    0 7
    奖励三级精华
    1:管理员给你移区后会显示移到了你之前发帖的区。 2:点击我作为楼主发帖时一楼下的图片签名,可以跳转到站规教程贴。 3:多次水贴水回复会封号哦? 4:不知道回什么的时候就点“里世界专属”,一键随机生成几种回复内容。 5:祝你在里世界玩得愉快!
  • a1021 6月前
    0 8
    有H情节吗
    这个人很懒,什么也没有留下!
  • 联盟X 6月前
    0 9
    知识盲区,下一个
    匡扶汉室!
  • 联盟X 6月前
    1 10
    喀秋莎 确实有点社死,但是只要你不尴尬,尴尬的就是评委。
    不是,你这,你这就是奔着变态合集去的啊
    匡扶汉室!
  • 0 11
    紧急避孕
    你眼中倒映的星辰,是我不曾见过的美好
  • 平均体 6月前
    0 12
    奈何桥头逗鬼 这个玩意要去比赛,有专家评审,结果你在众目睽睽之下掏出来...震动棒? 我怕连三等奖都拿不到 除此以外,去大学面试人家也会看你的课题,人家问你做了个啥,你在面试考官面前自信说出...震动棒? 我 ...
    按摩仪
    问题不大~
  • 星辰乄 6月前
    0 13
    代码不难,但是建模数据有吗?这个东西应该都是自己定制吧。
    你这个代码我看懂了但我一下子看不懂里边蕴含的数学信息,你要说让人从代码逆推建模推导式,那有点太累了,我不干。
    如果这个代码不是你的,那么我建议你要不去找代码原地址问问建模数据和推导式,要么下苦功夫逆推,代码挺直白,带几组数据进去推导一下应该能得,但就是参数挺多,自己干的话估计会是个繁琐的工作
  • 星辰乄 6月前
    0 14
    c++你这些个函数我都没用过,我就是猜测acos atan之类的应该是arccos和arctan吧?因为看着好像需要输出的参数是角度。

    代码都不复杂,
    1.通过arctan和arccos xyz对应逆反函数的角度值,这个大概是先得到当前位置
    2.通过180/派转化单位,我猜你实参,也就是传出参数应该是圆周角度参数。
    3.通过某种数学变换得到对应位置的下一个行进点,写入s数组传出,那s应该是个全局数组,且应该直接作用于你的机器,或者说这应该是控制端口。

    接下来你的任务就是找到建模推导式,根据你那个机器狗各个关节材质和控制单元参数,修改你的推导式。
    因为为了保证协调性,腿长不同,那么摆动角度就会不同,一般而言,在接触同一平面时,腿越长,角度越小,腿越短,角度越大。
    比如说,我就是打个比方哈,不一定是这么回事,具体看建模,
    人家的大腿腿长为r摆动平面直角坐标(应该是空间坐标系,但为了好解说就降级一个维度)第一象限一个θ的角度,那么你就需要测量你的狗的腿长d,与他的r做恒等或者对应变换,通过关系式得到你应该摆动的角度。
    这个关系式一般是一个什么微分方程啊什么的,我没接触过机器人比赛,不太知道这个领域哈,只是以前的工作涉及数学建模的工作。
  • 0 15
    星辰乄 c++你这些个函数我都没用过,我就是猜测acos atan之类的应该是arccos和arctan吧?因为看着好像需要输出的参数是角度。 代码都不复杂, 1.通过arctan和arccos xy ...
    代码我完全明白的,但作为一个普通的高中学生,微分方程,或者是数学建模,完全搞不懂,而我希望有个大佬能像奶妈一样把这些东西直接塞到我嘴里
    交嘉隶人,饮水堵源
  • 0 16
    星辰乄 c++你这些个函数我都没用过,我就是猜测acos atan之类的应该是arccos和arctan吧?因为看着好像需要输出的参数是角度。 代码都不复杂, 1.通过arctan和arccos xy ...

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

    交嘉隶人,饮水堵源
  • 0 17
    星辰乄 代码不难,但是建模数据有吗?这个东西应该都是自己定制吧。 你这个代码我看懂了但我一下子看不懂里边蕴含的数学信息,你要说让人从代码逆推建模推导式,那有点太累了,我不干。 如果这个代码不是你的,那么我 ...
    对,看的时候就是过程都明白,但就是不明白怎么计算的
    交嘉隶人,饮水堵源
  • 星辰乄 5月前
    0 18
    奈何桥头逗鬼 对,看的时候就是过程都明白,但就是不明白怎么计算的
    找个数学的或者物理的大学生或者硕研或者比较牛b的本校的高中学霸,交个朋友,让他给你推到一个圆周角速的具体关系模型,就可以了。
    • ACG里世界
      19
          
返回
发新帖