Arduino 转换相交区域以生成坐标
我在做一个项目,从电阻式触摸屏上获取模拟值,并将其转换为交点 以下是一个例子: 下面是我使用Arduino Uno进行数据收集的代码,以及使用名为processing的工具构建点的代码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
#定义侧边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个点之间的距离确定相对位置 如果出现混淆,只需一个快速定义注释:
- =使用角度工作
- =远距离作业
- 1传感器提供目标距离传感器的距离
- 2个传感器为您提供目标可能位于的2个位置
- 3个传感器告诉您目标位于2个位置中的哪一个
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];