내가 왜 파이썬 로보틱스를 다루려 했더라

전에 못했던 스캔 매칭이나 SLAM 구현을

이젠 진짜 해볼수 있을 만큼 되었다 생각이 들었지만

정작 하면서 영 의욕이 생기질 않더라

 

지금은 이전에 로보틱스를 공부했을 때 만큼

절박함도 잃었고, 영 힘이 나지 않는다.

 

한동안 다른거 하다

나중에 다시 해보고 싶을 때가 오겠지

 

 

-ㅁ너ㅐㅔ채ㅔㄷㅂ퍼ㅐㅔㅐㅔㅓㄷ패ㅔㅍㄷ재ㅔㅏㅜㅇ류라ㅡㄷㅍ자ㅡ

 

 

이번에 정리하고자 하는 내용은 확장 칼만필터

 

확장 칼만 필터 EKF

확장 칼만 필터는 기존의 칼만필터의 상태 전이와 측정이 선형 함수 형태로 이루어져 있었는데

대부분 비선형적인 동작을 하는 현실 문제들에는 부적합함

 

칼만 필터에서 선형함수를 사용하여 다음 상태, 관측치를 표현한 것 대신

비선형 함수 g와 h를 사용해서 계산하는데

 

 

잠깐 가우시안 분포가 선형 변환을 하면 어떻게 되나 보자

(칼만 필터에서는 다음 상태를 구할때 하던 그거)

선형 변환때는 문제 없이 가우시안 분포를 따르는 다음 상태 p(y)를 구할수 있다.

 

 

하지만 문제는 비선형 변환을 할때이다.

가우시안 분포 p(x)를 비선형 함수 g(x)에 넣었더니

지금까지 계속 사용했던 가우시안 분포의 형태가 나오지 않아서 사용할수 없다.

* 파란 가우시안 분포는 p(y)의 평균과 분산을 계산해 만든 가우시안. 

 

 

 

대신 비선형 함수의 해당 지점을 1차 테일러 전개, 선형 근사를 하여 p(x)를 대입시키면

(비선형 함수의 1차 근사식으로 가우시안 분포를 선형 변환)

파란 가우시안 분포에 가까운 (근사화 오차를 가진, 빨간) 가우시안 분포가 나온다.

 

위에선 비선형 함수를 선형 근사하여 어떻게 가우시안 분포를 적용시켰는지 봤는데

 

비선형 함수를 이제 1차 테일러 전개, 선형화하면 아래와 같이 표현 

여기서 G_t는 비선형 함수를 상태와 제어에 대해 편미분하여 구한 자코비안 행렬

비선형 함수에대한 선형 근사식으로

상태 전이 확률을 정리하면 다음과 같음

관측 비선형 함수도 선형 근사를 통해 표현할수 있으며, 관측 확률도 가우시안으로 다음과 같음

 

 

 

 

확장 칼만 필터 알고리즘

기존의 칼만 필터랑 거의 비슷한데 

상태 전이행렬 A, 제어 행렬 B, 관측 행렬 C대신

비선형 함수 f, u와 자코비안 G가 들어간 형태

 

구현 코드랑 같이 봐야 이게 뭔가 이해되겠지만

아직 그전에 짚고 넘어갈게 좀남아서 바로 구현하질 못하겟네 ㅜㅜ

 

재ㅓㄹㅂ제ㅐ러뱆ㅇ재ㅏㅇㅈ배ㅔ

 

가우시안 필터

지금까지 앞에서 정규분포로 자꾸 센서 데이터나 상태를 표현했는데

지난 글에서 작성한 믿음도도 가우시안 분포로 표현해서 다루었었다.

베이즈 필터를 가우시안 분포를 이용해서 정리한게 가우시안 필터라고 할수 있음

칼만 필터는 노이즈를 가우시안 노이즈로 구현한 가우시안 필터를 구현한 것중 하나

 

매개변수 표현(파라미터화)

가우시안 분포 정규 분포는 보통 평균과 분산 두 수치로 표현하는데 이를 모멘트 파라미터라고 하고,

정보 행렬과 정보 벡터로 표현하는 방법을 캐노니컬 파라미터화라고 함.

정보 필터 쓸때가 아니면 보통 모멘트 표현법을 주로 사용함

 

다변량 가우시안분포는 다음 형태로 나타내는데

평균 mu와 공분산 sigma로 모멘트를 이용하여 표현함

 

 

칼만 필터 개요

이전 파이썬 필터 글에서 봤다시피 칼만 필터는 상태를 모멘트 매개변수화하여 표현했었음 

칼만 필터는 아래의 조건들을 따르면 믿음도, 사후확률을 가우시안으로 표현가능함

 

예측 과정에 사용되는 상태 전이 확률과 관측 확률이 가우시안 노이즈를 가지고(시스템/관측 행렬 + 노이즈 했던거),

* 상태 전이 함수는 시스템 행렬 A와 제어 행렬 B, 가우시안 노이즈로 구성된 선형 함수

* 관측 함수는 관측 행렬 C와 가우시안 노이즈로 구성되었음

초기 믿음도, 초기 추정치(칼만 필터할때 맨처음에 초기 평균, 공분산 준거)가 정규 분포를 따름

 

 

 

칼만 필터와 베이즈 필터 비교

칼만 필터는 가우시안 분포로 베이즈 필터를 구현한 것들중 하나라고 했는데

한번 비교해서 보자

 

 

 

베이즈 필터에서는 x t-1에서 상태 전이 확률을 통해 t에서 예측 믿음도를 구했었다.

칼만 필터의 경우 (모멘트 파라미터화로 표현해서 평균과 공분산 사용) 예측 평균을 이전 상태와 제어 신호의 선형 함수로

예측 공분산을 이전 공분산에 앞뒤로 시스템 행렬을 곱해서 구해냄

 

 

칼만 필터에는 베이즈 필터에는 없는 칼만이득 계산하는 과정이 있는데

칼만 이득은 (다음 갱신과정에서 계산할) 측정 잔차(실제 측정값과 예측 측정값)를 얼마나 반영시킬지 조정하는 역활을 함

이제 관측 갱신 단계로 넘어가서보면

베이즈 필터에서는 예측 믿음도에다가 관측 확률을 곱하여 믿음도를 계산하는데

칼만 필터에서 평균은 예측 평균 + 칼만이득(실 관측값 - 예측관측값), 공분산은 칼만 이득과 예측 공분산으로 다음과 같이 계산한다.

 

이거 처음 봤을때 모멘트 파라미터화나 믿음도 자체를 이해못해서

베이즈 필터에서는 확률을 곱해서 계산하다가

칼만필터에서는 평균, 공분산으로 계산만하니 갑자기 왜 이래된건가 전혀 이해를 못했었는데

 

베이즈 필터는 로봇 상태 믿음도를 계산하기 위한 기본 컨샙이고

칼만 필터는 가우시안 분포와 선형 함수로 베이즈 필터를 실제 동작할수 있게 표현한 것 정도로 이해함.

 

 

 

칼만 필터를 이용한 1차원 공간에서의 위치 추정

아래의 그림은 칼만 필터로 믿음도를 예측하고 갱신하는 과정을 개념적으로 보여줌

 

먼저 그림 a에서 가우시안 분포로 초기 믿음도를 표현해냄 

초기 추정치라 뒤에 계산결과에 비해 약간 분산이 퍼진 형태로 되어있음

다음 그림에는 제어하지는 않았지만 먼저 관측을 해서 관측 확률을 구하였음

관측확률과 초기 확률 평균은 대충 비슷하지만, 관측 확률의 경우 분산이 작음

* 칼만 필터에서는 초기 추정치가 매우 중요함. 초기 추정치와 실 관측과 다르면 계산 잘안됨.

베이즈 필터에서 예측 확률(초기엔 움직이지 않았지만)과 관측 확률을 곱했던것 처럼

칼만 필터에서도 예측 믿음도에 칼만이득 x 관측잔차, 공분산 계산해서 반영시킨 결과

현재 상태, 믿음도의 불확실성이 줄어들어 확률이 더 올라감

로봇이 우측으로 이동하면서 시스템 노이즈가 누적되

불확실성이 증가하였음

제어 후 상태, 예측 믿음도의 분산이 커진걸 볼수있다.

이동한 위치(예측 믿음도)는 대충 평균이 21쯤인데

실 관측치로 봤을땐 로봇의 위치가 25쯤 있는걸로 보고 있음

 

 

이 관측치를 상태에 반영시켜 다음과 같은 사후확률, 믿음도를 구해내었음

 

 

 

 

ㅇㅈ배ㅓ햊ㅂ푸재ㅔㅓ브ㅓㅔㅐ배ㅔ재ㅡ재ㅔ

보통 놀면 계속 노는데 하려고 하니 참 손에 안잡힌다

잠깐 놀다 지난번에 하던거 다시 시작함

 

지난글 마지막에는 상태, 제어, 관측을 어떻게 확률로 표현하는지와

이산 시간 흐름에따라 이들의 변화 과정을 동적 베이지안 네트워크로 표현하면서 마쳤음

 

 

믿음도 belief

다음으로 볼게 belief 이걸 나는 믿음도라고 적는게 적당할것 같은 생각이 드는데

belief를 믿음도라 작성해서 하겠다.

베이지안 확률론에서는 빈도주의 확률론처럼 확실히 나온다기 보다는

확률을 주관적인, 믿음의 정도로 표현한다고 하니 믿음도라고 쓰려고함.

 

지난 글에서 초음파 데이터가 저런 식으로 있으면

N(10, 1)인 확률 밀도 함수로 표현하자라고 하자, 치자

라고 정의한게 믿음 같은거라고 해야될까

정규분포 그러니까 가우시안으로 근사 시켜 표현했다고 할수 있을듯하다.

 

 

그러면 여기서 사용하는 믿음도가 무엇을 믿는거냐면

믿음도는 로봇의 상태가 어떻게 되어있을까?에 대한 확률을 의미한다고 하면되겠다.

뒤에 나올 내용이지만.

2차원 공간에서 이동로봇의 상태가 좌표 x, y와 해딩 방향 theta가 있다고 치자

이 상태들을 위 초음파 데이터를 정규분포로 표현한것 처럼 평균 mu와 공분산 cov로 표현한게 믿음도라고 할수 있을것같다.

 

일단 믿음도는 사후확률로 표현하면 다음과 같으며

베이즈 필터로 믿음도를 계산하는 과정은 예측 단계와 관측 단계로 나누어져 있다.

예측 단계는 상태에 제어 신호를 줬을때 바뀐 상태에 대한 예측을 나타낸다.

 

처음 위 식을 봤을때 너무 막연한 표현으로 느껴졌었는데 로봇이 한 지점에 있는데 이를 정규분포로 표현하고 있다가. 10m 전진후에는 어디쯤에 있을까?를 정규분포로 표현하면 평균치는 10m 전진했을지는 몰라도 분산은 이동하면서 생긴 노이즈 때문에 더 퍼져있을것이다.

 

이 퍼진 분산을 고쳐주는게 베이즈 필터의 관측 단계로 갱신된게 로봇 상태에 대한 사후확률, 믿음도가 되겠다.

예측 단계에서는 z 1~t-1, u 1~t-1 까지 진행했으면 x_t-1을 얻었을것이다.

x_t-1에서 u_t만큼 더 가면 시간 t에서의 예측 상태 bar bel(x_t)를 얻는것이고

이 예측상태를 관측 갱신으로 보정하여 믿음도 bel(x_t)를 얻어낸다.

 

 

 

베이즈 필터

아래의 사진은 베이즈 필터의 기본 그림을 표현한다.

이게 왜 필터라고 하냐. 이전에 노이즈가 낀 초음파 거리계의 정량 데이터를 확률 모델로 표현해서 센서의 평균치와 노이즈 퍼진 정도로 표현했는데, 정량적 수치가 아닌 확률로 표현해서 그런듯 하다. 아래 알고리즘은 센서 데이터가 아닌 로봇의 상태를 추정하는 내용이긴 하지만

 

베이즈인것은 베이즈 정리에따라 예측 믿음도와 관측 역확률을 가지고 구하고하자던 사후확률을 계산해냈기 때문인듯

 

 근데 아래 베이즈 필터 알고리즘은 로봇의 상태, 제어, 관측, 예측, 갱신 전체 개념을 확률로써 표현해서 저런 흐름이지 구현 내용을 보기전에 너무 억지로 계산하려 하는건 골치아프다. 뒤에 로봇 문여는 예제와 복도 예제가 있긴한데

로봇 문여는 예제는 계산이 너무 번거로우니 복도 예제를 대충 보고 짚어넘자.

 

 

로봇 복도 예제(마르코브 위치추정)

로봇 복도 예제가 뒤에 있는줄 알았는데 앞에 있었네 --

이 예제는 1차원 공간에서 로봇의 위치가 어디에 있는지를 찾아내는 과정을 설명해주는데

 

우선 가장 먼저 초기 위치를 로봇이 어디있는지 모르니 로봇이 위치 가능성들이 균일하게 퍼져있다고 하자

대충 위치가 이산적으로 10개가 있다고 치고,

균일분포로 초기화 한다는 것은 로봇이 존재할 확률을 균일하게 준다가 되겠다.

이는 초기 믿음도 bel x_t가 된다.

위치 0 1 2 3 4 5 6 7 8 9
확률 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1

 

베이즈 필터에서는 예측, 관측을 반복한다 했는데 지금은 관측부터 해보자

 

아래는 관측 모델, p(z | x)를 대충 표로 나타내어봤다.

관측 모델은 문이 여러개라 가우시안 혼합 모델 형태를 띄는데,

