728x90

얼마전에 

 

SLAM 관련 강의를 해오시던 시릴 교수님이

 

SLAM 분야에 사용되는 주요 컨샙들을 5분 정도 시간으로 설명해주는 유튜브 영상을 올리셨더라

 

 

칼만/파티클 필터, 점유 격자 지도, bag of words, 좌표계, 란삭, SLAM, ICP, 이진 특징 등

 

 

5 Minutes with Cyrill 

 

나중에 개념들을 간단하게 정리하는데 많이 도움될거같다.

 

 

 

 

플레이리스트

https://www.youtube.com/playlist?list=PLgnQpQtFTOGSO8HC48K9sPuNliY1qxzV9

300x250
728x90

목표

- 3개의 서브 플롯으로 xyz축 출력 -> plt.subplots()

- 각 축의 데이터는 실시간 -> FuncAnimation()

- 센서 값의 크기. y축 데이터는 값에 따라 범위가 동적으로 변화해야함 -> set_ylim(min(), max())

 

 

subplots

-figure 내부에 하부 플롯을 그려주는 함수

ref : https://wikidocs.net/14604

 

 

y_limit 동적 변화

- 애니메이션을 통해 y data가 실시간으로 변함

-> 값이 튀거나 안정될때 범위를 고려하여 y축 범위 변화

 matplotlib doc

ref : https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.axes.Axes.set_ylim.html

 동적으로 limt를 바꾸는 방법

ref : https://stackoverflow.com/questions/53423868/matplotlib-animation-how-to-dynamically-extend-x-limits

 

 

 

 

 

구현 코드

from zumi.zumi import Zumi
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

def init():
    idx = 0
    acc = np.zeros((100, 3))
    t = np.linspace(0, 1, 100)

    while idx < 100:
        accs = zumi.get_acc()
        acc_x = accs[0]
        acc_y = accs[1]
        acc_z = accs[2]
        acc_val = np.array([[acc_x, acc_y, acc_z]])

        #push
        acc = np.append(acc, acc_val, axis=0)
        #pop
        acc = np.delete(acc, 0, 0)
        idx = idx + 1

    return t, acc

def update(i):
    global acc
    accs = zumi.get_acc()
    acc_x = accs[0]
    acc_y = accs[1]
    acc_z = accs[2]
    acc_val = np.array([[acc_x, acc_y, acc_z]])

    #push
    acc = np.append(acc, acc_val, axis=0)
    #pop
    acc = np.delete(acc, 0, 0)

    #change y axis data
    ln0.set_data(t, acc[:,0])
    ln1.set_data(t, acc[:,1])
    ln2.set_data(t, acc[:,2])

    # change y limit dynamically
    ax[0].set_ylim(min(acc[:,0]), max(acc[:,0]))
    ax[1].set_ylim(min(acc[:,1]), max(acc[:,1]))
    ax[2].set_ylim(min(acc[:,2]), max(acc[:,2]))
    return ln0, ln1, ln2


#initialize
zumi = Zumi()
t, acc = init()

#plot
fig, ax = plt.subplots(3,1)
ln0, = ax[0].plot(t,acc[:,0], 'r')
ax[0].grid(True)
ax[0].set_title("acc x")
ln1, = ax[1].plot(t,acc[:,1], 'g')
ax[1].grid(True)
ax[1].set_title("acc y")
ln2, = ax[2].plot(t,acc[:,2], 'b')
ax[2].grid(True)
ax[2].set_title("acc z")

#animation
ani = FuncAnimation(fig, update, frames=t, blit=True)
plt.show()

 

 

결과 캡처

 

결과 gif

 

 

 

 

 

 

 

 

300x250

'로봇 > 로봇' 카테고리의 다른 글

zumi - 17. mpu 데이터 플로팅  (0) 2020.08.25
zumi - 16. raw acc/gyro 받기  (0) 2020.08.25
zumi - 14. x축 가속도 플로팅  (0) 2020.08.24
zumi - 13. 영상 블러링 + 이미지 연결  (0) 2020.08.24
zumi - 12. 영상 스트리밍  (0) 2020.08.24
728x90

