자력계 동적 교정


19

나는 IMU의 일부인 자력계 AK8975를 연구하고 있습니다. 나에게는 매우 까다로운 것 같습니다. 이 칩은 지구의 어느 곳에서나 지구 근처의 지구 자기장을 설명하는 출력으로 3D 벡터를 제공합니다.

두 가지 유형의 제목 계산 알고리즘을 시도했습니다. 하나는 간단 arctan(-y/x)하고 다른 하나는 아래에 언급 된 것처럼 기울기 (피치) 및 뱅크 (롤) 취소 수학입니다. 성향과 은행 모두 잘못된 결과를냅니다.

두 알고 중 하나를 사용하여 수평 계획을 유지하면서 회전 할 때 올바른 간단한 제목의 지구를 사용할 수 있습니다 (간단한 사용 가능한 개방형 연구 리소스 사용).

연철 및 경철 오류에 대한 교정을 시도했습니다. 3D로 그릴 수 있고 완벽한 3D 구를 보여줍니다. 여전히 성향이나 편각에 효과가 없습니다.

모든 포인터가 도움이 될 것입니다.

코드와 그 구현은 다음과 같습니다.

void Compass_Heading()
{
  double MAG_X;
  double MAG_Y;
  double cos_roll;
  double sin_roll;
  double cos_pitch;
  double sin_pitch;

  cos_roll = cos(roll);
  sin_roll = sin(roll);
  cos_pitch = cos(pitch);
  sin_pitch = sin(pitch); 

  //// Tilt compensated Magnetic filed X:
  MAG_X = magnetom_x*cos_pitch + magnetom_y*sin_roll*sin_pitch + magnetom_z*cos_roll*sin_pitch;
  //// Tilt compensated Magnetic filed Y:
  MAG_Y = magnetom_y*cos_roll-magnetom_z*sin_roll;
  //// Magnetic Heading


  MAG_Heading = atan2(-MAG_Y, MAG_X) ;

}

어디에서 magnetom_x, #_y그리고 #_z실제로 자력계에서 RAW 값입니다 차원 벡터의 구성 요소입니다. 롤 및 피치 는 온보드 가속도계 및 자이로 스코프의 신비한 칼만 필터 출력에서 ​​비롯됩니다. 이 세 센서는 ATAVRSBIN1에 있습니다. 롤과 피치는이 단계까지 괜찮습니다.

이제 journal_of_sensors_renaudin et al_2010c.pdf 에 따른 간단한 표제 계산 MAG_Heading = atan2(-magnetom_y, magnetom_x) ;은 위와 같이 보상 되어야합니다 .

전체 코드는 단순히 OPEN AHRS 에서 가져온 것 입니다.


Roll, Pitch 및 Yaw 형식의 데이터 손으로 만 장치를 회전 시켰습니다. 처음 3 개는 각각 Roll, Pitch 및 Yaw에만 집중되었습니다. 나머지 2 개는 먼저 장치를 X (회전)를 따라 45도 정도 회전 한 다음 자력계의 로컬 Z를 따라 회전합니다. 그런 다음 Y (피치)를 따라 약 45도 회전 한 다음 자력계의 로컬 Z를 따라 회전했습니다.

그래프는 -180에서 180 도의 범위 내에 표시됩니다.

롤 파일 의 각도 (도) 롤의 YAW 특성.

피치 파일 의 각도 (도) 피치의 YAW 특성.

편주 파일 의 각도 (도) Yaw 자체의 YAW 특성.

Yaw wrt 45도 경사 (압연) 파일 의 각도 (도) 45도 롤링 된 Yaw의 YAW 특성.

yaw wrt 45도 뱅킹 (피치) 파일 의 각도 (도) 45 도의 피치를 가진 Yaw의 YAW 특성.

참고 : 마지막 2 장의 사진 : 먼저 홈 위치에 보관하십시오. 이는 모두 동일합니다 (txt 파일 참조). 그런 다음 45도 회전 한 후 평면 장치 (자력계 포함)를 사용하여 자력계의 Z 축을 따라 회전했습니다.

마지막 이미지와 마찬가지로 장치는 45도 각도로 자력계의 Z 축을 따라 피치로 조정되었습니다.

이것들이 내 문제를 해결하는 데 도움이되기를 바랍니다.


새로운 개발은 다음과 같습니다.

나는 제목에서 일했다. 나는 출력을 따랐다. 롤 csv

피치 csv

편주 csv



아직 대답이 없습니다!

4
구현하려는 수학과 구현에 사용한 코드를 보여 주면 더 많은 답변을 얻을 수 있다고 생각합니다. "작동하지 않고 도움이되지 않는 것"이외의 방법으로 진행할 수있는 것은 거의 없습니다. 죄송합니다!
— Martin Thompson

자력계 사용은 비교적 소수의 사람들이 전문 지식을 갖을 매우 전문화 된 영역입니다. 몇 번이나 귀하의 질문을 읽었지만 여전히 무엇이 잘못되었는지 잘 모르겠습니다. "잘못된 출력"을 제공하지만 꽤 모호합니다. 아마도 몇 가지 예가 있습니까?
— Jason R

1
이것은 센서 출력을 해석하는 방법 또는 센서가 제공하는 x, y, z 벡터에서 탐색 가능한 유용한 측정 값을 계산하는 방법에 대한 질문입니까? 동일한 센서의 다른 인스턴스로 측정을 반복 할 수 있습니까?
— vicatcu

