Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arduino 转换相交区域以生成坐标_Arduino_Processing_Computational Geometry_Coordinate Systems_Trilateration - Fatal编程技术网

Arduino 转换相交区域以生成坐标

Arduino 转换相交区域以生成坐标,arduino,processing,computational-geometry,coordinate-systems,trilateration,Arduino,Processing,Computational Geometry,Coordinate Systems,Trilateration,我在做一个项目,从电阻式触摸屏上获取模拟值,并将其转换为交点 以下是一个例子: 下面是我使用Arduino Uno进行数据收集的代码,以及使用名为processing的工具构建点的代码 #定义侧边1 2 #定义侧2 3 #定义侧3 4 #定义侧4 5 #定义触点A0 无效设置(){ pinMode(触点、输入); 引脚模式(侧1,输出); 引脚模式(侧2,输出); 引脚模式(第3侧,输出); 引脚模式(侧4,输出); Serial.begin(9600); } void循环(){ int-sen

我在做一个项目,从电阻式触摸屏上获取模拟值,并将其转换为交点

以下是一个例子:

下面是我使用Arduino Uno进行数据收集的代码,以及使用名为processing的工具构建点的代码

#定义侧边1 2
#定义侧2 3
#定义侧3 4
#定义侧4 5
#定义触点A0
无效设置(){
pinMode(触点、输入);
引脚模式(侧1,输出);
引脚模式(侧2,输出);
引脚模式(第3侧,输出);
引脚模式(侧4,输出);
Serial.begin(9600);
}
void循环(){
int-sensorValue1;
int-sensorValue2;
int-sensorValue3;
int-sensorValue4;
//传感器值1:
数字写入(侧1,低);
数字写入(侧2,高);
数字写入(侧3,高);
数字写入(侧4,高);
延误(5);
对于(int i=0;i<10;i++){
传感器值1=模拟读数(触点);
}
//传感器值2:
数字写入(侧2,低);
数字写入(侧3,高);
数字写入(侧4,高);
数字写入(侧1,高);
延误(5);
对于(int i=0;i<10;i++){
传感器值2=模拟读数(触点);
}
//传感器值3:
数字写入(侧3,低);
数字写入(侧2,高);
数字写入(侧4,高);
数字写入(侧1,高);
延误(5);
对于(int i=0;i<10;i++){
传感器值3=模拟读数(触点);
}
//传感器值2:
数字写入(侧4,低);
数字写入(侧3,高);
数字写入(侧2,高);
数字写入(侧1,高);
延误(5);
对于(int i=0;i<10;i++){
传感器值4=模拟读数(触点);
}
串行打印(传感器值1);
连续打印(“,”);
串行打印(传感器值2);
连续打印(“,”);
串行打印(sensorValue3);
连续打印(“,”);
串行打印(传感器值4);
Serial.println();
}
这是用于构造图形的处理代码