다음 링크를 참고하여

 

ref : https://matplotlib.org/3.3.0/api/animation_api.html

 

FuncAnimation 함수로 실시간 x축 가속도 값 플로팅

 

from zumi.zumi import Zumi
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

def init():
    idx = 0
    acc_x_lst = np.zeros(100)
    t = np.linspace(0, 1, 100)

    while idx < 100:
        acc = zumi.get_acc()
        acc_x = acc[0]
        acc_x_lst = np.append(acc_x_lst, acc_x)
        acc_x_lst = np.delete(acc_x_lst, 0)
        idx = idx + 1

    return t, acc_x_lst

def update(i):
    global acc_x_lst
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    ln.set_data(t, acc_x_lst)
    return ln,



zumi = Zumi()

t, acc_x_lst = init()


fig, ax = plt.subplots()
ln, = plt.plot(t,acc_x_lst, 'r')
#ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-0.3, 0.3)

ani = FuncAnimation(fig, update, frames=t, blit=True)
plt.show()

 

 

 

중간에 잠시 주미를 흔들어 값이 조금씩 튑니다.

 

 

 

 

 

 

 

 

 

300x250

'로봇 > 로봇' 카테고리의 다른 글

zumi - 16. raw acc/gyro 받기  (0) 2020.08.25
zumi - 15. XYZ 축 가속도 플로팅  (0) 2020.08.25
zumi - 13. 영상 블러링 + 이미지 연결  (0) 2020.08.24
zumi - 12. 영상 스트리밍  (0) 2020.08.24
zumi - 11. opencv 버전 확인  (0) 2020.08.24
728x90

영상에서 잡음 제거를 위해 블러링을 자주 합니다

 

가우시안 필터를 이용한 가우시안 블러링을 사용하고

 

원본과 블러링 결과를 비교할수 있도록

 

영상을 이어보겠습니다.

 

가우시안 블러링

ref : https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_filtering/py_filtering.html#d-convolution-image-filtering

 

이미지 연결

ref : https://stackoverflow.com/questions/7589012/combining-two-images-with-opencv

 

 

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
while(True):
    ret, frame = cap.read()
    frame = cv2.flip(frame, 0)
    rsz = cv2.resize(frame, dsize=(320,240))


    blur = cv2.GaussianBlur(rsz,(10,10),0)

    res = np.concatenate((rsz, blur), axis=1)
    cv2.imshow('res',res)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

 

 

 

 

 

 

 

 

 

 

 

 

300x250

'로봇 > 로봇' 카테고리의 다른 글

zumi - 15. XYZ 축 가속도 플로팅  (0) 2020.08.25
zumi - 14. x축 가속도 플로팅  (0) 2020.08.24
zumi - 12. 영상 스트리밍  (0) 2020.08.24
zumi - 11. opencv 버전 확인  (0) 2020.08.24
zumi - 10. xyz 축 가속도 플로팅  (0) 2020.08.24
728x90

opnecv-python tutorial 참고

 

영상 스트리밍

ref : https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

 

영상 자체가 뒤집혀 나오므로 flip 필요

flip

ref: https://crmn.tistory.com/54

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()


    # Display the resulting frame
    frame = cv2.flip(frame)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

 

 

 

 

 

 

 

 

 

주미가 너무 힘들어해서 사이즈를 줄여 사용하겠습니다.

 

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()


    # Display the resulting frame
    frame = cv2.flip(frame, 0)
    dst = cv2.resize(frame, dsize=(320,240))
    cv2.imshow('dst',dst)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

 

300x250
728x90

잠시 베터리 충전시키는 동안

 

cv2 자료를 정리하겠습니다.

 

설치된 버전 확인 코드

import cv2
print(cv2.__version__)

 

 

300x250
728x90