내가 문의 위치를 알고있고, 지금 바로 문앞에 있어서 저런 식으로 나오나 이런건 개념적으로 넘어가자 

위치 0 1 2 3 4 5 6 7 8 9
확률 0.01 0.01 0.3 0.01 0.3 0.01 0.01 0.01 0.3 0.01

 

그러면 베이즈 필터 관측 단계대로 관측 모델과 초기 믿음도를 곱해주면

아래의 믿음도가 계산된다.

문 3개있는걸 알고, 내가 문앞에 있으니 문 세개 쯤 어딘가에 있구나 정도로 생각하면 될듯. 

 

다음은 제어후 예측 단계가 되겠다.

믿음도 봉우리들이 이동하면서 노이즈가 첨가되 퍼진 형태를 보인다.

그러다 로봇이 또 문을 찾아내었다.

로봇은 문의 위치를 알고 있으니 지금의 (예측) 믿음도와 관측 모델을 곱해 갱신시켜줘보자.

그러면 아래의 믿음도 같이 가장 봉우리가 큰 지점이 나오며 믿음도가 실제 로봇의 위치에 가까워졋다!

이 상태로 로봇이 계속 전진하면

여전히 이동 노이즈로 믿음도 분산이 점점 커지긴 하지만 실 로봇의 위치를 잘 쫓아간다.

 

일단 여기까지 확률 이론으로 로봇 상태 추정을 어떻게 하는가 기본적인 느낌 정리

음 파이썬 로보틱스에서 제공하는 예제들은 probabilisitc robotics 내용들을 파이썬으로 구현한 것들인데

이론 내용을 짚고 넘어갈까,

아니면 바로 구현들어가면서 내용정리할까 고민하다가 

사용되는 기초 이론들을 먼저 정리해야할것 같아서

내가 이해한 것이 정확하지는 않더라도 대강 느낌이라도 정리를 먼저하고 시작하려고함

 

확률로 다루는 로보틱스

- 보통 센서 데이터들을 특정한 정확도의 값(정량 데이터)을 가짐

 초음파 거리계 : 거리

 가속도, 자이로계 : 각속도, 선가속도

 gps : 경도, 위도 위치 좌표 등

- 하지만 이런 센서들 데이터들은 노이즈로 잘못되어있을 수 있으며, 로봇의 상태를 특정한 정확한 값으로 표현은 곤란

 => 센서 데이터를 그대로 쓰기보단 로봇의 상태를 확률 모델로 표현

 

상태를 확률 변수로 모델링 한다는 것은?

- 초음파 데이터가 대충 10cm 거리에 있는 물체를 감지해서 아래와 같은 값을 받앗다고 치자

- 이를 확률 변수 p(x)는 평균 10, 분산 1인 정규분포 X ~ N(10, 1) 를 따른다른다 라는 식으로 데이터 분포를 확률 밀도 함수로 표현한다.(대충 값이 맞든 틀리든)

10.7 10.4 9.2 8.4 11.6 11.0 8.9

 - 로봇과 관련된 상태 값들이 노이즈가 포함되어도 확률 분포로 나타내어 베이즈 필터에 활용된다.

 

확률 개념 정리

- 확률 변수 X가 사건 x일 확률을 다음과 같이 표현

- 확률 변수 X에서 발생할 모든 사건에 대한 확률들의 합은 1

- 앞으로 사용할 확률 분포들은 가우시안 분포를 따른다고 가정함. x가 스칼라인 경우 1차 정규분포는 다음과 같음

- x가 스칼라가 아닌 벡터인 경우 정규 분포는 다음과 같이 표현

- 두 확률 변수 X, Y가 주어지고, X=x, Y=y인 사건이 동시에 일어날 확률/결합확률분포는 다음과 같음

- 만약 두 확률 변수 X, Y가 독립인 경우 두 사건이 동시에 일어날때 결합확률분포는 각 두 확률의 곱

- Y=y 임을 알고있을때 X=x가 발생할 확률(조건부 확률), 맨 우측은 X,Y가 독립인 경우 성립

- 조건부 확률 정의에 따라 다음의 전체 확률 정리가 성립함 

 -> p(x|y)는 y가 발생했을때 p(x, y)가 발생할 확률

 -> p(x|y)에서 전체 y 사건들이 발생한 경우(이산합, 적분)를 곱하여 합하면 p(x)에 대한 확률이 나온다

- 조건부 확률은 역확률과 관련 있음

- 확률 변수 X의 기댓값은 다음과 같이 계산

- 기댓값을 선형 함수로 표현시 다음과 같이 정리됨

- 확률 변수 X의 공분산은 다음과 같음