1
@Rahul-이것이 더 주목을받지 않는 것에 놀랐습니다!
— Kevin Vermeer 1

답변:


8

나는 당신의 그래프를 좋아합니다. 그들은 롤, 피치 및 요가 작동하고 있음을 분명히 보여줍니다. 축하합니다! 그것은 이미 대부분의 사람들이하는 것보다 더 많은 발전입니다.

제시 한 코드가 예상 한 MAG_Heading 값과 다른 "잘못된"MAG_Heading 값을 계산하는 것 같습니다.

귀하가 당사에 제공 한 경우 귀하를 돕기가 훨씬 쉬울 것입니다 : (이것은 " 현명한 방법으로 질문하는 방법" 의 " 증상 설명"섹션입니다 )

  • AK8975의 시간에 어떤 한 지점에서 출력값 m_x 자력계, m_y 및 m_z.
  • 같은 순간의 피치 및 롤 값
  • 그 값들로부터 계산 된 잘못된 MAG_Heading 출력값
  • 올바른 MAG_Heading이 예상되는 것

그래서 나는 아마도 당신이 내가 직접 만든 것과 같은 종류의 문제를 겪고 있다고 추측해야합니다. :-).

  • sin () 및 cos () 및 atan2 () 함수는 어떤 각도 형식을 기대합니까? 형식 피치와 롤 간의 변환을 해당 형식으로 저장해야합니까? 해당 형식을 MAG_heading으로 변환해야합니까? (브래드,도 또는 라디안? 부동 소수점 또는 고정 소수점?)
  • 빼야 할 원시 m_x, m_y, m_z 값에 오프셋이 있습니까?
  • 코드에서 가정 한 방식으로 모든 부분이 정렬되어 있습니까? 특히, 피치 및 롤 축이 자력계 축과 정렬되어 있습니까? (m_x는 롤 축을 따라 앞으로 향해야합니까? m_y는 피치 축을 따라 오른쪽을 향해야합니까?)
  • 이 코드에 들어가기 전에 센서 값 또는 m_z와 같은 센서 값을 무시해야할까요?
  • 이 코드가 하나의 인터럽트에 의해 인터럽트되어 내부 값을 손상시키는 것일 수 있습니까? 누군가가 인터럽트 루틴에 "나누기"한 후 프로그램의 다른 곳에서 모든 삼각 함수 계산이 종종 잘못된 결과를 줄 수있는 다른 프로젝트를 생각합니다.
  • 이 코드가 실제로 실행을 끝내지 않도록 종종 인터럽트가 발생합니까?

다른 곳에서 매우 유사한 코드를 논의하는 다른 사람들이있는 것 같습니다 : http://diydrones.com/forum/topics/heading-from-3d-magnetometer ; http://diydrones.ning.com/profiles/blogs/dcm-imu-theory-first-draft ; http://aeroquad.com/showthread.php?1138-REVOLUTION!!!-New-IMU !!! ; http://www.rcgroups.com/forums/showthread.php?t=1436742&page=6 ; http://aeroquad.com/showthread.php?691-Hold-your-heading-with-HMC5843- 마그네토 미터 ; 기타


나는 지금 그것을 보았다 .. 나는 다시 올 것이다.
— Rick2047

\ 1 / [Roll, pitch, yaw 및 (Mx, My, Mz)]에 대한 CSV 파일을 만들고 있습니다. \ 2 / MAG_Heading은 롤과 피치의 변화에 ​​따라 두 번 연속 사분면까지 변경되지 않아야합니다. 이 호는 NE로 향하는 경우 경사를 위해 상하 회전 방향으로 수평선에서 90도를 가로 질러 NE를 향할 때까지 계속 NE를 가리키고 뱅킹 또는 조합의 경우 동일해야합니다.
— Rick2047

\ 3 / 모든 내부 계산은 라디안으로 수행되었으며 모든 코사인 함수는 라디안 만 필요합니다. 표시를 위해 값만 복사되고도 단위로 변환됩니다. \ 4 / 부동 소수점. \ 5 / 모든 센서가 정렬되었으며 SENSOR_SIGN [9]을 사용하여 정렬을 위해 가능한 모든 관련 조합을 시도했습니다. \ 6 / 폴링에서 수행하고 있으므로 인터럽트 기반의 모든 문제는 여기에 없습니다.
— Rick2047

내 포인트 \ 1 /의 경우 모든 그래프에 대해 해당 CSV 파일도 첨부했습니다. 또는 다른 것을 요청했습니다. 이 좋은 반응에 감사드립니다. :) 나는 노력과 시간이 허락하는 한 "똑똑한 방법으로 질문하는 방법"을 구현할 것이다. :)
— Rick2047

\ 1 / 나는 [Roll, pitch, yaw and (Mx, My, Mz) (제목, 편각)]에서 일할 것입니다.
— Rick2047

1

LSM303 의 애플리케이션 노트 에는 문제에 적용 할 수있는 기울기 보정 나침반 교정에 유용한 안내서가 있습니다. 그것은 매우 상세합니다. 그렇지 않으면 계산을 다시 작성했을 것입니다. 자기장 라인의 축을 중심으로 회전해도 자력계 값이 변경되지 않으므로 가속도계 값은 전체 피치, 롤 및 요 계산에 필요합니다. 가속도계의 중력도 마찬가지입니다.


링크는 같은 방정식에서 다른 부호를 보여줍니다. 다른 모든 조합을 시도하겠습니다.
— Rick2047
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.