x축 플로팅을 시켰으니 이제

 

y,z축도 같이 플로팅 시켜보자

 

 

ref : https://datascienceschool.net/view-notebook/d0b1637803754bb083b5722c9f2209d0/

 

from zumi.zumi import Zumi
import time
import numpy as np
import matplotlib.pyplot as plt

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)
acc_y_lst = np.zeros(100)
acc_z_lst = np.zeros(100)

t = np.linspace(0, 1, 100)


while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_y = acc[1]
    acc_z = acc[2]

    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    acc_y_lst = np.append(acc_y_lst, acc_y)
    acc_y_lst = np.delete(acc_y_lst, 0)
    acc_z_lst = np.append(acc_z_lst, acc_z)
    acc_z_lst = np.delete(acc_z_lst, 0)

    idx = idx + 1
    time.sleep(0.01)


plt.title("xyz accelerometer")
plt.plot(t, acc_x_lst, "r", label="x axis")
plt.plot(t, acc_y_lst, "g", label="y axis")
plt.plot(t, acc_z_lst, "b", label="z axis")
plt.legend(loc=2)
plt.show()

 

잘 나오기는 했지만 z축 데이터만 1 근처에 존재한다.

 

이 데이터만 subplot으로 별도로 빼주자

 

 

 

plt.subplot()으로 조금 수정해주면

 

from zumi.zumi import Zumi
import time
import numpy as np
import matplotlib.pyplot as plt

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)
acc_y_lst = np.zeros(100)
acc_z_lst = np.zeros(100)

t = np.linspace(0, 1, 100)


while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_y = acc[1]
    acc_z = acc[2]

    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    acc_y_lst = np.append(acc_y_lst, acc_y)
    acc_y_lst = np.delete(acc_y_lst, 0)
    acc_z_lst = np.append(acc_z_lst, acc_z)
    acc_z_lst = np.delete(acc_z_lst, 0)

    idx = idx + 1
    time.sleep(0.01)


plt.title("xyz accelerometer")
plt.subplot(211)
plt.plot(t, acc_x_lst, "r", label="x axis")
plt.plot(t, acc_y_lst, "g", label="y axis")
plt.legend(loc=2)
plt.subplot(212)
plt.plot(t, acc_z_lst, "b", label="z axis")
plt.legend(loc=2)
plt.show()

 

각 데이터들이 분리되서 나온다.

 

 

 

다음에는 animation을 이용하여 실시간 센서 데이터 플로팅

 

 

 

 

300x250

'로봇 > 로봇' 카테고리의 다른 글

zumi - 12. 영상 스트리밍  (0) 2020.08.24
zumi - 11. opencv 버전 확인  (0) 2020.08.24
zumi - 9. x축 가속도 플로팅  (0) 2020.08.24
zumi - 8. matplotlib fontlist-v300.json 에러잡기  (0) 2020.08.24
zumi - 7. x축 가속도 프린팅  (0) 2020.08.24
728x90

 

 

그래프는 cui 환경에서 볼수 없으니 vnc를 켜주어야 한다.

 

 

x축 가속도 데이터를 0.01 간격으로 모아서 플로팅 하는 코드

 

from zumi.zumi import Zumi
import time
import numpy as np
import matplotlib.pyplot as plt

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)
t = np.linspace(0, 1, 100)


while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    idx = idx + 1
    time.sleep(0.01)

#print(acc_x_lst)
#print(acc_x_lst.shape)
#print(t.shape)
plt.plot(t, acc_x_lst)
plt.show()

 

결과

 

300x250
728x90

주미에서 matplotlib으로 플로팅을 하려고하는데 

 

 

matplotlib을 임포트 시킨 코드를 돌릴때마다 

 

멈춰 버린다.

 

ctrl c로 꺼버리면

 

no such file or directory @!@!$@ fontlist-v300.json 이라 뜬다.

 

폰트리스트가 없어 막힌것 같긴한데

 

