작성 예정
read more지난번에 작성했던 간단한 실내 자율주행 로봇 패키지를 조금 발전시킨 형태입니다. 최종적인 목표는 아래 그림과 같은 택배를 가져다주는 실내 배송 로봇입니다.
제가 맡은 부분은 로봇 SLAM 및 네비게이션이었기 때문에 정리할 내용은 다음과 같습니다.
Localization은 자율주행차 또는 모바일 로봇이 자신의 위치를 인지하는 것을 의미합니다. 직역하면 위치 추정입니다. 어떻게 하면 자동차가 자기 위치를 인식 할 수 있을까요? 그것은 바로 센서와 지도를 이용하는 것입니다. 아직은 SLAM이 아닌 지도를 알고 움직이는 자동차로 생각합니다. 이 작업에서 가장 중요한 것은 확률, $bel(x_t)$입니다.
자동차는 확률을 $bel(x_t)$라는 확률함수의 형태로 표현합니다. $x_t$는 자동차의 상태를 의미하는데, 이 강의에서는 position으로 취급합니다. 따라서 $bel(x_t)$는 자동차가 $x_t$라는 지점에 있을 확률이라고 해석할 수 있습니다. 이를 확률함수의 형태로 표현하면 그림과 같이 $bel(x_t)=p(x_t|z_{1:t}, u_{1:t}, m)$이 됩니다. 확률함수의 조건인 $z_{1:t}, u_{1:t}, m$에 대해서 알아보도록 하겠습니다.
$P(H): $사전확률 (가설, Hypothesis)
$P(E|H): $ 가설 $H$를 만족할 때 $E$가 발생할 확률
$P(E): $ 사건 E가 발생할 확률
$P(H|E): $사후확률 (증거, Evidence)
베이즈 정리란 쉽게 말해 확률을 어떻게 갱신할 수 있을지를 사전확률(Prior Probability)과 사후확률(Posterior Probability)의 관계로 나타낸 것입니다. 사전확률은 말 그대로 사건이 발생하기 전의 사건이 발생할 확률을 의미합니다. 사후확률 역시 별반 다르지 않습니다. 물론 사건이 발생한 후의 사건이 발생할 확률입니다.
베이즈 확률을 이해하기 위해 재미있는 예시를 들고 왔습니다. 한 수학자가 여사친에게 발렌타인데이에 초콜릿을 받았습니다. 그런데 이 수학자는 완전한 이과뇌라서 친구가 자신을 좋아할 확률을... read more
이 게시글은 라즈베리파이 카메라로 캘리브레이션을 하는 내용입니다.
순서는 다음과 같습니다.
ROS로 camera calibration을 하려면 우선 /camera/image 토픽과 /camera 토픽이 필요합니다. 따라서 해당 카메라의 토픽을 실행시킬 수 있는 패키지를 설치해야 합니다. 설치방법은 여기에 나와 있지만 정리해보도록 합시다.
git clone
명령어를 통해 catkin_ws/src
폴더에 패키지를 다운받습니다.
$ cd catkin_ws/src $ git clone https://github.com/UbiquityRobotics/raspicam_node.git
ROS에 인식되지 않는 의존성 몇 가지를 위해 다음 명령어를 실행해 줍니다.
$ sudo gedit /etc/ros/rosdep/sources.list.d/30-ubiquity.list
열린... read more
이 부분을 잘못 알아서 한참 헤맸다. 틀림없이 Stereo인줄 알았는데 오른쪽에 렌즈 하나만 달린 Monocular 였던 것이다. 아…. 현타 엄청나게 왔다
Monocular 카메라의 캘리브레이션 방법은 다음 사이트에 나와 있다.
ROS wiki: How to Calibrate a Monocular Camera
intel에서 제공하는 calibration tool을 사용한 캘리브레이션 시도해 보았다. 하지만 내부 파라미터를 빼오기 힘들어 지양하는 방법이란 말을 듣고 바로 포기했다. 사실 issue로서 failed to start calibration 이 떴다. 왜인지는 모르겠다.
-issue: Waiting for service /camera/set_camera_info …
Service not found
rosrun 명령어 끝에... read more
Camera calibration을 하는 이유는 2d 평면을 3d 모델로 해석하기 위해서 필요한 파라미터를 구하는 것이다.
A[R/t] 행렬에서 A행렬이다.
A행렬은 내부 파라미터(intrinsic calibration)라고 하는데 이의 구성은
실제 단위: mm, 카메라 모델 단위: pixel
pixel은 이미지 센서의 셀 크기에 대해 상대적인 값으로 표현
예를 들어 셀 크기: 0.1mm, 초점거리가 500mm면 렌즈 중심에서 이미지 센서까지의 거리는 이미지 센서 셀 크기의 500배, 50mm라는 뜻이다. 실제 단위를 셀 크기와 초점거리로 표현해 놓은 것이다. 왜? 값을 이미지 센서에 종속시킴으로서 영상에서의 기하학적 해석을 용이하게 하기 위해서.
지금까지 우리는 단지 차선을 검출한 방법에 대해서 공부했습니다. 하지만 직선이 아닌 곡선 차선일 경우 어떻게 자동차의 방향을 조절할 수 있을까요? 이번 게시글에서는 그 방법에 대해서 정리합니다. 대략적인 과정은 다음과 같습니다.
방향 조절을 위해서 곡률 반경을 구해야 합니다. 모터 제어값같은 하드웨어적 출력을 주는 코드는 컴퓨터 비전과는 관계가 없으므로, 결론적으로 곡률 반경을 구하는 것이 목적입니다.
이번 강의에서는 위의 이미지를 예시로 사용합니다. 이 이미지는 저번 강의에서 사용했던 조감도(bird’s eye view)와 Gradient 검출 알고리즘으로 차선만을 흰색으로 검출한 결과입니다. 이번 강의는 거의... read more
카메라 캘리브레이션, 왜곡 교정, 원근 변환 등으로 보정된 이미지에서 어떤 개체, 예를 들면 차선 같은 개체를 찾아내는 방법에 대해서 알아보겠습니다. 컴퓨터가 이미지에서 개체를 식별하는 방법의 키워드는 그래디언트(Gradient)입니다. 그래디언트는 경도, 기울기, 변화도 등으로 해석될 수 있습니다. 이전의 색상과 비교하여 다음 색상과의 색상값 차이(RGB)를 계산하여, 변화가 크면 변화도가 큰 것으로, 물체의 경계(edge)라고 판단합니다. 이번 게시글에서는 그래디언트 계산 방법 중 Sobel 필터에 대해서 정리합니다.
소벨 필터는 위에서 언급했듯이 물체의 경계를 찾는 필터입니다. 생김새는 다음과 같습니다.
컴퓨터 비전에서 사용하는 센서 중 가장 중요한 것은 단연코 카메라입니다. 이미지 처리가 주된 내용인 만큼 카메라가 감지하는 정보는 높은 정확도를 요구합니다. 하지만 공장에서 만들어지기만 한 카메라를 바로 사용하기에는 문제가 있습니다. 내부 파라미터 조정이나 렌즈에 의한 왜곡 등이 아직 보정되지 않았기에 왜곡된 이미지가 출력될 수 있습니다. 이러한 상태의 카메라의 이미지를 보정하는 과정은 다음과 같습니다.
사실 원근 변환은 이미지를 보정하는 과정보다는 가공하는 과정에 가깝지만 이번 강의에서 소개해주는 김에 다루도록 하겠습니다.
카메라 캘리브레이션은 간단히 말하면 3차원의 형상을 2차원으로 온전히 옮길... read more
지난 게시글에 이어 CNN의 구성과 LeNet-5를 예시로 파라미터를 계산해 보겠습니다.
input 1 is the X coordinate of the point, Input 2 is the y coordinate of the point,
^^^왜인지 버그가 나서 아무말이나 지껴둔것
CNN의 구성을 공부하는 예시로서 대표적으로 사용되는 LeNet-5 모델으로 정리하겠습니다.
LeNet-5 네트워크는 CNN을 처음으로 개발한 Yann Lecun 연구팀이 개발한 CNN 알고리즘의 이름입니다. 이 알고리즘이 소개된 논문 제목은 Gradient-based learning applied to document recognition”입니다.
LeNet-5 네트워크는 Input-C1-S2-C3-S4-C5-F6-Output으로 이루어져 있고, Convolution layer, Pooling layer 두 쌍(C1-S2-C3-S4)과 Flatten layer(C5), Fully... read more
지금까지 우리는 심층 신경망(Deep Nerual Network)을 구성하기까지의 과정을 살펴보았습니다. 이제 이 심층 신경망으로 구성할 수 있는 네트워크 중 이미지 학습에 최적화된 합성곱 신경망(Convolutional Nerual Network, CNN)에 대해서 알아보겠습니다.
CNN이 고안되기 전에는 이미지를 Fully Connected Nerual Network라는 1차원 벡터 형태의 데이터를 학습하는 형태의 신경망 구조를 사용했습니다. 하지만 FNN은 몇 가지 단점이 있습니다.
첫번째로 이미지 데이터를 평면화 시키는 과정에서 이미지의 인접한 픽셀 간의 정보가 유실된다는 점입니다. FNN은 1차원 벡터 형태의 데이터를 입력받기 때문에 이미지의 인접 픽셀간의 상관관계를 반영할 수 없습니다. 반면 CNN은 이미지의 특징을 보존한 채로 학습을 진행하기 때문에 인접... read more
지금까지 정리한 Nerual Network는 모두 layer가 하나뿐인 단층 신경망(Single-Layer Perceptron)입니다. 하지만 단층 신경망으로는 비선형 모델을 구현할 수 없습니다. 지난 게시글에서 언급한 바와 같이 비선형 모델은 입력층(Input layer), 은닉층(Hidden layer), 출력층(Output layer)으로 이루어진 $^{1)}$심층 신경망(Deep Neural Network)으로 구현할 수 있습니다. 따라서 인공 신경망의 성능 향상을 위해서는 심층 신경망의 사용은 필수적이라고 할 수 있습니다.
심층 신경망에 대해서 정리하기 전에 ReLU 활성화 함수에 대해서 알아보고 넘어가겠습니다. 활성화 함수는 각 층의 신경망의 출력을 결정하는 함수입니다. 또한 활성화 함수가 없다면 심층 신경망은 $y=W_{1}W_{2}W_{3} \cdots x=Wx$가 되므로 비선형 모델이라고 볼 수 없는 결과가 나옵니다. 이러한 문제를 해결하기... read more
지난 게시글에 이어 EKF를 사용한 SLAM 방법을 정리하겠습니다. SLAM은 로봇의 Localization과 Map을 작성하는 것이 목적으로 실시간 결과로서 로봇의 위치가, 최종적인 결과로서 로봇이 작성한 Map을 얻을 수 있습니다. 여기서 Map은 랜드마크의 위치를 기록한 자료로서, 사람이 생각하는 시각적인 지도가 아닌 랜드마크의 위치만을 기록한 txt 파일이 될 수도 있습니다. 이러한 SLAM의 방법으로는 Kalman Filter, Particle Filter, Graph-based 3가지로 나눌 수 있습니다. 이번 게시글에서는 EKF를 사용한 SLAM을 중심으로 설명하도록 하겠습니다.
위 그림은 EKF를 이용한 online SLAM을 표현한 그림입니다. online은 실시간인 만큼 현재 로봇의 위치 state $x_t$만을 저장하는 방식으로 작동합니다. $m$은 랜드마크의... read more
이 게시글에서는 SLAM에서의 KF와 EKF를 기준으로 설명할 예정입니다.
칼만 필터는 현재 상태(state) $\mu$와 공분산(covariance) $\Sigma$를 기반으로 다음 상태를 추정하는 방법입니다. $\mu$와 $\Sigma$만으로 나타낼 수 있는 Gaussian 분포를 따르며, 지난 게시글의 Bayesian Filter와도 관계가 있습니다. 선형 칼만 필터를 설명하기 전에 가우시안 분포에 대해서 조금 설명하도록 하겠습니다.
가우시안 분포는 단일 변수(single variable)과 다변수(multi variable)의 표현 방식이 있으며, SLAM 에서는 로봇의 현재 state를 벡터 $(x,y,\phi)$로 표시하기 때문에 다변수 가우시안 분포를 사용하는 것이 좋습니다.
일반적으로,... read more
지난 게시글에 이어 EKF를 사용한 SLAM 방법을 정리하겠습니다. SLAM은 로봇의 Localization과 Map을 작성하는 것이 목적으로 실시간 결과로서 로봇의 위치가, 최종적인 결과로서 로봇이 작성한 Map을 얻을 수 있습니다. 여기서 Map은 랜드마크의 위치를 기록한 자료로서, 사람이 생각하는 시각적인 지도가 아닌 랜드마크의 위치만을 기록한 txt 파일이 될 수도 있습니다. 이러한 SLAM의 방법으로는 Kalman Filter, Particle Filter, Graph-based 3가지로 나눌 수 있습니다. 이번 게시글에서는 EKF를 사용한 SLAM을 중심으로 설명하도록 하겠습니다.
위 그림은 EKF를 이용한 online SLAM을 표현한 그림입니다. online은 실시간인 만큼 현재 로봇의 위치 state $x_t$만을 저장하는 방식으로 작동합니다. $m$은 랜드마크의... read more
이 게시글에서는 SLAM에서의 KF와 EKF를 기준으로 설명할 예정입니다.
칼만 필터는 현재 상태(state) $\mu$와 공분산(covariance) $\Sigma$를 기반으로 다음 상태를 추정하는 방법입니다. $\mu$와 $\Sigma$만으로 나타낼 수 있는 Gaussian 분포를 따르며, 지난 게시글의 Bayesian Filter와도 관계가 있습니다. 선형 칼만 필터를 설명하기 전에 가우시안 분포에 대해서 조금 설명하도록 하겠습니다.
가우시안 분포는 단일 변수(single variable)과 다변수(multi variable)의 표현 방식이 있으며, SLAM 에서는 로봇의 현재 state를 벡터 $(x,y,\phi)$로 표시하기 때문에 다변수 가우시안 분포를 사용하는 것이 좋습니다.
일반적으로,... read more
잡음이 포함된 선형 시스템에서 대상체의 상태(State)를 추적하는 재귀 필터. 쉽게 말하면 피드백을 통해 대상의 파라미터를 계속해서 수정하는 역할을 하는 것이다.
칼만 필터는 예측 단계와 추정(업데이트) 두개의 시퀀스를 가진다.
Constant Velocity Model
아주 간단하게 상태 모델을 $x = [r, v]$ (거리: r, 속도: v) 라고 한다.... read more
본 프로젝트의 목적은 Kobuki 로봇을 사용하여 대학의 로봇관 건물을 자율주행 할 수 있도록 여러 SLAM 기법이나 Navigation 패키지를 사용해 보고, ROS 패키지를 제작하여 ROS와 우분투 환경에 익숙해지는 것입니다. 차후 있을 3D 라이다를 사용한 실내 자율주행 로봇 과제 등을 수행하기 위해 기본적인 사용법을 익히는 것을 목표로 하고 있습니다.
프로젝트의 진행 계획은 다음과 같습니다. 이 계획은 진행 상황에 따라 수정될 수 있습니다.
Kobuki를 갖고놀다 보니 터틀봇3처럼 원격접속으로 컨트롤하면 편하겠다는 생각이 들었습니다. 매번 컨트롤 할때마다 노트북을 올려놓고 하다 보니 허리를 숙여야 해서 허리에도 뭔가 부담이….
그래서 한번 라즈베리파이에 ROS kinetic과 꼬부기 패키지를 설치해보았습니다. 주말 동안 고생해서 올려 보았지만 뭔가 헛수고한 시간이 태반인듯 합니다..ㅠㅠ 구글링 해봐도 잘 정리된 글이 없어서 한번 정리해 봅니다. 물론 너무 쉬워서 다들 안 남기는거 같긴 하지만… 분명 저처럼 이리저리 헤멜 초보자가 있을 것이라 생각합니다.
사실 순서랄 것까지 없이 단순합니다. 라즈베리파이에 Ubuntu Mate 16.04 설치 - ssh 설정 - ROS kinetic 설치 - 꼬부기 패키지 설치 - 원격 접속 설정 - 구동 순서로... read more
Kobuki 로봇은 유진 로봇에서 제작한 모바일 로봇 플랫폼입니다. ROS 실습용으로 사용하기 좋은 로봇입니다. 이 게시글은 KOBUKI 설치 방법을 다루고 있습니다.
제가 사용하는 ROS 버전은 melodic이기 때문에 유진로봇 github에서 패키지를 다운받았습니다. kinetic 버전을 사용하시는 분은 아래 링크를 참고해 주십시오.
ROS wiki Kobuki Tutorial-Installation
우선 Kobuki를 위한 workspace를 만듭니다.
$ mkdir -p ~/kobuki_ws/src $ cd ~/kobuki_ws/ $ catkin_make
src 폴더에 Kobuki 패키지를 설치합니다.
$ cd src $ git clone https://github.com/yujinrobot/kobuki.git
kobuki_ws로 가서 rosdep으로 의존성을 설치해 줍니다.
$ cd ~/kobuki_ws/... read more
Markov Localization
[Udacity] Markov Localization
Localization이란 무엇?
Localization은 자율주행차 또는 모바일 로봇이 자신의 위치를 인지하는 것을 의미합니다. 직역하면 위치 추정입니다. 어떻게 하면 자동차가 자기 위치를 인식 할 수 있을까요? 그것은 바로 센서와 지도를 이용하는 것입니다. 아직은 SLAM이 아닌 지도를 알고 움직이는 자동차로 생각합니다. 이 작업에서 가장 중요한 것은 확률, $bel(x_t)$입니다.
자율주행차의 확률 $bel(x_t)$
자동차는 확률을 $bel(x_t)$라는 확률함수의 형태로 표현합니다. $x_t$는 자동차의 상태를 의미하는데, 이 강의에서는 position으로 취급합니다. 따라서 $bel(x_t)$는 자동차가 $x_t$라는 지점에 있을 확률이라고 해석할 수 있습니다. 이를 확률함수의 형태로 표현하면 그림과 같이 $bel(x_t)=p(x_t|z_{1:t}, u_{1:t}, m)$이 됩니다. 확률함수의 조건인 $z_{1:t}, u_{1:t}, m$에 대해서 알아보도록 하겠습니다.
read more
Particle Filter
Particle Filter (1) 원리 설명
Particle Filter란?
노이즈가 있는 환경에서 측정된 데이터를 필터를 사용해 실제 위치를 추정하는 도구이다. 선형 시스템과 가우시안 잡음(Gaussian Noise)가 적용되는 Kalman Filter와는 달리 비선형, 가우시안 분포가 적용되지 않는 환경에서 사용된다. turtlebot에서는 위치 추정에 사용된다. 아직은 크게 와닿지 않는 개념이다. 좀 더 알아보자.
Particle Filter의 원리
Particle Filter는 이름처럼 Particle을 사용하는 필터 기법이다. 쉽게 설명하기 위해 Youtube 채널 Team Jupeter의 Particle Filter 강의에서 든 예시를 설명하겠다. 위의 링크의 재생목록은 내가 공부하기 편하게 모아놓은 것이다. 게시글은 순전히 내 공부를 위한 것이니 사실 저기에 나온 내용을 정리해 놓은 것이기에 영상을 봐도 문제는 없다.
Stage 1
read more
Probabilistic Robotics
Bayesian Filter (1) Bayes 정리
Bayes 정리란?
$\large{ P(H|E)=\frac{P(E|H)P(H)}{P(E)} }$ $P(H): $사전확률 (가설, Hypothesis)
$P(E|H): $ 가설 $H$를 만족할 때 $E$가 발생할 확률
$P(E): $ 사건 E가 발생할 확률
$P(H|E): $사후확률 (증거, Evidence)
베이즈 정리란 쉽게 말해 확률을 어떻게 갱신할 수 있을지를 사전확률(Prior Probability)과 사후확률(Posterior Probability)의 관계로 나타낸 것입니다. 사전확률은 말 그대로 사건이 발생하기 전의 사건이 발생할 확률을 의미합니다. 사후확률 역시 별반 다르지 않습니다. 물론 사건이 발생한 후의 사건이 발생할 확률입니다.
그녀가 나를 좋아할 확률
베이즈 확률을 이해하기 위해 재미있는 예시를 들고 왔습니다. 한 수학자가 여사친에게 발렌타인데이에 초콜릿을 받았습니다. 그런데 이 수학자는 완전한 이과뇌라서 친구가 자신을 좋아할 확률을... read more
Particle Filter (1) 원리 설명
Particle Filter란?
노이즈가 있는 환경에서 측정된 데이터를 필터를 사용해 실제 위치를 추정하는 도구이다. 선형 시스템과 가우시안 잡음(Gaussian Noise)가 적용되는 Kalman Filter와는 달리 비선형, 가우시안 분포가 적용되지 않는 환경에서 사용된다. turtlebot에서는 위치 추정에 사용된다. 아직은 크게 와닿지 않는 개념이다. 좀 더 알아보자.
Particle Filter의 원리
Particle Filter는 이름처럼 Particle을 사용하는 필터 기법이다. 쉽게 설명하기 위해 Youtube 채널 Team Jupeter의 Particle Filter 강의에서 든 예시를 설명하겠다. 위의 링크의 재생목록은 내가 공부하기 편하게 모아놓은 것이다. 게시글은 순전히 내 공부를 위한 것이니 사실 저기에 나온 내용을 정리해 놓은 것이기에 영상을 봐도 문제는 없다.
Stage 1
read more
Kalman Filter 외전 - 선형 칼만 필터의 기초
Kalman filter란??
잡음이 포함된 선형 시스템에서 대상체의 상태(State)를 추적하는 재귀 필터. 쉽게 말하면 피드백을 통해 대상의 파라미터를 계속해서 수정하는 역할을 하는 것이다.
선형 칼만 필터
칼만 필터는 예측 단계와 추정(업데이트) 두개의 시퀀스를 가진다.
- 이전의 데이터를 가지고 대강 다음에 들어올 입력값을 예상. (예측 단계)
- 입력값이 들어온다. (입력 단계)
- 입력값과 예측값을 비교해서 최적의 출력값을 추정(업데이트 단계)
이때 나온 출력값은 다시 1번에서의 ‘이전의 데이터’가 된다.
1. 이전의 데이터를 가지고 다음에 들어올 입력값을 예상. (예측 단계)
칼만 필터의 예시
Constant Velocity Model
아주 간단하게 상태 모델을 $x = [r, v]$ (거리: r, 속도: v) 라고 한다.... read more
Quaternions Rotation
쿼터니안(Quaternions) 회전
쿼터니안이란?
오일러 공식에 의해 복소수를 삼각함수로 표현할 수 있다는 점에 착안하여 삼각함수 없이도 회전변환 할 수 있게 해주는 방법. (수정)
$\large{e^{i \theta}=cos \theta +i \; sin\theta \; \; \; (Eulear's formula)}$ 오일러 공식을 허수 평면에서 나타내면 다음과 같다.
$\large{e^{i \varphi} \cdot (1, 0)=e^{i \varphi} \cdot (1 +i \cdot 0)=(cos \varphi +i \; sin\varphi) \cdot (1 +i \cdot 0)=cos \varphi +i \; sin\varphi}$ 즉, 오일러 공식을 통해 좌표 $(x, y)$를 각도 $\theta$만큼 회전시킬 수 있는 것이다.
실제로 $e^{i \theta} \cdot (x+iy)$를 하면 2차원 유클리디언 공간에서 각도 $\theta$만큼 회전한... read more
ROS2
ROS2 첫걸음 (14) - 파라미터 사용(Python)
시작하며
이 게시글은 Python 노드에서 파라미터를 사용하는 방법을 정리합니다. 파라미터는 지난번에 turtlesim으로 한번 찍먹해본 적이 있습니다. 간단히 말하자면 노드 내에서 사용되는 변수이고, 이 값을 노드 내 또는 ros2 param
명령어를 통해 확인하거나 수정할 수 있습니다. 이번 게시글에서는 직접 생성, 수정을 해보도록 하겠습니다.
1. parameter 전용 패키지 생성
우선 파라미터 예제를 실습할 패키지를 생성합니다. 패키지의 위치는 ~/dev_ws/src
폴더 안입니다.
$ ros2 pkg create --build-type ament_python python_parameters --dependencies rclpy
--dependencies
명령어를 통해 rclpy
의존성 패키지를 추가합니다. 이렇게 추가한 의존성은 자동으로 package.xml
파일과 read more
ROS2 첫걸음 (13) - 나만의 msg와 srv 파일(Python)
커스텀 메시지와 서비스 파일
메시지와 서비스 파일이 무엇인지는 이전 강의들에서 설명했습니다. 이번 게시글에서는 나만의 msg와 srv 파일을 만들어 사용하는 방식을 익혀보도록 합시다. 과정은 다음과 같습니다.
- msg & srv 전용 패키지 생성
- msg & srv 파일 작성
- 이전에 사용했던 publisher & subscriber 수정
- 이전에 사용했던 server & client 수정
- 빌드 & 소스(적용), 실행 조금 길어 보이지만, 각각 짧은 과정들이니 빠르게 해 봅시다.
1. msg & srv 패키지 생성
msg와 srv파일을 관리하는 패키지를 만들겠습니다. ~/dev_ws/src
디렉토리에 패키지를 생성합니다.
$ ros2 pkg create --build-type ament_cmake tutorial_interfaces
그 다음, 패키지 폴더 안으로 이동하여... read more
ROS2 첫걸음 (12) - 서비스와 클라이언트(Python)
서비스와 클라이언트
서비스와 클라이언트는 ROS의 pub/sub와는 다른 통신방식입니다. 이들에 대한 설명은 다음 게시글에 정리되어 있습니다. 이번 게시글은 사용방법에 대해서 알아보기로 합시다.
서비스-클라이언트 작성의 단계
srv-cli 작성은 약 단계로 진행됩니다.
- 패키지 작성
- 서비스, 클라이언트 노드 작성
- setup.py 편집
- build & 실행 차례대로 살펴봅시다.
1. 패키지 작성
패키지 작성은 지금까지와 비슷합니다. ros2 pkg create
명령어를 사용합니다.
ros2 pkg create --build-type ament_python py_srvcli --dependencies rclpy example_interfaces
이번 ros2 pkg create
명령어에서는 --dependencies rclpy example_interfaces
라는 구문을 추가하였습니다. 이 구문은 package.xml
에 의존성을 자동으로(?) 추가시켜 줍니다. 그래서... read more
Raspberry Pi
Raspberry Pi Camera Calibration
raspi camera로 camera calibration하기
이 게시글은 라즈베리파이 카메라로 캘리브레이션을 하는 내용입니다.
순서는 다음과 같습니다.
- raspicam_node 설치
- camera calibration
- Troubleshooting
1. raspicam_node 설치
ROS로 camera calibration을 하려면 우선 /camera/image 토픽과 /camera 토픽이 필요합니다. 따라서 해당 카메라의 토픽을 실행시킬 수 있는 패키지를 설치해야 합니다. 설치방법은 여기에 나와 있지만 정리해보도록 합시다.
git clone
명령어를 통해 catkin_ws/src
폴더에 패키지를 다운받습니다.
$ cd catkin_ws/src $ git clone https://github.com/UbiquityRobotics/raspicam_node.git
ROS에 인식되지 않는 의존성 몇 가지를 위해 다음 명령어를 실행해 줍니다.
$ sudo gedit /etc/ros/rosdep/sources.list.d/30-ubiquity.list
열린... read more
라즈베리파이 초기 설정하기
라즈베리파이 초기 설정
라즈베리파이에 라즈비안을 설치했을 때 몇 가지 해줘야 할 초기 설정에 대해서 정리합니다. 개인적으로 깔 때마다 찾아서 해주는 설정이기에 한번에 보고자 이곳에 정리합니다.
와이파이 설정
wpa_supplicant.conf 파일을 엽니다. 아직 gedit이 설치가 안되어있으니 nano 편집기를 사용합니다.
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
와이파이 사용국가를 US로 바꿉니다.
# country=KR country=US
그 후 라즈베리파이를 재부팅하면 와이파이가 잡힙니다.
한글 폰트 설치
와이파이를 잡았다면 한글 폰트를 설치해 줍시다.
$ sudo apt-get update $ sudo apt-get install fonts-nanum
재부팅하면 깨져 보이던 한글이 다시 보일것입니다.
gedit 설치
window 메모장과... read more
RealSense
Camera_calibration 실습
realsense d435i의 카메라는 Monocular 인가? Stereo 인가?
이 부분을 잘못 알아서 한참 헤맸다. 틀림없이 Stereo인줄 알았는데 오른쪽에 렌즈 하나만 달린 Monocular 였던 것이다. 아…. 현타 엄청나게 왔다
Monocular 카메라의 캘리브레이션 방법은 다음 사이트에 나와 있다.
ROS wiki: How to Calibrate a Monocular Camera
Intel이 제공하는 Calibration SDK 사용
intel에서 제공하는 calibration tool을 사용한 캘리브레이션 시도해 보았다. 하지만 내부 파라미터를 빼오기 힘들어 지양하는 방법이란 말을 듣고 바로 포기했다. 사실 issue로서 failed to start calibration 이 떴다. 왜인지는 모르겠다.
Monocular Camera Calibration
-issue: Waiting for service /camera/set_camera_info …
Service not found
rosrun 명령어 끝에... read more
Camera_calibration(1) 내부 파라미터의 구성요소
Camera_calibration
Camera calibration을 하는 이유는 2d 평면을 3d 모델로 해석하기 위해서 필요한 파라미터를 구하는 것이다.
A[R/t] 행렬에서 A행렬이다.
A행렬은 내부 파라미터(intrinsic calibration)라고 하는데 이의 구성은
1. 초점거리 fx, fy
실제 단위: mm, 카메라 모델 단위: pixel
pixel은 이미지 센서의 셀 크기에 대해 상대적인 값으로 표현
예를 들어 셀 크기: 0.1mm, 초점거리가 500mm면 렌즈 중심에서 이미지 센서까지의 거리는 이미지 센서 셀 크기의 500배, 50mm라는 뜻이다. 실제 단위를 셀 크기와 초점거리로 표현해 놓은 것이다. 왜? 값을 이미지 센서에 종속시킴으로서 영상에서의 기하학적 해석을 용이하게 하기 위해서.
... read more
Realsense
이전의 RealSense D435i 진행 요약
지금까지의 진행상황 요약
RealSense D435i를 교수님께 받고 SDK 툴을 설치했다. ROS wiki의 RealSense 항목을 참조했다.
ROS wiki RealSense 항목
그 후 Rviz를 설치하여 Depth Camera의 PointCloud와 rgb camera를 볼 수 있었다.
(rviz 사진 첨부 필요)
realsense d435i와 rviz 연동해봄.
필요한것은 *roslaunch realsense2_camera rs_rgbd.launch, rviz
이를 위해서 rgbd가 설치되어 있어야 한다.
안되어 있으면 Resource not found: rgbd_launch 오류 발생.
sudo apt install ros-<ros_version>-rgbd-launch
커맨드를 실행해 설치.
이후 rviz에서 map->camara_link로 변경, Add->Pointcloud2를 선택하여 realsense 작동을 확인할 수 있다.
read more
SLAM
Bayesian Filter (1) Bayes 정리
Bayes 정리란?
$\large{ P(H|E)=\frac{P(E|H)P(H)}{P(E)} }$ $P(H): $사전확률 (가설, Hypothesis)
$P(E|H): $ 가설 $H$를 만족할 때 $E$가 발생할 확률
$P(E): $ 사건 E가 발생할 확률
$P(H|E): $사후확률 (증거, Evidence)
베이즈 정리란 쉽게 말해 확률을 어떻게 갱신할 수 있을지를 사전확률(Prior Probability)과 사후확률(Posterior Probability)의 관계로 나타낸 것입니다. 사전확률은 말 그대로 사건이 발생하기 전의 사건이 발생할 확률을 의미합니다. 사후확률 역시 별반 다르지 않습니다. 물론 사건이 발생한 후의 사건이 발생할 확률입니다.
그녀가 나를 좋아할 확률
베이즈 확률을 이해하기 위해 재미있는 예시를 들고 왔습니다. 한 수학자가 여사친에게 발렌타인데이에 초콜릿을 받았습니다. 그런데 이 수학자는 완전한 이과뇌라서 친구가 자신을 좋아할 확률을... read more
Particle Filter (1) 원리 설명
Particle Filter란?
노이즈가 있는 환경에서 측정된 데이터를 필터를 사용해 실제 위치를 추정하는 도구이다. 선형 시스템과 가우시안 잡음(Gaussian Noise)가 적용되는 Kalman Filter와는 달리 비선형, 가우시안 분포가 적용되지 않는 환경에서 사용된다. turtlebot에서는 위치 추정에 사용된다. 아직은 크게 와닿지 않는 개념이다. 좀 더 알아보자.
Particle Filter의 원리
Particle Filter는 이름처럼 Particle을 사용하는 필터 기법이다. 쉽게 설명하기 위해 Youtube 채널 Team Jupeter의 Particle Filter 강의에서 든 예시를 설명하겠다. 위의 링크의 재생목록은 내가 공부하기 편하게 모아놓은 것이다. 게시글은 순전히 내 공부를 위한 것이니 사실 저기에 나온 내용을 정리해 놓은 것이기에 영상을 봐도 문제는 없다.
Stage 1
read more
Kalman Filter 외전 - 선형 칼만 필터의 기초
Kalman filter란??
잡음이 포함된 선형 시스템에서 대상체의 상태(State)를 추적하는 재귀 필터. 쉽게 말하면 피드백을 통해 대상의 파라미터를 계속해서 수정하는 역할을 하는 것이다.
선형 칼만 필터
칼만 필터는 예측 단계와 추정(업데이트) 두개의 시퀀스를 가진다.
- 이전의 데이터를 가지고 대강 다음에 들어올 입력값을 예상. (예측 단계)
- 입력값이 들어온다. (입력 단계)
- 입력값과 예측값을 비교해서 최적의 출력값을 추정(업데이트 단계)
이때 나온 출력값은 다시 1번에서의 ‘이전의 데이터’가 된다.
1. 이전의 데이터를 가지고 다음에 들어올 입력값을 예상. (예측 단계)
칼만 필터의 예시
Constant Velocity Model
아주 간단하게 상태 모델을 $x = [r, v]$ (거리: r, 속도: v) 라고 한다.... read more
Tensorflow
[Udacity] Deep Learning (4) - Tensorflow
왜 Tensowflow 인가
Tensorflow란?
지난 시간까지 신경망을 쌓으면서 모델을 학습, 즉 적절한 가중치와 바이어스를 구하는 방법을 이론적으로 알아보았습니다. 이번 게시글에선 이 방법들을 물리적인 코드로 구현해 보겠습니다. 하지만 코드로 구현한다고 하여 덧셈 뺄셈 연산자를 이용하여 밑바닥부터 구현한다는 의미는 아닙니다. 이미 시중에는 딥러닝을 초보자도 쉽게(?) 구현할 수 있도록 제작해 놓은 여러 라이브러리들이 있습니다. 이 중 우리는 가장 많은 사람들이 사용하는 Tensorflow를 사용할 것입니다.
Tensorflow는 구글에서 만든 딥러닝을 쉽게 구현할 수 있도록 기능을 제공하는 라이브러리입니다. 위 그림과 같이 딥러닝을 할 사용되는 텐서 형태의 데이터들이 모델을 구성하는 연산들의 그래프를 따라 흐르면서 연산이 일어납니다.... read more
Tensorflow 공부 (1) - Tensorflow 설치
Tensorflow 설치
일반적으로 Terminal에서 pip install tensorflow
명령어를 통해 설치할 수 있다.
특정한 버전이 필요하다면 pip install tensorflow -v '<필요한 버전>'
명령어를 사용하면 된다.
anaconda 가상환경 설치
- anaconda를 설치
- 다음 블로그를 참고하여 acaconda를 설치한다.
[Ubuntu 18.04] Anaconda 설치 및 가상환경 구축
- anaconda 가상 환경 설치 후 PATH 환경변수 설정
- bashrc에
export PATH=~/anaconda3/bin:~/anaconda3/condabin:$PATH
추가
- Terminal에서
conda activate base
실행, anaconda 가상환경을 실행 conda activate base
에서 base는 가상환경 이름이기에 임의로 설정이 가능하다. conda activate base
실행에서 다음의... read more
Turtlebot3
Turtlebot SLAM 실습 - SLAM과 내비게이션
SLAM과 내비게이션
사실상 모바일 로봇(turtlebot 같은)의 최종적인 목적은 내비게이션이다. 여기서 말하는 내비게이션이란 정해진 목적지까지 이동하는 것이다. 스스로 목적지까지 이동하기 위해서는 무엇이 필요할까? 내비게이션 알고리즘에 따라 다르겠지만 보통 다음 기능들이 필수적으로 갖춰져 있어야 한다.
- 지도
- 로봇 자세 계측/추정 기능
- 벽, 물체 등 장애물 계측 기능
- 최적 경로를 계산하고 주행하는 기능
1. 지도
로봇 스스로 지도를 만드는 기법이 바로 SLAM이다. SLAM은 Simultaneous localization and mapping의 줄임말로, 동시적 위치 추정 및 지도 작성이라고 할 수 있겠다. 쉽게 말해 지금 내가 어디 있는지, 그리고 어떤 장소에 있는지를 계속해서 인지하면서 지도를 만드는 것이다.
2. 로봇 자세 계측/추정 기능
로봇이 자신의... read more
Udacity
[Udacity] Deep Learning (7) - CNN 구성과 LeNet-5
지난 게시글에 이어 CNN의 구성과 LeNet-5를 예시로 파라미터를 계산해 보겠습니다.
input 1 is the X coordinate of the point, Input 2 is the y coordinate of the point,
^^^왜인지 버그가 나서 아무말이나 지껴둔것
1. CNN의 구성
CNN의 구성을 공부하는 예시로서 대표적으로 사용되는 LeNet-5 모델으로 정리하겠습니다.
LeNet-5 네트워크란?
LeNet-5 네트워크는 CNN을 처음으로 개발한 Yann Lecun 연구팀이 개발한 CNN 알고리즘의 이름입니다. 이 알고리즘이 소개된 논문 제목은 Gradient-based learning applied to document recognition”입니다.
LeNet-5 네트워크는 Input-C1-S2-C3-S4-C5-F6-Output으로 이루어져 있고, Convolution layer, Pooling layer 두 쌍(C1-S2-C3-S4)과 Flatten layer(C5), Fully... read more
[Udacity] Deep Learning (6) - Convolutional Nerual Network
지금까지 우리는 심층 신경망(Deep Nerual Network)을 구성하기까지의 과정을 살펴보았습니다. 이제 이 심층 신경망으로 구성할 수 있는 네트워크 중 이미지 학습에 최적화된 합성곱 신경망(Convolutional Nerual Network, CNN)에 대해서 알아보겠습니다.
CNN이 되기까지
CNN이 고안되기 전에는 이미지를 Fully Connected Nerual Network라는 1차원 벡터 형태의 데이터를 학습하는 형태의 신경망 구조를 사용했습니다. 하지만 FNN은 몇 가지 단점이 있습니다.
첫번째로 이미지 데이터를 평면화 시키는 과정에서 이미지의 인접한 픽셀 간의 정보가 유실된다는 점입니다. FNN은 1차원 벡터 형태의 데이터를 입력받기 때문에 이미지의 인접 픽셀간의 상관관계를 반영할 수 없습니다. 반면 CNN은 이미지의 특징을 보존한 채로 학습을 진행하기 때문에 인접... read more
[Udacity] Deep Learning (5) - Deep Nerual Network
Deep Nerual Network
지금까지 정리한 Nerual Network는 모두 layer가 하나뿐인 단층 신경망(Single-Layer Perceptron)입니다. 하지만 단층 신경망으로는 비선형 모델을 구현할 수 없습니다. 지난 게시글에서 언급한 바와 같이 비선형 모델은 입력층(Input layer), 은닉층(Hidden layer), 출력층(Output layer)으로 이루어진 $^{1)}$심층 신경망(Deep Neural Network)으로 구현할 수 있습니다. 따라서 인공 신경망의 성능 향상을 위해서는 심층 신경망의 사용은 필수적이라고 할 수 있습니다.
ReLU Activation Function
심층 신경망에 대해서 정리하기 전에 ReLU 활성화 함수에 대해서 알아보고 넘어가겠습니다. 활성화 함수는 각 층의 신경망의 출력을 결정하는 함수입니다. 또한 활성화 함수가 없다면 심층 신경망은 $y=W_{1}W_{2}W_{3} \cdots x=Wx$가 되므로 비선형 모델이라고 볼 수 없는 결과가 나옵니다. 이러한 문제를 해결하기... read more
github
C++ 코딩 테스트 입출력 시간을 좀 더 줄이는 방법
ios_base::sync_with_stdio(false)
ios_base::sync_with_stdio(false)의 의미는 C에서의 입출력 라이브러리 stdio와 C++에서의 입출력 라이브러리 iostream의 버퍼 동기화를 분리하는 역할입니다.
장점
cin과 cout은 C의 stdio의 입출력함수 printf, scanf와 버퍼를 동기화하고 있어 ios_base::sync_with_stdio(false) 함수를 통해서 버퍼를 분리하여 C++만의 버퍼를 사용합니다. 검사할 버퍼의 크기가 줄어듦으로서 속도 향상의 이점을 누릴 수 있습니다.
단점
stdio와 iostream의 버퍼를 분리하였으므로 C언어에서의 입출력 함수(printf, scanf, getchar, puts, putchar 등)들을 사용하지 못합니다.
cin.tie(NULL)
cin.tie(NULL)은 cin과 cout의 tie를 풀어준다는 의미입니다. cin과 cout은 기본적으로 tie되어 있어 cin을 사용하기 전에 cout에서 출력할 값을 내보내서 “Enter name:” 을 출력합니다. 이때 출력할 값을 버퍼에서 내보내는 것을 플러시(flush)라고 합니다. cin과 cout 둘 중 한쪽만 untie해도... read more
자주쓰는 git 명령어 정리
사용해본 git 명령어 정리
git init : git 공간 만들기
git clone : git repository로부터 다운로드(깃 공간까지)
git add . : 깃 공간의 변경사항 전부 추가(저장후보) (잘몰겟음)
git commit -m ‘(커밋 메시지)’ : git add로 추가한 내용들 local에 업로드
git push : local -> remote로 업로드
git status : 깃 공간의 현재상태(커밋내용, 현재 브랜치 등)
git branch : 현재 깃 공간(local)의 브랜치 보기
git log : 현재 브랜치의 커밋 목록들 보기(q 누르면 종료, enter 누르면 계속 보여줌)
-v : 브랜치 상세정보, 마지막 커밋 메시지 확인
-r : 리모트 공간의 브랜치... read more
모두를 위한 딥러닝
Tensorflow 공부 (1) - Tensorflow 설치
Tensorflow 설치
일반적으로 Terminal에서 pip install tensorflow
명령어를 통해 설치할 수 있다.
특정한 버전이 필요하다면 pip install tensorflow -v '<필요한 버전>'
명령어를 사용하면 된다.
anaconda 가상환경 설치
- anaconda를 설치
- 다음 블로그를 참고하여 acaconda를 설치한다.
[Ubuntu 18.04] Anaconda 설치 및 가상환경 구축
- anaconda 가상 환경 설치 후 PATH 환경변수 설정
- bashrc에
export PATH=~/anaconda3/bin:~/anaconda3/condabin:$PATH
추가
- Terminal에서
conda activate base
실행, anaconda 가상환경을 실행 conda activate base
에서 base는 가상환경 이름이기에 임의로 설정이 가능하다. conda activate base
실행에서 다음의... read more
모두를 위한 딥러닝 정리(3) - Cross Entropy
CROSS-ENTROPY 비용 함수
Cross entropy는 Softmax 함수를 이용한 다중 분류의 비용, 즉 오차에 대한 평가를 나타내기 위한 용도입니다. 기본적인 공식은 다음과 같습니다.
$\large{ D(S, L)=-\sum_{i} \; L_{i} \; log(S_{i}) }$ $S_{i}:$ Softmax 함수의 출력값, $S(\overline{y})=\overline{Y}$
$L_{i}:$ Label값. 실제값이다. $L=Y, \; A,B,C$ 범주 중 $A$가 정답일때, $\begin{bmatrix} 1\0\0 \end{bmatrix}$
이제 이 식이 어째서 비용함수인지 알아봅시다. 위의 식을 다시 나타내면 다음과 같습니다.
$\large{ -\sum_{i} \; L_{i} \; log(S_{i})=\sum_{i} \; (L_{i}) \cdot \; (-log(S_{i})) }$ $\sum$ 안으로, $log$ 앞으로 마이너스 부호가 이동했습니다. 여기서 우리는 $-log$함수를 알아볼 필요가 있습니다. 먼저 그래프부터 봅시다.
read more
모두를 위한 딥러닝 정리(2) - Softmax Regression
Logistic 회귀 - 이진 분류
Logistic 회귀는 데이터를 0과 1로 나누기 위해 사용되는 모델이다. 다른 이름으로 이진 분류(Binary Classification)이 있다. Softmax는 데이터를 2개 이상의 그룹으로 나누기 위해서 이진 분류를 확장한 모델이다. Logistic 회귀를 나타낸 그림은 다음과 같다.
$\large{H_{L}(X)=WX}$ $\large{z=H_{L}(X), \; \; \; Logistic Regression: g(z)}$
일반적으로 Logistic 회귀를 사용할 때 Sigmoid 함수를 사용한다. 결과가 항상 0 또는 1로 수렴되기 때문이다.
Multinomial Classification
그렇다면 다중 분류는 어떻게 할 수 있을까? 이진 분류는 Sigmoid 함수에 넣으면 뚝딱 나오지만 다중 분류는 아직 감이 잡히지 않는다.
다음 표를 토대로... read more
실내 자율 주행
2021 여름 프로젝트 - 실내 자율 주행 로봇
지난번에 작성했던 간단한 실내 자율주행 로봇 패키지를 조금 발전시킨 형태입니다. 최종적인 목표는 아래 그림과 같은 택배를 가져다주는 실내 배송 로봇입니다.
제가 맡은 부분은 로봇 SLAM 및 네비게이션이었기 때문에 정리할 내용은 다음과 같습니다.
- Cartographer 사용
- 파라미터 사용 방법
- Waypoint Navigation
- move_base Action 사용 방법
- 소스코드
- Aruco Marker를 사용한 EKF Localization
- Fiducial Package 사용 방법
- 소스코드
read more
Indoor 2D Navigation - 개요 & 좌표범위내 신호 출력 노드
프로젝트의 목적
본 프로젝트의 목적은 Kobuki 로봇을 사용하여 대학의 로봇관 건물을 자율주행 할 수 있도록 여러 SLAM 기법이나 Navigation 패키지를 사용해 보고, ROS 패키지를 제작하여 ROS와 우분투 환경에 익숙해지는 것입니다. 차후 있을 3D 라이다를 사용한 실내 자율주행 로봇 과제 등을 수행하기 위해 기본적인 사용법을 익히는 것을 목표로 하고 있습니다.
프로젝트 계획
프로젝트의 진행 계획은 다음과 같습니다. 이 계획은 진행 상황에 따라 수정될 수 있습니다.
- Kobuki 패키지 작성
- map에서 특정 좌표를 기준으로 일정 범위 내에 위치하면 신호 출력 노드
- 좌표를 파라미터화(yaml, dynamic_reconfigure)
- gmapping, cartographer mapping 실습
- amcl, cartographer pure localization을 사용한 localization
- move_base를 사용한 자율주행
패키지... read more
코딩 테스트
[코딩 테스트] 재귀함수
1. 팩토리얼
팩토리얼은 n!으로 1부터 특정 숫자까지의 수를 모두 곱하는 것입니다. 예를 들어 5!은 1x2x3x4x5=120으로 나타냅니다.
수식으로 표현하면 다음과 같습니다.
$$ F_{n}=n*F_{n-1} $$ 따라서 재귀함수로 나타내기 위해서 다음과 같은 규칙을 지정합니다.
- 종료조건: 1이 되었을 때 1을 return
- 반복수식: $F_{n}=n*F_{n-1}$
int factorial(int num) { if(num <= 1) { return 1; } return num*factorial(n-1); }
처음 코드를 짰을 때 조건식을 num ==... read more
회사 견학 후기
YJ Link 회사 견학 후기
YJ Link는 어떤 기업인가?
YJ Link는 SMT 공정 과정에 사용되는 기계를 만드는 회사입니다.
SMT(Surface Mounting Technology)란 표면실장기술을 뜻하는 것으로 전자기기 조립을 자동으로 실행하는 장치를 총칭합니다.
인쇄회로기판(PCB) 위에 반도체나 다이오드, 칩 등을 다수의 장비로 실장하고 이를 경화시키는 기능을 수행하는 기술로 표면 실장형 부품을 PWB 표면에 장착하고 납땜하는 기술을 의미합니다.
[출처] SMT 공정과정 * SMT장점&단점|작성자 쎄크
회사 견학 내용
반도체 공정 중에 사용되는 모바일 로봇을 견학하고 왔다. 독일 로봇 회사 OMRON에서 제작한 로봇에 yj link의 모듈을 추가한 모바일 로봇이었는데 youtube ros 강의에서 실습했던 터틀봇 시뮬레이션과 거의 비슷한 시뮬레이터를 구현하고 있었다. 사실상 성능 엄청 좋은 터틀봇이다…라고도 할 수... read more