极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10794|回复: 2

我想用自定义函数返回两个数据,两个数据用数组返回,这样写对吗?

[复制链接]
发表于 2015-6-8 11:39:13 | 显示全部楼层 |阅读模式
函数体
  1. float *avedistance(float Ldistance,float Rdistance)//取10平均值函数
  2. {
  3.   float L[10];
  4.   float R[10];
  5.   float SL=0;
  6.   float SR=0;
  7.   int i;
  8.   float *AD=new float[2];
  9.   for(i=0;i<=9;i++)
  10.   {
  11.     L[i]=Ldistance;
  12.     R[i]=Rdistance;
  13.   }

  14.   i=0;
  15.   while(i<=9)
  16.   {
  17.     SL+=L[i];
  18.     SR+=R[i];
  19.     i++;
  20.   }
  21.   AD[0]=SL/10;
  22.   AD[1]=SR/10;
  23.   return AD;}                                             
复制代码
调用函数
  1.   ldistance=avedistance[0];            
  2.   rdistance=avedistance[1];
复制代码
回复

使用道具 举报

 楼主| 发表于 2015-6-8 11:41:28 | 显示全部楼层
控制机械臂的全部程序在这里
  1. #include <Servo.h>
  2. const int Ltrigpin=3;
  3. const int Lechopin=2;
  4. const int Rtrigpin=5;
  5. const int Rechopin=4;
  6. int i;
  7. int catchopen=30;
  8. int catchclose=85;
  9. float Distance1;
  10. float Distance2;
  11. float between=4.5;
  12. float Angle;
  13. float x;
  14. float x0;
  15. float y;
  16. float y0;
  17. float Avedistance[2];
  18. float ldistance;
  19. float la;
  20. float rdistance;
  21. float ra;
  22. float baseangle=20;
  23. float baseangle1;
  24. float baseangle2;
  25. Servo servoarm1;
  26. Servo servoarm2;
  27. Servo servokich;
  28. Servo servobase;
  29. float l[10];
  30. float r[10];
  31. float Ldistance ()                              //左超声波测距函数
  32. {
  33.     float Ldistance;
  34.     digitalWrite(Ltrigpin,LOW);
  35.     delayMicroseconds(2);
  36.     digitalWrite(Ltrigpin,HIGH);
  37.     delayMicroseconds(10);
  38.     digitalWrite(Ltrigpin,LOW);
  39.     Ldistance=pulseIn(Lechopin,HIGH)/58.00;
  40.     return Ldistance;
  41.     delay(50);}                                          
  42. float Rdistance ()                              //右超声波测距函数
  43. {
  44.     float Rdistance;
  45.     digitalWrite(Rtrigpin,LOW);
  46.     delayMicroseconds(2);
  47.     digitalWrite(Rtrigpin,HIGH);
  48.     delayMicroseconds(10);
  49.     digitalWrite(Rtrigpin,LOW);
  50.     Rdistance=pulseIn(Rechopin,HIGH)/58.00;
  51.     return Rdistance;
  52.     delay(50);}                                          
  53. float *avedistance(float Ldistance,float Rdistance)//取10平均值函数
  54. {
  55.   float L[10];
  56.   float R[10];
  57.   float SL=0;
  58.   float SR=0;
  59.   int i;
  60.   float *AD=new float[2];
  61.   for(i=0;i<=9;i++)
  62.   {
  63.     L[i]=Ldistance;
  64.     R[i]=Rdistance;
  65.   }

  66.   i=0;
  67.   while(i<=9)
  68.   {
  69.     SL+=L[i];
  70.     SR+=R[i];
  71.     i++;
  72.   }
  73.   AD[0]=SL/10;
  74.   AD[1]=SR/10;
  75.   return AD;}                                             
  76. float distance(float l,float r,float b)         //长度函数
  77. {
  78.   float d;
  79.   d=sqrt((l*l/2)+(r*r/2)-(b*b/4));
  80.   return d;}                                             
  81. float angle(float b,float l,float d)            //角度函数
  82. {
  83.   float angle;
  84.   angle=90-acos((l*l)+(d*d)-(b*b/4)/b*d);
  85.   return angle;}                                            
  86. float maindistance(float d,float b,float l)     //轴心长度函数
  87. {
  88.   float distance;
  89.   distance=sqrt(d*d+100-20*d*cos(90+acos((l*l)+(d*d)-(b*b/4)/b*d)));
  90.   return distance;}                                          
  91. float mainangle(float distance,float d)         //轴心角度函数
  92. {
  93.   float mainangle;
  94.   mainangle=acos((distance*distance+100-d*d)/20*distance);
  95.   return mainangle;}                                          
  96. float zuobiaozhuanhuan(float x,float x0,float dx,float y,float y0)//到下一位置的xy对应坐标
  97. {
  98.       float dy;
  99.       float k;
  100.       if(x==x0)
  101.       {
  102.         dy=y;   
  103.       }
  104.       k=(y-y0)/(x-x0);
  105.       dy=(k*dx)+y0;
  106.       return dy;}
  107. float arm1bending(float a,float b,float x,float y)//臂1水平角度函数
  108. {
  109.   float arm1angle1;
  110.   float arm1angle2;
  111.   float arm1angle;
  112.         float c;
  113.   c=x*x+y*y;
  114.   float d;
  115.         float e;
  116.         d=pow(a,2)+c-pow(b,2);
  117.         e=2*a*sqrt(c);
  118.   arm1angle1=(acos(d/e))*180/3.14159;
  119.   arm1angle2=atan(y/x)*180/3.14159;
  120.   arm1angle=arm1angle1+arm1angle2;
  121.   return arm1angle;}                                          
  122. float arm2bending(float arm1angle,float a,float b,float y)//臂2水平角度函数
  123. {
  124.   float arm2angle;
  125.         float f;
  126.         f=(sin(arm1angle*3.14159/180))*a-y;
  127.         arm2angle=(asin(f/b))*180/3.14159;
  128.   return arm2angle;}                                          
  129. float springangle(float a)                         //舵机角度校正
  130. {
  131.   float b;
  132.   b=0.61111 * a + 32;
  133.   return b;}                                          
  134. float movment(float x,float y,float x0,float y0)   //机械臂移动
  135. {
  136.   float arm1=296;
  137.   float arm2=320;
  138.   float arm1angle;
  139.   float actarm1angle;
  140.   float arm2angle;
  141.   float dx;
  142.   float dy;
  143.   if(x>x0)
  144.   {
  145.     for(dx=x0;dx<=x;dx++)
  146.     {
  147.         dy=zuobiaozhuanhuan(x,x0,dx,y,y0);
  148.         arm1angle=arm1bending(arm1,arm2,dx,dy);
  149.         actarm1angle=180-springangle(arm1angle);
  150.         arm2angle=arm2bending(arm1angle,arm1,arm2,dy);
  151.         servoarm1.write(actarm1angle);
  152.         servoarm2.write(arm2angle);
  153.         delay(20);
  154.     }
  155.   }
  156.   else
  157.   { if(x<x0)
  158.     {
  159.       
  160.       for(dx=x0;dx>=x;dx--)
  161.       {
  162.         dy=zuobiaozhuanhuan(x,x0,dx,y,y0);
  163.         arm1angle=arm1bending(arm1,arm2,dx,dy);
  164.         actarm1angle=180-springangle(arm1angle);
  165.         arm2angle=arm2bending(arm1angle,arm1,arm2,dy);
  166.         servoarm1.write(actarm1angle);
  167.         servoarm2.write(arm2angle);  
  168.         delay(20);
  169.       }
  170.     }
  171.     else
  172.     {
  173.       if(y>y0)
  174.       { for(dy=y0;dy<=y;dy++)
  175.         {
  176.           dx=x;
  177.           arm1angle=arm1bending(arm1,arm2,dx,dy);
  178.           actarm1angle=180-springangle(arm1angle);
  179.           arm2angle=arm2bending(arm1angle,arm1,arm2,dy);
  180.           servoarm1.write(actarm1angle);
  181.           servoarm2.write(arm2angle);  
  182.           delay(20);
  183.         }
  184.       }
  185.       else
  186.       {
  187.         for(dy=y0;dy<=y;dy--)
  188.         {
  189.           dx=x;
  190.           arm1angle=arm1bending(arm1,arm2,dx,dy);
  191.           actarm1angle=180-springangle(arm1angle);
  192.           arm2angle=arm2bending(arm1angle,arm1,arm2,dy);
  193.           servoarm1.write(actarm1angle);
  194.           servoarm2.write(arm2angle);
  195.           delay(20);
  196.         }   
  197.         
  198.       }
  199.     }
  200.   }
  201.   x0=x;
  202.   y0=y;
  203. }                                         
  204. void setup()
  205. {
  206.   Serial.begin(9600);
  207.   pinMode(Ltrigpin,OUTPUT);
  208.   pinMode(Lechopin,INPUT);
  209.   pinMode(Rtrigpin,OUTPUT);
  210.   pinMode(Rechopin,INPUT);
  211.   servokich.attach(6);  
  212.   servoarm1.attach(9);
  213.   servoarm2.attach(10);
  214.   servobase.attach(11);}

  215. void loop()
  216. {
  217.   do{   
  218.      ldistance=Ldistance();                                    //第一阶段,左超声波传感器传回数据前底座转动
  219.      baseangle++;
  220.      servobase.write(baseangle);
  221.      delay(100);
  222.     }
  223.   while (ldistance<=50);
  224.   do{ rdistance=Rdistance();                                  //第二阶段,右超声波传感器传回数据前底座微调
  225.       baseangle+=0.5;
  226.       servobase.write(baseangle);
  227.       delay(100);
  228.     }
  229.    while (rdistance<=50);
  230.   baseangle-=5;                         //避免右超声波传感器传回空值
  231.   servobase.write(baseangle);
  232.   delay(300);
  233.   baseangle+=6;
  234.   servobase.write(baseangle);
  235.   baseangle1=baseangle;
  236.   delay(300);
  237.   ldistance=avedistance[0];             //底板对准目标程序
  238.   rdistance=avedistance[1];
  239.   Distance1=distance(ldistance,rdistance,between);
  240.   Angle=angle(between,ldistance,Distance1);
  241.   Distance2=maindistance(Distance1,between,ldistance);
  242.   baseangle2+=mainangle(Distance2,Distance1);
  243.   for(baseangle=baseangle1;baseangle<=baseangle2;baseangle++)
  244.   {
  245.     baseangle+=0.5;
  246.     servobase.write(baseangle);
  247.     delay(50);
  248.   };
  249.   servokich.write(catchopen);                     //加持张开
  250.   movment(maindistance,50,200,100);              //移动向目标位置
  251.   servokich.write(catchclose);                    //加持闭合
  252.   movment(200,100,maindistance,50);              //机械臂收回  
  253.   servobase.write(20);                            //机械臂对准放置位置
  254.   movment(200,50,200,100);                        //机械臂张开
  255.   servokich.write(catchopen);                     //加持放开
  256.   movment(200,100,200,50);                        //机械臂收回
  257.   baseangle=baseangle2;
  258.   servobase.write(baseangle);                     //旋转至前一目标角度
  259.   if (baseangle==160)                             //当大于160度时机械臂返回起始角度
  260.   {
  261.     baseangle=20;
  262.     servobase.write(baseangle);
  263.   }
  264. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-6-8 22:27:28 | 显示全部楼层
程式太長了, 沒時間看, 只看了第一節, 有空再慢慢看.

以下的一部份, 好像什麼也沒計算, 把同一個數加 10 次再 除10?

  1.   
  2.   float L[10];
  3.   float R[10];
  4.   float SL=0;
  5.   float SR=0;
  6.   int i;
  7.   float *AD=new float[2];
  8.   for(i=0;i<=9;i++)
  9.   {
  10.     L[i]=Ldistance;
  11.     R[i]=Rdistance;
  12.   }

  13.   i=0;
  14.   while(i<=9)
  15.   {
  16.     SL+=L[i];
  17.     SR+=R[i];
  18.     i++;
  19.   }
  20.   AD[0]=SL/10;
  21.   AD[1]=SR/10;
复制代码


L[0] - L[9] 都是 Ldistance, SL 就是 10 個 Ldistance 加起來, 而 AD[0] 就是把 SL / 10......
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 07:35 , Processed in 0.035962 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表