我正在设计一个能够在现实世界中定位的小型系统,它基本上是一个安装有PC的电动遥控车。这辆车应该能够在现实世界中导航并知道它在地图上的位置。由于它需要一个良好的精度,GPS不是一个选项(我能得到的最好的是4米,超过我能接受的方式)并且以任何方式编码轮子对我的预算来说太贵了,所以解决方法是放置这辆车下的鼠标,并将其反馈作为相对定位系统。
我的第一个想法是计算两个瞬间之间像素距离的差异(使用计时器),我甚至尝试使用mouseMoved事件应用相同的原理,但问题仍然存在:如果我改变鼠标的速度,计算的距离也会变化。
在这一点上,我没有其他想法,你认为我的方法有什么问题?
public class Main extends Application {
public static void main(String args[]) {
launch(args);
}
private double cmToPixel = 1;
private int totalX;
private int totalY;
private Robot robot;
private int counter;
@Override
public void start(Stage primaryStage) throws Exception {
VBox pane = new VBox();
pane.setFillWidth(false);
pane.setMinWidth(200);
javafx.scene.control.TextArea textArea = new TextArea();
javafx.scene.control.TextArea logArea = new TextArea();
javafx.scene.control.TextArea debugArea = new TextArea();
pane.getChildren().addAll(textArea, logArea, debugArea);
Scene scene = new Scene(pane);
primaryStage.setScene(scene);
primaryStage.centerOnScreen();
robot = new Robot();
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
scene.setOnMouseMoved(e -> {
double deltaX = e.getX() - Screen.getPrimary().getBounds().getWidth() / 2;
double deltaY = Screen.getPrimary().getBounds().getHeight() / 2 - e.getY() ;
totalX += deltaX;
totalY += deltaY;
textArea.appendText((totalX / cmToPixel) + " - " + (totalY / cmToPixel) + "\n");
debugArea.appendText(deltaX+" - "+deltaY+"\n");
logArea.appendText("Center: ["+(int) (Screen.getPrimary().getBounds().getWidth() / 2)+";"+(int) (Screen.getPrimary().getBounds().getHeight() / 2)+"] cursorPosition: "+e.getX()+" - "+e.getY()+"\n");
robot.mouseMove((int) (Screen.getPrimary().getBounds().getWidth() / 2), (int) (Screen.getPrimary().getBounds().getHeight() / 2));
});
primaryStage.show();
primaryStage.setFullScreen(true);
}}
如果你想重现我的结果,只需在一张纸上标记两行,并尝试以不同的速度在这些行之间运行鼠标,同时密切关注程序
报告的鼠标设备距离取决于移动鼠标的速度。如果将鼠标用于制作它的目的,通常需要这样做,但在您的情况下,这是一个问题。我试着在你的鼠标设置中切换这个功能。也许这个链接可以帮到你。 https://askubuntu.com/questions/698961/disable-mouse-acceleration-in-ubuntu-15-10
如果您正在阅读这篇文章,您可能想知道是的,问题在于加速,即使“禁用”某些东西仍然无效,我通过将PS2鼠标连接到Arduino解决了这个问题,并且JSSC我问上次检查后的delta X和Y(看看这里http://www.instructables.com/id/Optical-Mouse-Odometer-for-Arduino-Robot/)