我需要制作一个代码来移动一个机器人的单臂,其中包含基于某个给定(x,y)
点的三个光束,而theta0
必须从0
开始。然后应根据以下内容计算xd
和yd
:
xd = x - L cos(theta)
yd = y - L cos(theta)
其中L
是第一个单臂光束,theta
从0
开始,x
和y
输入。
现在,根据计算出的xd
和yd
,它们将用于计算theta1
和theta2
。
这三个角度应该发送到伺服电机。
但是,当我输入x
和y
时,不会显示任何内容!如果你知道一些有用的链接可以帮助我解决这个问题,我们将非常感激。
序列号是:
#include <Servo.h>
#include <String.h>
#include <math.h>
Servo motor;
String content = "";
char character;
int yindex;
char End ;
String x,y;
int xt, yt;
float L0=297;
float L1=198;
float L2=165;
float theta0=0;
float theta1, theta2;
float xd,yd;
float xc,yc;
void setup()
{
Serial.begin(9600);
motor.attach(9,660,2600);
}
void loop()
{
if (Serial.available ()>0)
{
while(Serial.available())
{
character = Serial.read();
content.concat(character);
content += character;
Serial.println (content);
End=content.length();
yindex= content.indexOf("y");
x=content.substring(1,yindex);
y=content.substring(yindex+1, End);
Serial.println (x);
Serial.println (y);
xt=x.toInt();
Serial.println(xt);
yt=y.toInt();
Serial.println(yt);
for ( theta0=0; theta0<180; theta0+=0.1)
{
xd= xt-L0*cos(theta0);
yd= yt-L0*cos(theta0);
theta2 = acos((sq(xd)+sq(yd)- sq(L1)-sq(L2))/(2*L1*L2));
theta1 = asin((L2*sin(theta2))/sqrt(sq(xd)+sq(yd)))+atan(yd/xd);
Serial.println("The value of theta2 is : ");
Serial.println(theta2);
Serial.println("The value of theta1 is : ");
Serial.println(theta1);
xc = L0*cos(theta0) + L1*cos(theta1) + L2*cos(theta2);
yc= L0*sin(theta0) + L1*sin(theta1) + L2*sin(theta2);
Serial.println("The value of the calculated x is : ");
Serial.println(xc);
Serial.println("The value of the calculated y is : ");
Serial.println(yc);
Serial.println("The value of theta0:");
Serial.println(theta0);
theta0=theta0*(180/3.14);
theta1=theta1*(180/3.14);
theta2=theta2*(180/3.14);
if (theta1<=-180 && theta1>=0 && theta2>=0 && theta2 <=-180)
{
break;
}
}
}
}
content="";
}
答案 0 :(得分:0)
这里有很多问题。您应该通过一次测试解决方案的每个步骤来解决这样的问题,这样您就不会遇到大问题。首先,您需要确保正确读取字符串。
部分代码无法正常工作,因为{}
循环周围的while(Serial.available())
不在正确的位置。此外,您还要使用+=
和concat
两次追加新字符。这是一个简单的解决方案来正确获取字符串。延迟是允许下一个字节可用,因此它不会过早退出循环。
content="";
while (Serial.available() < 1) {}
while (Serial.available())
{
character = Serial.read();
content += character;
delay(10);
}
Serial.print("content = "); Serial.println (content);
接下来,您需要解析字符串中x和y的值。这里也有几个问题。我不认为你想对x和y使用整数,所以你需要一种方法将字符串解释为float。以下是如何将值解析为浮点数。
End=content.length();
yindex= content.indexOf("y");
x=content.substring(1,yindex);
y=content.substring(yindex+1, End);
Serial.print("x = "); Serial.println (x);
Serial.print("y = "); Serial.println (y);
char xbuf[10] = "";
x.toCharArray(xbuf, 10);
xt = atof(xbuf);
Serial.print("xt = "); Serial.println(xt);
char ybuf[10] = "";
y.toCharArray(ybuf, 10);
yt = atof(ybuf);
Serial.print("yt = "); Serial.println(yt);
这应该足以让你继续前进。在稍后的代码中你的数学有一些问题,但是在你使用print语句之后这应该更容易解决。注意 - 此代码期望来自串行监视器的格式为x0.34y0.678
格式,其中0.34
是x
的值,0.678
是y
的值}。