- 엔트로피는 x가 갖는 기대 정보량으로 -log2 p(x)는 x 인코딩에 가장 적당한 비트 수를 의미함

 

 

 

 

지금 왜 조건부 확률과 역확률을 다루는가

- 역확률 p(y | x)를 이용해 p(x | y)를 계산하기 위함

 * y는 센서 데이터를 의미, p(y | x)는 특정 상태 x에서 y를 얻었을때의 확률 분포, p(x | y)는 센서데이터로 얻은 상태 분포

 * 지금 로봇의 상태값들을 표현하기 위해 확률 분포를 사용하고 있는데, 실제 코드로 구현한걸 봐야 좀더 와닿음. 지금은 어쩔수가 없다.

- p(x | y)는 y라는 데이터가 주어졌을때 로봇의 상태 x에 대한 확률 분포를 나타낸다.

 센서 관측 데이터 y를 얻은 후 상태 x를 구한것이므로 이를 사후 확률 분포라 한다.

 

 뒤에 구현할 예시랑 비슷하게 설명하자면 랜드마크로부터 거리 y가 주어졌을때 로봇의 위치 x가 어디인가를 의미한다

좀더 1차원 공간에서의 (대충) 예시를든다면 남산타워가 4인 지점에 있다는걸 알고 있다.

그리고 나는 거리 측정 센서로 남산타워(랜드마크)까지 거리를 재어보니 2.5, 2.3, 2.7, 2.6, 2.4 같은 식으로 값이 나온다.

나는 아직 내 위치가 어딘지 모른다.

하지만 지금 위치 기준으로 측정 데이터 p(y | x) = X ~ N(2.5, 0.1) 쯤 나온다고 칠수 있을것이고

4 - 2.5를 하면 1.5가 되니 나의 위치는 1.5쯤에 있다를 알수 있는데, 이게 p(x|y)가 된다.

=> p(x | y)를 바로 구할수는 없지만 확률 p(y | x)로부터 구할수 있으므로 p(y | x)를 생성모델이라 부른다.

원점   나의 위치   랜드마크
(남산타워)
         
0 1 ?? 3 4 5 6 7 8 9

- 내가 방금 작성한 설명이 p(x|y)에 대한 식을 계산하는것과 정확하게 일치한것 같지는 않은대 역확률 p(y | x)로 사후확률 p(x | y)를 구한다는것은 이런 느낌인데, 1차원 복도 예제를 봐야 왜 이런식으로 계산되는지 조금 더 와닿을것 같다. 

 

 

상태, 제어, 관측

- x는 상태, u는 제어 데이터, z는 관측 데이터를 의미

- 시간 t1~t2까지 모든 제어, 관측 데이터를 다음과 같이 표현

- 시간 t에서의 상태 x_t는 시간 t-1에서의 상태 x_t-1에 제어 데이터u_t로부터 얻을 수 있음

 x_t-1는 0~t-1까지의 상태와 제어를 합한 결과로 얻을수 있으며, x_t는 우항과 같이 정리하여 구할수 있다.

 이게 무슨소리냐 대충이라도 계산해보자

 1차원 공간에서 t-1 시점에 로봇은 X ~ N(10, 1) 그러니까 10에 있다고 치자

 +5 만큼 이동하는 제어 신호를 줬다고 하자 제어 신호에 대한 상태 전이 확률 분포를 N(5, 2)라 한다면

t 시점에 로봇은 15에 있을 것이다.

하지만 상태 전이 분포의 분산이 2이므로 이동 노이즈가 가미되어 t 시점의 로봇은 X ~ N(15, 3)으로 표현된다.

 

만약 제어 신호의 노이즈가 작아서 상태 전이 확률 분포가 N(5,0.001)이라 치면

이동 후 t 시점에서의 로봇은 X ~ N(15, 1.001)에 위치할 것이다.

로봇이 정확하게 이동했으므로 로봇의 상태에 대한 확률 분포의 분산이 크지 않다.

- 시간 t에서 상태 x_t가 주어질때 관측치, 역확률 모델 p(y|x)은 다음과 같이 표현한다.

