이 글에서는 칼만 필터 알고리즘에 대해서 간단하게 살펴보도록 하겠습니다. 이번 포스팅에서는 칼만 필터의 구현 방법이나 실습 예제 등이 첨부되어 있지 않아 실제로 바로 사용하기에는 어려울 수 있으나 그냥 '칼만 필터'가 이런 거구나~' 하는 개념만 잡고 가시길 바랍니다. 칼만 필터가 저주파 통과 필터(LPF)나 고주파 통과 필터(HPF) 같은 필터와 다른 점이 있다면, LPF와 HPF는 필터가 동작하기 전에 미리 가중치를 결정하고, 동작 중에 가중치 값을 변경시키지 못합니다. 그러나, 칼만 필터에 사용되는 가중치(칼만 이득이라고 합니다.)는 칼만 필터가 수행되면서 그 가중치 값이 알고리즘에 의해 지속적으로 변합니다. 칼만 필터는 측정값을 입력으로 받아, 칼만 필터 알고리즘에 의해 처리된 후 추정값을 출력으..
지난 포스팅에서 보여드리기만 하고 증명이나 설명은 거의 없었던 그 식에 대해서 설명드리겠습니다. 이게 바로 저번 포스팅에서 얘기했던 식입니다. 각 부분에 대해서 다시 설명해보자면 변환할 값(새로 갱신된 데이터)에 변환 이득값을 곱해 작은 범위를 큰 범위로 늘려주고 마지막으로 모자란 보충값을 더해줍니다. 한번 세부적으로 예를 들어보도록 하겠습니다. sbus data는 지난 번에 얘기한 대로 352 ~ 1696의 범위를 가집니다.(모든 리시버의 데이터가 이 범위를 가지는 것은 아닙니다. 여러분 각자 하드웨어마다 다른 범위를 가질 것입니다.)그럼 범위의 scale은 1696 - 352 = 1344입니다. 한편 우리가 sbus data를 가지고 만들어야 할 pulse 값의 범위는 4619 ~ 8147입니다.(지..
오늘은 조종기 신호를 수신하는 SBUS 리시버의 output data를 이용하여 드론의 PWM을 생성해보는 방법에 대해서 알아보겠습니다. STM32 MCU를 이용하여 설명하겠습니다. 오늘 이 포스팅을 통해 어떤 하드웨어가 출력하는 PWM의 주기와 Duty Cycle을 MCU Timer 세팅을 통해 그대로 구현해 볼 수 있을 것입니다. 최근 진행했던 드론 프로젝트의 구성을 예로 설명하겠습니다. SBUS 리시버가 출력하는 PWM 파형 분석프로젝트에 사용했던 SBUS 리시버에서 출력하는 PWM을 오실로스코프를 통해 확인해보니 다음과 같은 결과가 있었습니다. PWM 주기 : 15msHIGH duration(한 펄스에서 HIGH가 차지하고 있는 시간) : 1.1ms ~ 1.94ms HIGH duration 범위를..
터미널 프로그램 중 하나인 Tera Term을 이용하여 터미널에 출력되는 데이터들을 파일에 저장하는 방법에 대해서 알려드리도록 하겠습니다. 매트랩이나 파이썬(matplotlib)을 이용하여 센서나 혹은 그 별개의 데이터들의 변화를 그래프로 표현하고자 할 때 보통 텍스트 파일이나 csv 파일에 저장된 데이터를 읽어와 그래프에 읽어온 데이터들을 추가하는 것이 일반적인 방법입니다. 그래프로 데이터를 표현하려면 일단, 데이터를 파일에다가 저장해놓는 것이 먼저인데, 실시간으로 값이 갱신되어 들어오는 센서 데이터 같은 경우에는 그때 그때 터미널 프로그램에서 ctrl+c, ctrl+v해서 텍스트 파일에 일일이 저장시킬 수도 없으니... 참 어려운 일입니다. 하지만 Tera Term을 이용하면 데이터들을 바로바로 텍스..
현재 프로젝트에서는 고도를 측정하기 위해 기압 센서를 사용하여 기압을 고도로 변환하여 실제 비행에서 고도를 파악하려고 합니다. 하지만 워낙 노이즈가 심해서 필터 없이는 도저히 사용할 수 없는 수준이기에 고도 필터를 구현하기로 했습니다. 제가 가장 큰 도움을 받고 있는 멘토분에게 여쭤가며 얻어낸 소중한 지식을 여러분과 공유하고자 이렇게 포스팅을 하게 되었습니다. 고도필터의 전체적인 구현 시퀀스는 다음과 같습니다. 1. 가속도계의 z축 값에서 중력 가속도 성분을 제거합니다.(보상한다라고도 표현하는 것 같습니다.) 2. 중력 가속도 성분을 제거한 값(벡터)을 DCM을 이용(오일러각 이용)하여 관성 좌표계(고정 NED 좌표계) 벡터로 분해합니다.(벡터를 표현하는 좌표계를 옮기는 것이라고 이해하시는 게 쉬울 것 ..
기압계와 가속도계를 이용한 고도 필터를 공부하면서 도중 알게 된 DCM에 대해 포스팅해보도록 하겠습니다.이 문서를 토대로 공부한 내용을 정리하겠습니다.일반적으로 방향 좌표계는 고정적인 전역 좌표계를 기준으로 상대적인 몸체의 방향을 계산하게 됩니다.보통, 전역적으로 고정되어 있는(불변하는) 절대적 좌표계를 global 좌표계라 하고, 몸체가 회전할 때마다 실시간으로 가변되는 몸체의 좌표계를 body 좌표계라고 합니다. DCM TUTORIAL – AN INTRODUCTION TO ORIENTATION KINEMATICS (REV 0.1) I, J, K는 global 좌표계의 단위 벡터라고 하고, i, j, k는 body 좌표계의 단위 벡터라고 하겠습니다.(이 벡터들 모두 시점이 O로 같습니다.) global..
표준 PID 제어기 알고리즘에서 미분항은 다음과 같이 구했습니다.DTerm = Kd * (dError / dT); 하지만 실제로 사용하는 미분항은 다음과 같이 구합니다.dInput = Input - prevInput; DTerm = -Kd * (dInput / dT); 왜 기존에 나와 있는 알고리즘대로 사용하지 않고 미분항을 수정해서 사용하게 될까요?Error = Setpoint - Input;이므로 Setpoint 값의 변경은 갑작스런 Error 변화를 유도하고 그렇게 되면 미분항의 값은 갑자기 확 커지게 됩니다. 이는 결국 output의 갑작스런 변화를 유도하게 됩니다. 그 이유를 예를 들어 설명하겠습니다. 미분항을 그대로 사용하게 될 경우 초래되는 문제 드론이 수평을 유지하도록 하기 위해 Setpo..
표준 PID 제어기 알고리즘은 다음과 같습니다. 이 알고리즘을 코드로 간단하게 표현하자면 다음과 같습니다.Error = Setpoint - Input;PTerm = Kp * Error;ITerm += Ki * Error * dt; 현재 오차(Error)는 설정(Setpoint) 값에서 현재 입력(Input) 값을 빼서 구합니다. 비례항(PTerm)은 비례항 이득값(Kp)에 현재 오차를 곱해서 구합니다. 적분항(ITerm)은 적분항 이득값(Ki)에 현재 오차와 주기(dt)를 곱해서 더해줍니다. 미분항(DTerm)을 구하기 위해서는 다음과 같이 구합니다.dError = Error - prevError;DTerm = Kd * (dError / dt); 오차 변화(dError)는 현재 오차(Error)에서 이전..
이번 포스팅은 드론의 자세 제어를 위해 사용했던 PID 제어기에 대해서 설명하도록 하겠습니다. PID 제어기란? PID 제어기란 비례-적분-미분 제어로서, 가장 많이 사용되는 대표적인 형태의 제어 기법입니다.PID 제어기는 제어하고자 하는 대상의 출력값을 측정하여 이를 원하고자 하는 설정값과 비교하여 오차를 계산하고, 이 오차값을 제어에 필요한 제어값으로 변환하는 구조로 되어 있습니다. 표준적인 형태의 PID 제어기는 위와 같이 세 개의 항을 더하여 제어값(Output)을 계산하도록 되어있습니다. P항, I항, D항은 각각 오차값, 오차값의 적분, 오차값의 미분에 비례하며, 각 항에 들어가는 이득값(Gain)인 Kp, Ki, Kd를 ..
- Total
- Today
- Yesterday
- PID
- C++
- 드론개발
- Effective C++
- teraterm
- STM32
- 컴파일
- 초기화 리스트
- 멤버 초기화 리스트
- DMA
- 오실로스코프
- DCM
- 칼만필터
- 고도필터
- pwm
- UART
- c
- compile
- SPI
- 컴퓨터구조
- 터미널
- 드론
- 로그
- computer_science
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |