문제

광학 마우스를 위치 트랙으로 사용하는 로봇이 있습니다. 기본적으로 로봇이 움직일 때 마우스를 사용하여 X 및 Y 방향으로 변경을 추적 할 수 있습니다. 마우스는 또한 당신이 움직이는 방향 (즉, 음수 x 또는 양의 x를 추적합니다.이 값은 별도의 x 및 y 레지스터로 합산됩니다.

이제 로봇이 제자리에 회전하고 앞으로 나아갑니다. 따라서 로봇의 움직임은 이상적으로 직선으로 이루어집니다 (마우스 추적은 특정 각도에서 픽업 편차를 픽업 할 수 있지만). 로봇의 특정 움직임 세트는 다음과 같습니다.
A : 45도 회전하고 3 인치를 움직입니다
B : 90도 회전하고 10 인치를 움직입니다
C : -110도 회전하고 5 인치를 움직입니다
D : 10도 회전하고 1 인치를 움직입니다
그러나마다 마우스 x와 마우스 Y 레지스터가 각 방향으로 이동 한 실제 거리를 제공 할 때마다.

이제 이동 세트를 A에서 D로만 반복하려면 이미 수집 한 정보를 사용하여 어떻게해야합니까? 나는 기본적으로 내가 이미 먹이는 모든 각도와 거리를 요약 할 수 있다는 것을 알고 있지만, 각 움직임 순서에 큰 오류가 있으면 부정확 한 것으로 판명 될 것입니다. 마우스에서 원시 정보를 어떻게 사용할 수 있습니까? 친구는 마우스 값을 지속적으로 사인하고 코사인하고 최종 벡터를 계산할 수 있다는 아이디어를 제공했지만 이것이 어떻게 작동하는지 잘 모르겠습니다.

문제는 마우스가 상대적 판독 값 만 있으므로 회전하거나 뒤로 이동하면 정보를 지우는 것입니다. 예, 내가 궁금해하는 것은 알고리즘을 구현할 수있는 방법입니다. 지그재그로 이동하여 원래 도착하면 가장 짧은 경로를 제공하기 위해 변경 사항을 지속적으로 추적 할 수 있습니다.

도움이 되었습니까?

해결책

기본 알고리즘은 다음과 같습니다.

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

당신은 이것이 정확하지 않다는 생각에 옳습니다. 이유는 이유 때문에 "죽은 계산"이라고합니다.

"x"좌표를 기준으로 델타 헤드를 얻을 수있는 곳 (공식은 (deltax in 인치) / (회전 중심에서 인치 인치 단위로 마우스 센서 거리). 또한 deltas.distance는 "Y에서 나옵니다. "센서, 픽셀에서 인치로 변환 한 후.

그런 다음 단계를 수행하려면 다음과 같은 작업을 수행 할 수 있습니다.

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...

다른 팁

당신의 질문에 대한 답이 아니라 아마도주의 이야기 일 것입니다 ... 나는 1 년 전 학교 프로젝트로서 이런 종류의 로봇을 정확히했습니다. 나는 그것을하는 동안 꽤 많이 배웠지 만 완전히 실패했다. 당신이 얼마나 멀리 운전했는지 추적하기 위해 마우스를 사용하는 것에 관해서 : 그것은 우리에게 전혀 효과가 없었거나 다른 그룹 중 어느 것도 잘 작동하지 않았습니다. 아마도 마우스의 카메라가 바닥 위에 마우스를 몇 mm해야한다는 사실 때문에 초점이 맞지 않았기 때문일 것입니다. 이듬해에 같은 프로젝트를 수행하는 그룹은이 메티드를 사용하지 않았습니다. 대신 weels에 표시를하고 간단한 IR 센서를 사용하여 바퀴가 만든 혁명 수를 계산했습니다.

나는이 스레드를 다소 Necroing한다는 것을 알고 있지만, 더 정확한 각도 추적을 원한다면 두 개의 광학 마우스가 이상적입니다. 기본적으로 동일한 방향으로 움직임을 취소하면 마우스가 서로에 비해 한 움직임이 남아있을 것입니다. 거기에서 봇이 얼마나 멀리 회전했는지 정확하게 결정하는 것은 간단한 수학 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top