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(BxAx,ByAy)

차량 요 각도

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

제목 대 요

차량의 "요잉 각도"에 나침반을 사용하는 경우 이는 실수 일 수도 있습니다. 제목과 요는 동일하지 않습니다 . 나침반 방향은 양의 축을 따라 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.