차동 로봇을 직선으로 운전하기 위해 PID를 사용하는 방법


13

피드백을 위해 각각에 엔코더가 부착 된 2 개의 전동 휠이있는 차동 구동 로봇을 고려하십시오. 각 DC 모터마다 -1에서 1까지의 부동 소수점을 가져오고 해당 모터에 비례적인 양의 전력을 제공하도록 PWM 신호를 설정하는 기능이 있다고 가정합니다. 불행히도 모든 모터가 동일하게 생성되는 것은 아니므로 각 모터에 동일한 PWM 신호를 보내면 로봇이 좌우로 움직입니다. PID 루프의 입력으로 각 모터에 연결된 인코더를 사용하여 로봇을 직선으로 구동하는 방법에 대해 생각하고 있습니다.

방법은 다음과 같습니다. 왼쪽과 오른쪽 엔코더의 차이를 가져 와서 일부 범위 사이의 오류를 제한하고 [-1, 1]에서 정규화 한 다음 모터 파워 0에서 1로 매핑합니다. 따라서 I와 D가 0이고 오류가 1이면 (왼쪽 모터가 오른쪽 모터보다 훨씬 더 많이 회전했습니다) 왼쪽 모터는 0으로 설정되고 오른쪽 모터는 1로 설정됩니다 (단단한 원인) 왼쪽).

이것에 문제가 있습니까? 더 나은 방법은 무엇입니까?

답변:


5

이것에 문제가 있습니까?

이것의 주요 문제는 제안 된 솔루션이 모터 성능 간의 불일치를 즉시 수정하지만 Abbe 오류 와 같은 위치의 복잡한 오류는 물론 누적 오류를 수정하지 않는다는 것입니다 (나중 참조).

더 나은 방법은 무엇입니까?

오류에 대한 내성이 무엇인지, 오류를 수정하기 위해 얼마나 많은 노력을 기울이고 있는지에 따라 수행 할 수있는 몇 가지 작업이 있습니다.

첫 번째 단계는 각 휠마다 하나씩 한 쌍의 PID 루프를 설정하여 동일한 수요 위치를 제공하는 것입니다. 비슷한 질문에 대한 대답 에서 제안했듯이 두 바퀴를 요청한 곳의 매우 좁은 오류 범위 내에두면 눈에 띄는 veer를 유발하기 위해 오류가 충분히 누적되는 데 약간의 시간이 걸립니다.

또한 하나의 복잡한 상호 의존적 결합 시스템을 튜닝하는 것보다 두 개의 명목상 독립적 인 모터 레벨 PID 루프를 튜닝하는 것이 훨씬 쉽습니다. 더 높은 수준의 제어 작동을 변경하려면 각 모터가 가능한 한 오랫동안 다른 모터와 최대한 유사하게 작동해야하며 별도의 서보 루프가 필요합니다.

그러나 여러 가지 복잡한 문제가 있지만 필요한 정확도와 솔루션을 수정하기 위해 얼마나 많은 노력을 기울여야하는지에 달려 있습니다. 그것은 때문일 수 있습니다 추측 항법은 충분하다, 또는 당신은 당신의 로봇에 상대 또는 절대 위치 결정을 추가해야 할 수도 있습니다.

하나의 문제는 왼쪽과 오른쪽 바퀴가 모두 1000 엔코더 카운트를 움직여도 두 개의 다른 런에서 여전히 다른 위치에 있을 수 있다는 것 입니다.

예를 들어, 최대 10 개의 엔코더 카운트 오류가 있고 모터가 PID 루프 반복 당 10 개의 엔코더 카운트 속도로 작동한다고 가정합니다. 왼쪽 모터는 5,10,10,10 ... 10,5로 움직일 수 있지만 오른쪽 모터는 4,11,10,10 ... 10,5의 프로파일을 가질 수 있으며 시작시 약간의 가속도 차이가있을 수 있습니다 이동 중 로봇이 약간 잘못된 방향으로 출발 할 수 있습니다. 뿐만 아니라 그 방향으로 더 멀리 이동할수록 오류가 절대적으로 더 커집니다. 이것이 Abbe error에 대해 이야기 할 때 이야기 하는 것이며 복잡한 운동 학적 모델이나 어떤 종류의 외부 참조가 없으면 절대 수정할 수 없습니다.

자세한 내용 은 비슷하지만 중복되지 않는 질문 에 대한 내 대답 을 참조하십시오 . Arduino PID 라이브러리를 사용하여 로봇을 직선으로 구동하려면 어떻게해야합니까? 그리고 내 대답 도에 관련된 라인 추종자 최적화


2

독립적으로 구동되는 2 개의 바퀴가있는 봇이 있습니다.

나는 자이로를 사용하여 원하는 방향으로 향하게하고, 미끄러짐을 일으키고 심지어 그것을 돌리고 돌리는 것은 머리글을 수정하기 때문에 거의 영향을 미치지 않습니다.

자이로가 결정한 전류 방향 (방향)의 오류에 따라 두 모터 각각에 대해 원하는 전류 속도에 보정을 더하거나 빼는 단일 PID를 사용합니다.

예를 들어 속도를 50 %로 설정하고 제목을 20 도로 설정했습니다. 이것은 일반적으로 두 모터를 50 % 전력으로 구동합니다. 그러나 제목이 사라지면 PID는 한 모터에 약간의 전력을 추가하고 다른 모터에서 약간의 전력을 제거하는 조정을 수행하므로 pid가 표제를 수정함에 따라 모터간에 45 % / 55 %의 전력 분할이 발생할 수 있습니다.

비록 자이로 스코프는 약간의 시간을 캘리브레이션하는데 시간이 걸리더라도 여전히 그리피가 분당 약 1도 드리프트하는 것을 발견하고 있습니다. 지구가 시간당 15도 회전하기 때문에 장기적으로도 고려해야합니다.

앞에서 언급했듯이 바퀴의 엔코더는 실제로 얼마나 멀리 이동했는지 알기에 좋은 아이디어입니다.


나는 이것에 대한 코드를보고 싶다. 자이로 / 가속도계 / 자력계로 동일한 경로를 시작하고 있지만 여전히이 센서의 판독 값을 이해하려고 시도하는 초기 단계에 있습니다.
Ron Smith

여기 내 코드에 대한 링크가 있습니다. 이해하기 쉽지 않을 수도 있습니다. github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
Robert Sutton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.