2017-04-17 1 views
0


저는 학교 프로젝트를 진행하고 있지만 불행히도 교사는 더 이상 작동하지 않으므로 아무에게도 물어 보지 않습니다.
현재 현실 세계에서 스스로를 찾을 수 있어야하는 작은 시스템을 설계하고 있습니다. 기본적으로 PC에 장착 된 전기 RC 자동차입니다. 이 자동차는 실제 세계를 탐색하고지도 상 어디에 있는지 알 수 있어야합니다. 좋은 정밀도가 필요하기 때문에 GPS는 옵션이 아닙니다. (내가 얻을 수있는 최선의 방법은 4 미터입니다. 내가 받아 들일 수있는 방법 이상입니다.) 어떤 방식 으로든 바퀴를 인코딩하는 것은 예산에 비해 너무 비싸므로 해결 방법은 이 차 밑에 마우스를 놓고 상대 위치 시스템으로 피드백을 사용합니다.
내 첫 번째 아이디어는 두 인스턴트 (타이머를 사용하여) 사이의 픽셀 거리의 차이를 계산하는 것이 었습니다. mouseMoved 이벤트를 사용하여 동일한 원리를 적용하려고 시도했지만 문제가 아직 남아 있습니다. 마우스의 속도가 다를 경우 , 계산 된 거리도 다릅니다.
이 시점에서 나는 다른 생각을 가지고 있지 않다. 내 접근 방식에는 어떤 것이 있다고 생각합니까?JavaFx 커서 측정

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); 
}} 

도움을 주셔서 감사합니다.
마테오 Formenti

편집 : 당신이 내 결과를 재현하려는 경우, 단지 종이에 두 줄을 표시하고 프로그램에 눈을 유지하면서 다른 속도로 그 라인 사이의 마우스를 실행하려고

답변

0

보고 된 마우스 장치의 거리는 마우스를 움직이는 속도에 따라 다릅니다. 귀하의 경우에 마우스를 사용하는 경우 마우스를 사용하면 문제가됩니다. 마우스 설정에서이 기능을 전환하려고합니다. 이 링크가 도움이 될지도 모릅니다. https://askubuntu.com/questions/698961/disable-mouse-acceleration-in-ubuntu-15-10

+0

방금 ​​귀하의 제안을 시도했지만 아무 것도 변경되지 않았습니다. 이것이 문제가 될 수 있다고 확신합니까? 그렇다면 더 자세히 조사하겠습니다. –

+0

적어도 하나 이상의 문제가 있습니다. 물론 내가 아직 보지 못한 더 많은 것들이있을 수 있습니다. 나는 당신이 차의 회전을 어떻게 다루고 싶어하는지 예를 들어 궁금해하고있다. – mipa

+0

회전은 디지털 나침반으로 처리됩니다. 가속을 비활성화 한 후에도 상황은 변하지 않습니다 ... 그 동안이 솔루션을 파헤칩니다. –

0

이 게시물을 읽는다면 문제는 속진과 관련이 있다는 것을 알고 싶을 수도 있습니다. "비활성화 된"무언가가 여전히 해결되지 않을 때에도 PS2 마우스를 연결하여이 문제를 해결했습니다. Arduino, 그리고 JSSC와 함께 나는 마지막 체크 이후 델타 X와 Y를 묻습니다 (여기서 보시려면 http://www.instructables.com/id/Optical-Mouse-Odometer-for-Arduino-Robot/)