- 상태 전이 확률 p(x' | x, u) : 상태 x에서 제어 신호 u를 줬을때 얻은 새로운 상태 x'에 대한 확률 분포

- 관측 확률 p(z | x) : 상태 x에서 관측치 z를 얻은 것이 대한 확률 분포

- 상태 x, 제어 u, 관측 z가 이산 시간 흐름에 따라 결정되어 동적 베이즈 네트워크라 부름 

 

 

 

 

 

 

 

 

 

자 이제 진짜 오랜만에 파이썬 로보틱스를 다시 정리해보려고 한다.

예전에는 문서페이지없이 깃헙 페이지만 보고 했었는데

지금은 스핑크스로 문서도 만들어져 있다.

 

내용이야 probabilistic robotics에 나오는 내용 기반으로 구현되어있고

크게 의존하는 라이브러리 같은게 없어서

기본 파이썬 개발환경에서 대부분 다 돌려볼수 있는 내용들로 구성되어있다.

 

참 전에 공부할때 많이 도움되었었는데

이번에 다시 정리하면 더 할수 있겠지

 

아무튼 이 책이랑 구현된 코드랑 같이 한번 다시 정리해볼 생각

 

 

모터 개요

- DC 모터 : 소형 가전에 사용. 브러쉬에 의한 수명문제 -> BLDC 모터

- RC(remote control) 서보모터 : 완구용.  PWM으로 제어 용이. Encoder 사용하기도

- 스텝 모터 : 산업용, 프린터 등 사무용 기기에 많이 사용. 홀딩 토크가 큼. 잘못 제어시 탈조

- AC 모터 : 산업용, 드라이어기, 에어컨 등 가전에 많이. 속도 제어를 위해 인버터 사용

- 서보 모터 : 산업용, 정밀 장치, 로봇 등 에 많이 씀. 


 

 

 

디지털 출력

- MCU 입출력 단자를 이용한 ON, OFF.

- MCU 포트는 80mA 아주 작은 전류를 내보내 TR이나 릴레이 연결해 높은 전력 장치를 ON/OFF 연결해 사용

https://blog.daum.net/ejleep1/879

 

아날로그 출력

- DAC로 아날로그 출력으로 변환 -> 연산증폭기로 증폭.

 <-> 아날로그 출력 회로는 비용이 크다.  

=> PWM 제어 사용

 

PWM

- 듀티비를 이용해 모터, 온도, 조명 등 제어

 

 

 

 

RC 서보모터

- DC 모터에 감속기어를 추가해 적절한 속도와 큰 토크를 얻음

- 토크 암의 각도를 내부 POT 센서로 제어.

 HOW? 명령 각도 V와 비교해 내부적으로 feedback 제어로 위치 제어 수행

 * POT 센서 : 포텐쇼미터 = 가변저항, 오디오 볼륨으로도 사용

- RC 서보모터 제어규정 : 제어 PWM 주기. 20ms 주기 내 On-duty를 0.6 ~ 2.4ms 사이로 회전각도 결정

 

 

H 브리지 회로를 이용한 DC 모터 제어

- H 브리지 회로 : DC 모터의 정역 회전 제어에 사용

 + PWM 신호로 방향 뿐만 아니라 속도도 제어

3D 장면에서 컴퓨터까지

이미지 샘플링, 이산화

- 이미지를 픽셀별로 분리. 해상도가 320 x 240 일 시 가로 320픽셀, 세로 240 픽셀

이미지 히스토그램

- 이미지 픽셀별 강도값을 히스토그램으로 표현

- 히스토그램 평활화 : 히스토그램을 평활하게 분포시켜 강도 범위를 펼쳐 이미지 선명도를 높임

https://gaussian37.github.io/vision-concept-histogram_equalization/

 

 

이진화

- 경계값(Thresold)에 따라 픽셀 값을 0, 1로

https://lucathree.github.io/python/day49-1/

스무딩(블러링, 저주파 통과 필터 효과)

- 영상 노이즈 제거. 특정 픽셀이 지나치게 크거나 작은경우 제거하거나 이웃과 비슷하게 -> 이미지가 선명해짐

가우시안 스무딩 https://iskim3068.tistory.com/41

이미지의 기하학적변환

크기변환 scalining

직선이동

 

회전 행렬

 

 

 

에지 검출

- 이미지 경계, 물체 정보 취득에 사용

- 이미지 강도 변화율로 검출 -> 1차 미분의 극점 에지 존재

 

이미지 그라디언트, 자코비안, 헤시안

- 그라디언트 : 다변수 스칼라 함수 1차 미분 -> 이미지 에지검출에 사용

- 자코비안 : 다변수 벡터 함수에 대한 1차 미분 ->  그라디언트나 마찬가지로 1차 미분이므로 지역적 변화 파악에사용

- 헤시안 : 다변수 벡터 함수에 대한 이차미분 -> 곡률 특성 나타냄. 최적화 문제에 사용

- 라플라시안 : 다변수 스칼라 함수의 2차 미분 -> 모든 방향으로 변화가 심할때 최대값가짐 ->코너 검출

ref  :https://darkpgmr.tistory.com/132

 

 

마스크를 이용한 에지검출

- 소벨 마스크를 이용. 

- 소벨 마스크 : 픽셀간 1차 미분 근사화한 마스크, 수직 수평 경계에 민감

 

 

모폴로지(형태학적) 연산

- 픽셀간 통합 분리

- 침식, 팽창, 열림, 닫힘 4가지 프로세스, 노이즈 제거 지문인식 등 사용

- 침식 erode :  이미지 줄임 -> 노이즈 제거

- 팽창 dilation : 경계가 부드러워짐, 구멍 매꿈

- 열림 연산 : 침식 후 팽창 적용 -> 작은 객체 제거에 적합

- 닫힘 연산 : 팽창 후 침식 적용  -> 전체적인 윤곽 파악에 좋음

ref : https://opencv-python.readthedocs.io/en/latest/doc/12.imageMorphological/imageMorphological.html



침식



팽창

 

 

 

이미지 변환 종류

- 평행이동, 회전, 크기조절, 원근변환 등

종류

1. ultrasonic sensor

2. PSD Position Sensitive Device

3. Encoder

4. Hall effect sensor

5. Capacitance sensor

6. Eddy current sensor

7. IMU

8. UWB Communication

 

 

 

 

 

 

 

1. 초음파 센서

1. 트리거 펄스 입력 : DSP IO포트로부터 트리거 신호를 트리거 펄스 인풋에 10us 보내주면 초음파(8사이클) 보낸다.

2. 초음파 에코 단자(에코펄스 출력)에서 로에서 하이로 바뀐다.

 - 이 신호의 라이징 에지를 잡고, 초음파가 물체에 갔다 돌아오는 시간을 재야하므로 타이머 시작.

3. 초음파가 돌아오면 에코 단자의 신호가 다시 Low로 바뀌고 타이머 정지

-> 초음파가 돌아올때까지의 시간과 음포 속도로 거리 측정. 거리 = 시간 x 음속 / 2

인식 범위


https://www.microsonic.de/kr/support/ultrasonic-technology/detection-zones.htm
SRF04

http://www.datasheetcafe.com/srf04-datasheet-pdf/

 

 

2. PSD 센서

- 저가, 신뢰성 있음.

- 대상물이 위치에 따라 센서와 거리, 빛이 반사되는 각도가 다름

- 측정 거리 L은 L_o : L_b = f : x 즉, L_o =  L_b * f/ x

-  송신부 : 적외선 발광 다이오드

- 수광부 : 렌즈의 배열로 있음

- 특징(GPY0A21YK)

  측정 거리 : 10 ~ 80cm

  패키징 크기 : 29.5 x 13 x 13.5

  공급전압 : 4.5 ~ 5.5v

  소비전류 : 30mA






https://m.blog.naver.com/iotsensor/221907920725

 

 

3. 엔코더

- 증분 엔코더 : 회전식 펄스 카운팅

- A상은 펄스 속도, B상은 방향 확인을 위함

- 앱솔루트 엔코더 : 회전각에 따라 다른 출력신호

 * 그레이 코드 표기 : 1비트씩 바뀐다. 경계점에서 완전히 다른 코드로 바뀌는 문제 개선



https://www.freego2.de/index.php/technical-info/encoders

4. 홀 이펙트 센서

- 홀전압은 자기장과 입력 절뉴에 비례

- 회전체의 각도 방위 측정에 활용

 

5. IMU(가속도계 + 각속도계)

- 이동관성(가속도) + 회전관성(각속도) + 지자기계 측정

- 센서내 마이크로프로세서로 계산. 데이터를 I2C, SPI로 가져와 사용.

 

 

센서의 신호처리 - 필터 종류.

- Low Pass Filter : 저역통과(저주파) 필터. 고주파 노이즈 제거(ex. 가속도 센서)

- High Pass Filter : 고역통과필터. 저주파 노이즈 제거하는 경우(ex. 센서 적분 데이터)

- Band Pass Filter : 특정 주파수 대역만 통과.

- Band Stop Filter : 대역 제거 필터. 특정 대역 신호만 제거.

 

 

1차 저주파 통과 필터 구현 1st Low Pass Filter

- 아날로그 필터와 디지털 필터. 디지털 필터(코딩해서 신호 처리)를 주로 구현

 

 

* 실험해보기 : IMU 센서 데이터를 저주파 통과 필터로 필터링

 

 

기초 단계

1. ROS 설치하고, 설정하기

2. ROS 파일 시스템 살펴보기

3. ROS 패키지 만들기

4. ROS 패키지 빌드하기

5. ROS 노드에 대해서 이해하기

6. ROS Topic을 이해하기

7. ROS 서비스와 파라미터 이해하기

8. rqt_console과 ros launch 사용하기

9. rosed로 파일 수정하기

10. ROS msg와 srv 만들기

11. C++로 간단한 퍼블리셔와 서브스크라이버 작성하기

12. 파이썬으로 간단한 퍼블리셔와 서브스크라이버 작성하기

13. 간단한 퍼블리셔와 서브스크라이버에 대해서 살펴보기

14. 간단한 서비스와 클라이언트 코드 작성하기(C++)

15. 간단한 서비스와 클러이언트 코드 쓰기(파이썬)

16. 간단한 서비스와 클라이언트에 대해서 알아보기

17. 데이터를 녹음하고 재생하기

18. bag file에서 메시지 읽기

19. roswtf 시작하기

20. ROS wiki 살펴보기

21. 다음에 할께 뭐가 있을까?

 

 

슬슬 로스도 질리기 시작한다 얼른 끝내고

쉬었다가 하고싶어질때 urdf나 tf로 넘어가야지

 

 

 

코드 14번째 줄의 rospy.Service의 경우 add_two_ints 라는 이름으로 AddTwoInts라는 서비스 타입 요청을 받으면, handle_add_two_ints 콜백함수를 받아 응답해주는 내용이다.

 

실행권한도 주고 클라이언트로 넘어가자

 

 

 

 

클라이언트 코드 내용이야

 

10번줄은 add_two_ints 서비스 요청 대기하는거고

 

12번은 요청이 오면 'add_two_ints' 서버에다가 AddTwoInts 서비스 타입을 응답해준다는 소린거같고,

13번째 줄에서 함수를 호출하면서 서버에 보내면 응답을 받아 return 하게 되는거같다.

 

 

 

   1 #!/usr/bin/env python
   2 
   3 from __future__ import print_function
   4 
   5 import sys
   6 import rospy
   7 from beginner_tutorials.srv import *
   8 
   9 def add_two_ints_client(x, y):
  10     rospy.wait_for_service('add_two_ints')
  11     try:
  12         add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
  13         resp1 = add_two_ints(x, y)
  14         return resp1.sum
  15     except rospy.ServiceException as e:
  16         print("Service call failed: %s"%e)
  17 
  18 def usage():
  19     return "%s [x y]"%sys.argv[0]
  20 
  21 if __name__ == "__main__":
  22     if len(sys.argv) == 3:
  23         x = int(sys.argv[1])
  24         y = int(sys.argv[2])
  25     else:
  26         print(usage())
  27         sys.exit(1)
  28     print("Requesting %s+%s"%(x, y))
  29     print("%s + %s = %s"%(x, y, add_two_ints_client(x, y)))

 

얘도 실행옵션주고,

CMakelists.txt에 추가하자

 

 

 

와 이번에는 에러없이 바로 빌드 잘됬다.

 

 

 

 

http://wiki.ros.org/ROS/Tutorials/ExaminingServiceClient

 

서버를 돌리려했더니

인스톨한 서버 스크립트가 비기너 튜토리얼 모듈을 못찾는데, 오타 였네

 

 

 

오타기도 했지만 빌드 후에 setup.bash를 실행안해줘서 찾지 못하고 있었다.

 

비기너 튜토리얼 모듈 찾는건 해결했지만 이번에는 또 오타.

 

 

 

모든 에러를 다해결해주고서야 이제 서버가 돈다.

 

 

 

클라이언트도 뜨는 에러 다 고쳐주고 매개변수도 잘 주면 원하는데로 동작

 

 

 

 

이제 ROS 기초 튜토리얼은 여기까지 하려고한다

뒤에 녹음 재생하는거 bag 파일 등 남긴했는데,

이제 학교도 며칠안남기도 했고 

 

학기 끝나기 전에는 아트메가 328 회로를 직접 만들어보고 싶어서

그런쪽을 해봐야되겠다 싶다.

 

그래도 오랜만에 ROS 공부하면서 이전에는 있는지도 몰랏거나

영어 실력이 지금보다 많이 부족했고, 책에서 잘 설명하지 않은 내용들을 꽤 봐서

전보다는 ROS를 잘 다룰수 있을 자신도 생겼고

 

 

이정도면 ROS 비기너 튜토리얼 내용에서 중요하다 싶은건 다 정리했다고 봐도 될거같다.

남 보여주려고 하기보다는 그냥 이해되는데로 그냥 적다보니 남들한태는 잘 읽힐지는 모르겠지만

 

 

조만간 기회되면 URDF로 로봇 만들어서 가제보에서 돌려보면서 놀아보고싶다.

+ Recent posts