import processing.serial.*;
串行myPort;//串口
int maxNumberOfSensors=4;
float[]传感器值=新的float[maxNumberOfSensors];
浮动传感器VALUEX;
浮动传感器值X1;
浮动传感器;
浮动传感器值1;
int scaleValue=2;
无效设置(){
大小(600600);//将窗口设置为任意大小
//println(Serial.list());//列出所有可用的串行端口
字符串portName=“COM5”;
myPort=新序列号(此端口名为9600);
myPort.clear();
myPort.bufferUntil('\n');//在获得换行符(\n)字节之前,不要生成serialEvent()
背景(255);//设置初始背景
smooth();//启用抗锯齿
}
无效提款(){
//背景(255);
//noFill();
填充(100100);
椭圆(高度,0,缩放值*传感器值[0],缩放值*传感器值[0]);
椭圆(0,宽度,scaleValue*传感器值[1],scaleValue*传感器值[1]);
椭圆(高度、宽度、比例值*传感器值[2],比例值*传感器值[2]);
椭圆(0,0,scaleValue*传感器值[3],scaleValue*传感器值[3]);
//椭圆(sensorValueY,sensorValueX,10,10);
//println(sensorValueY、sensorValueX);
sensorValueX=((sensorValues[3]*sensorValues[3])-(sensorValues[2]*sensorValues[2])+600*600)/2000;
sensorValueX1=((sensorValues[0]*sensorValues[0])-(sensorValues[1]*sensorValues[1])+600*600)/2000;
sensorValueY=((sensorValues[3]*sensorValues[3])-(sensorValues[2]*sensorValues[2])+(600*600))/2000;
SensorValue1=((sensorValues[1]*sensorValues[1])-(sensorValues[0]*sensorValues[0])+(600*600))/2000;
行(0,scaleValue*sensorValueX,高度,scaleValue*sensorValueX);
行(scaleValue*sensorValueY,0,scaleValue*sensorValueY,宽度);
椭圆(scaleValue*sensorValueY,scaleValue*sensorValueX,20,20);
行(0,比例值*传感器值X1,高度,比例值*传感器值X1);
行(比例值*传感器值1,0,比例值*传感器值1,宽度);
椭圆(标度值*传感器值1,标度值*传感器值X1,20,20);
println(scaleValue*sensorValueX,scaleValue*sensorValueY);
}
void serialEvent(串行端口){
String inString=myPort.readStringUntil('\n');//获取ASCII字符串
if(inString!=null){//如果它不是空的
inString=trim(inString);//删除所有空格
int incomingValues[]=int(拆分(inString,“,”);//转换为整数数组
if(incomingValues.length 0){
对于(int i=0;i

我想知道如何将这些点的交点转换为坐标?示例:在我向您展示的图像中,我将尺寸的参数设置为(600600)。是否可以将交点更改为坐标值?目前,我的代码正在打印坐标,但它们是对角线,因此x和y值相等。我希望x和y的坐标有不同的量,这样我就可以得到正方形不同边的坐标。有人能帮忙吗?

通过阅读您的代码,我假设您知道所有n个传感器的位置以及每个n个传感器到目标的距离。因此,您实际上要做的是(正如Nico Schertler所提到的)。换句话说,根据n个点之间的距离确定相对位置

如果出现混淆,只需一个快速定义注释:

  • =使用角度工作
  • =远距离作业
三边测量至少需要3个点和距离

  • 1传感器提供目标距离传感器的距离
  • 2个传感器为您提供目标可能位于的2个位置
  • 3个传感器告诉您目标位于2个位置中的哪一个
第一个可能想到的解决方案是计算交点 在3个传感器之间,将它们视为圆圈。考虑到距离可能存在一些误差,这意味着
class Sensor {
    public PVector p; // position
    public float d; // distance from sensor to target (radius of the circle)

    public Sensor(float x, float y) {
        this.p = new PVector(x, y);
        this.d = 0;
    }
}
PVector trilateration(Sensor s1, Sensor s2, Sensor s3) { 
    PVector s = PVector.sub(s2.p, s1.p).div(PVector.sub(s2.p, s1.p).mag());
    float a = s.dot(PVector.sub(s3.p, s1.p));

    PVector t = PVector.sub(s3.p, s1.p).sub(PVector.mult(s, a)).div(PVector.sub(s3.p, s1.p).sub(PVector.mult(s, a)).mag());
    float b = t.dot(PVector.sub(s3.p, s1.p));
    float c = PVector.sub(s2.p, s1.p).mag();

    float x = (sq(s1.d) - sq(s2.d) + sq(c)) / (c * 2);
    float y = ((sq(s1.d) - sq(s3.d) + sq(a) + sq(b)) / (b * 2)) - ((a / b) * x);

    s.mult(x);
    t.mult(y);

    return PVector.add(s1.p, s).add(t);
}
PVector target = trilateration(s1, s2, s3);
double[][] positions = new double[][] { { s1.x, s1.y }, { s2.x, s2.y }, { s3.x, s3.y }, { s4.x, s4.y } };
double[] distances = new double[] { s1.d, s2.d, s3.d, s4.d };

NonLinearLeastSquaresSolver solver = new NonLinearLeastSquaresSolver(
            new TrilaterationFunction(positions, distances),
            new LevenbergMarquardtOptimizer());
Optimum optimum = solver.solve();

double[] target = optimum.getPoint().toArray();
double x = target[0];
double y = target[1];