Quadrotor를 대상으로 안내


9

쿼드 로터에서 일하고 있습니다. - 나는 그것의 위치를 알고 , 내가 가고 싶은 곳 - 목표 위치 , 및으로부터 I 계산 벡터 - 내 목표에 데려다 것 단위 벡터 :abc

c = b - a
c = normalize(c)

쿼드 로터는 회전없이 어떤 방향 으로든 움직일 수 있기 때문에 내가 시도한 것은

  1. 로봇 요 각도로 회전c
  2. 성분 으로 나눕니다x,y
  3. 롤과 피치 각도로 로봇에 전달하십시오.

문제는 요가 0 ° ± 5이면 작동하지만 요가 +90 또는 -90에 가까워지면 실패하고 잘못된 방향으로 조정됩니다. 내 질문은 여기에 분명한 것이 빠져 있습니까?


1
요 각도를 어떻게 계산합니까? 또한 어떤 컨트롤러를 사용하고 있으며 어떻게 데이터를 보내나요?
— DaemonMaker

흥미로운 질문 @Hamza, Robotics에 오신 것을 환영합니다 .
— 마크 부스

@Hamza, 어떤 언어와 시스템을 사용하고 있습니까? 또한 Atmega328 및 Ada 프로그래밍 언어로 쿼드 콥터를 작업하고 있습니다. 프로젝트에 대한 블로그가 있다면 공유하십시오.

@MarkBooth가 맞습니다. 두 개의 탭이 열려 있고 다른 게시물을 중복으로 표시하려고했습니다. 나는 이것을 실수로 표시하고 그것을 취소 할 수있는 방법을 보지 못했습니다. 투표를 마치려면 두 개 이상의 투표가 필요하다는 것을 감안할 때 이것이 문제가되지 않을 것이라고 생각했습니다. 그러나 나는 그것이 나를 대신하여 의견을 게시했다는 것을 깨닫지 못했습니다.
— 데몬 메이커

@DaemonMaker 문제 없습니다 이런 일이 발생합니다. 중복 투표로 마감하면 이제 자동으로 댓글이 게시됩니다.이 투표는 사람들이 직접 투표를하기 전에 다른 질문을 검토하도록하는 유용한 기능이라고 생각합니다.
— 마크 부스

답변:


6

솔루션을 다시 구현하면 다음과 같은 결과를 얻습니다.

벡터 사이의 각도

먼저 점 와 사이의 각도 ( 특히 단위 벡터가 아닌 )를 원합니다 . AB2 점 사이의 각도

( Fx 프로그래밍 사용 ) : θ=math.atan2(Bx−Ax,By−Ay)

차량 요 각도

다음으로 (그리고 이것이 당신의 문제라고 생각 합니다) 계산 된 에서 차량의 요 각도 를 빼야 합니다 . ψθ

제목 대 요

차량의 "요잉 각도"에 나침반을 사용하는 경우 이는 실수 일 수도 있습니다. 제목과 요는 동일하지 않습니다 . 나침반 방향은 양의 축을 따라 0이며 시계 방향으로 회전함에 따라 증가합니다 .y

나침반 장미

Yaw는 양의 축을 따라 0이며 시계 반대 방향 으로 회전함에 따라 증가합니다 .x

극좌표 그래프

원하는 요 (yaw)에서 비히클 요 (빼기 대신)를 추가하는 것과 결합 된 이러한 측정 사이의 90도 겹침은 대상이 ± 5 ° 이내이고 ± 90 °에서 잘못 작동했을 때 작동하는 이유 일 수 있습니다.

성분 X 및 Y로 변환

여기에서이 결과 를 및 구성 요소로 변환하여 롤 및 피치 각도로 로봇에 전달한다고합니다. 위의 수정으로이 시점에서 원하는 결과를 얻을 수 있습니다. 그러나 차량의 속도 (실제로 운동량)가 아니라 위치 차이 만 고려하기 때문에 이러한 구성 요소를 경사 각도에 직접 매핑하는 것은 문제가 될 수 있습니다.(θ−ψ)xy

PID 제어

차량의 롤 및 피치에 PID 제어 루프를 사용하는 것이 가장 좋습니다. 즉, 일단 코드를 수정하고 목표를 달성 할 수 있다면, 대신에 오버 슈트를 시작하여 앞뒤로 진동하는 것 같습니다. 올바르게 조정 된 PID는 대상에 빠르게 접근 할 수 있도록하면서 발생하지 않도록합니다.

와 를 롤과 피치 에 연결하는 대신 롤과 피치 PID가 입력으로 허용 하는 오류 값으로 간주하십시오 .xy


그것은 90 %가 넘는 편집이며 PID (ATAN2)에서 답변을 완전히 변경합니다. 그러나 화려한 그래픽 수식 기술은 야수입니다!
— Spiked3

나는 여전히 PID를 권장합니다 (하단에 있음). 나는 가정의 올바른지 확인하기 위해 질문의 시작 부분을 진행했습니다. 그래픽 수식은 라텍스 형식의 일부이므로 확인할 가치가 있습니다.
— Ian

"나침반 방향은 양의 y 축에서 시작하여 시계 방향으로 증가하고, 요는 양의 x 축에서 시작하여 시계 반대 방향으로 증가합니다"참조? "(θ−ψ)의 x 구성 요소를 롤로 변환하고 y 구성 요소를 피치로 변환"나는 전혀 이해하지 못합니다. 더 많은 설명을 부탁드립니다.
— Spiked3

원래의 질문은 "[x 및 y 구성 요소]를 로봇에 롤 및 피치 각도로 전달"이라고 언급했는데, 이는 나름대로 쿼드 콥터가 롤 각도를 변경하여 좌우로 움직이고 피치 각도를 변경하여 앞뒤로 움직인다는 것을 나타냅니다. 명확성을 추가하겠습니다.
— Ian

산뜻한. 나는 그런 식으로 본 적이 없다. 나는 같은 결과를 얻기 위해 cos / sin을 뒤집어 본 적이 있습니다. 롤 / 피치에 대해 더 생각해야 할 것입니다. 그렇습니다, 그것은 운동을 일으킬 것입니다. 그러나 그것이 당신이 거기에 도달하는 속도를 제외하고, 그것이 당신의 현재 위치와가는 곳과 어떤 관련이 있는지 잘 모르겠습니다. 감사.
— Spiked3

5

여기서 3D 벡터에 대해 이야기한다고 가정하겠습니다. 그렇게 일반화 할 수 있습니까 normalize()? 그것은 흔한 일입니까 (그렇다면 그것을 본 적이 없다면 그때 나에게 뉴스를 보내십시오). 그렇지 않으면 명백한 나침반 랩 문제가 각 X 및 Y 구성 요소에 적용됩니다. 왜 그들을 롤 및 / 또는 피치 및 / 또는 요라고 부릅니까? (3D와 2D 명명법을 혼합하면 문제가 혼동됩니다).

내 2D 정규화는 다음과 같습니다.

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

실제로 쿼드 인 경우 X 및 Y 구성 요소가 실제로 YAW, Altitude ((X, Y) & Z)라고 가정합니다. YAW(X, Y)2D 로 처리하고 Z에 대해 단순히 고도를 떨어 뜨리거나 높이를 가져와야합니다. 다시 말해서 정규화가 원래보다 더 많은 것으로 생각됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.