JavaFx 光标测量

JavaFx cursor measurement

我正在设计一个应该能够在现实世界中定位自己的小型系统,它基本上是一辆装有 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);
}}

如果你想重现我的结果,只需在一张纸上标记两行,然后尝试 运行 以不同的速度在这些行之间移动鼠标,同时注意程序

报告的鼠标设备距离取决于您移动鼠标的速度。如果鼠标用于制造它的目的,这通常是需要的,但在您的情况下,这是一个问题。我会尝试在您的鼠标设置中切换此功能。也许这篇 link 可以帮到你。 https://askubuntu.com/questions/698961/disable-mouse-acceleration-in-ubuntu-15-10

如果您正在阅读这篇文章post,您可能想知道,是的,问题出在加速上,即使 "disabled" 有些事情仍然无法解决,我也解决了这个问题通过将 PS2 鼠标连接到 Arduino,并通过 JSSC 我询问自上次检查以来的 delta X 和 Y(在这里查看 http://www.instructables.com/id/Optical-Mouse-Odometer-for-Arduino-Robot/