일단 matplotlib를 한번 업그레이드 시켜보자

 

 

 

이미 최신이라고 되질 않는다.

 

 

아쉬운대로 그냥 fontlist-v300을 바로 못찾겠다는 경로로 옮겨주자

* 잠깐 구글링해봤는데 업데이트 하라는 말만 있지 이걸 올려준 사람이 잘없더라. 

 

fontlist-v300.json
0.11MB

 

네트워크 드라이브로 옮겨주었다.

 

 

 

 

이제 임포트 시켰더니

 

matplotlib도

 

matplotlib.pyplot도 정상적으로 임포트된다.

 

 

 

 

 

 

acc x list 코드에서 matplotlib.pyplot 임포트 추가시킨후 돌려보면

from zumi.zumi import Zumi
import time
import numpy as np
import matplotlib.pyplot as plt

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)



while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    idx = idx + 1
    time.sleep(0.01)



print(acc_x_lst)

 

시작하는 시간이 걸리긴 하지만 import 에서 멈추지 않고 돌아간다.

 

지금충전중이라 i2c busy가 뜨지만 

 

 

300x250

'로봇 > 로봇' 카테고리의 다른 글

zumi - 10. xyz 축 가속도 플로팅  (0) 2020.08.24
zumi - 9. x축 가속도 플로팅  (0) 2020.08.24
zumi - 7. x축 가속도 프린팅  (0) 2020.08.24
zumi - 6. 가속도 데이터 받기  (0) 2020.08.24
zumi - 5. x축 각가속도 플로팅  (0) 2020.08.24
728x90

중간에 update_angles를 보고

 

각속도와 각가속도 내용이 햇갈리기도 했고,

 

 

주미 라이브러리

ref : http://docs.robolink.com/zumi-library

에서는 가속도에 대한 내용들을 제공하고 있지 않아

 

가속도를 전달받는 코드를 구현하는 등 잠시 해매었다.

 

 

 

 

이제 정리되었으니

 

이번에는 x축 가속도를 플로팅하는 간단한 예제를 구현해보고자 한다.

 

0.01초 간격으로 x축 가속도 데이터 100개를 모아 프린팅 시켜본다

 

 

 

여기선 matplotlib과 numpy를 사용할 것이다.

 

 

값이 0이고, 길이가 100인 넘파이 배열을 생성하고

이 넘파이 배열에다가 큐처럼 값을 넣어보도록 구현한다.

 

0행렬 생성 zeros

ref : https://numpy.org/doc/stable/reference/generated/numpy.zeros.html

읽은 x값 추가 append

ref : https://numpy.org/doc/stable/reference/generated/numpy.append.html

앞에 값 삭제 delete

ref : https://numpy.org/doc/stable/reference/generated/numpy.delete.html

 

 

 

수정 중간

from zumi.zumi import Zumi
import time
import numpy as np

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)



while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_x_lst = np.append(acc_x_lst, acc_x)
    idx = idx + 1
    time.sleep(0.1)


print(acc_x_lst)

 

100회 루프 도는 동안

 

값은 잘 append 되었으나 처음에 있던 데이터들이 제거되지 않아 결과 형태가 길이가 200이 되었다.

 

delete로 맨 앞 데이터를 제거 해보자.

 

 

 

 

 

 

from zumi.zumi import Zumi
import time
import numpy as np

zumi = Zumi()
idx = 0

acc_x_lst = np.zeros(100)



while idx < 100:
    acc = zumi.get_acc()
    acc_x = acc[0]
    acc_x_lst = np.append(acc_x_lst, acc_x)
    acc_x_lst = np.delete(acc_x_lst, 0)
    idx = idx + 1
    time.sleep(0.01)


print(acc_x_lst)

 

- 앞에 플로팅 한 결과가 잘 pop 되어서 원하는 결과가 나왔다.

 

나중에 애니메이션 할걸 생각해서 append와 pop 해주도록 구현하였다.

 

 

 

300x250

+ Recent posts