본문 바로가기
Programming/Sensors

Lidar

by OKOK 2017. 8. 2.

M8 Lidar 를 통해서 물체를 검출하고, 인식하고, 거리를 측정합니다. 이의 팔로우 모델은 유투브의 동영상을 참하면 됩니다. 여러 동영상이 있지만, 제가 가장 많이 참고한 동영상은 다음과 같습니다. 


https://www.youtube.com/watch?v=2TEohJYcPyE


먼저 주변의 사물중에 장애물을 탐지하여 빨간색으로 나타냅니다. 다음으로 3D 클러스터링을 적용하여, 물체마다 색을 달리 합니다. 다음으로 tracking 기술을 적용하여 클러스터링 된 물체를 라이더 측정 거리까지 사물을 분리합니다. 다음으로 분류라고 하여, 자동차는 빨간색으로 보행자는 파란색, 자전거를 그린색으로 나타냅니다. 


이 과정을 시도하기 위해서 github에 올라온 자료들을 하나씩 뜯어 보면서 수정하도록 하겠습니다. 먼저 가장 필요한 자료는 센서사에서 제공하는 SDK 예제코드입니다. 여기에는 일반 Cloud Viewer에서 나타낼 수 있는 방법과 ros의 rviz 에서 데이터를 확인 할 수 있는 방법 총 2가지가 제공됩니다.


https://github.com/QuanergySystems/quanergy_client

https://github.com/QuanergySystems/quanergy_client_ros


위 자료에는 간단한 설치 방법과 작동하는 방법이 담겨져 있습니다. 실행 결과는 다음과 같습니다.





이는 사물실 내부에서 실행했을 때의 사진 입니다. 이와 더불어 주차장 앞에서 찍은 실외 동영상을 올려보겠습니다. 일반 승용차의 높이인 150cm 를 기준으로 삼각대에 설치하여 측정하였습니다.


그리고 다음 절차로는 git hub 의 depth_clustering 을 시도해보도록 하겠습니다. 참고 사이트는 이곳 입니다. https://github.com/Photogrammetry-Robotics-Bonn/depth_clustering


#번역

이것은 빠르고 안정적인 알고리즘입니다. point cloud 를 분류하는데, 벨로다인 센서를 통해서 물체를. 이것은 작동합니다. 모둔 벨로다인 센서에서 즉, 16, 32, 65 레이어. 확인하세요 모든 물체들이 잡힙니다. 10 큐빅 미터 안에 포함되어 있는 물체들.


어떻게 빌드를 하나요?

catkin

OpenCV

QGLViewer

GLUT

Qt

PCL

ROS


를 각 명령어에 따라서 실행하도록 합니다.

이것은 catkin package 입니다. build script 캡킨을 해서 만드는 방법에 대해 소개하고 있습니다. 간단한 ros 작동법을 알고 있어야 합니다.  이것은 또한 catkin_tools 로 빌드 할 수 있습니다. catkin workspace 애 코드가 있다면 catkin build depth_clustering 을 명렁하세요. 참고로 이 경우에 당신은 catkin build를 사용하지 않는다면 sudo pip install catkin_tools 를 설치합니다.


어떻게 돌리나요. examples 폴더에 보면 ROS 노드들이 있습니다. standalone binaries 뿐만 아니라. 축을 보여주는 바운딩 박스 물체 주변에 예는 포함합니다. 모든 조각을 저장하는 노드뿐만 아니라. 이 예는 반드시 쉽게 비틀 수 있습니다. 


실제 세계 데이터에서 돌리기.binaries 와 폴더를 들어갑니다. 데이터를 얻습니다. 바이너리를 돌립니다. 디텍트된 물체를 보여주는 대안적으로 당신은 데이터를 돌릴 수 있습니다. Qt GUI 를 사용합니다. GUI 가 보여지면 OpenFoler 를 클릭합니다. 선택합니다. 폴더 png 파일을 예를 들어. 다운받은 data/scenario1/ 살펴봅니다. viewer를 


주어진 명령어를 복붙하여서 데이터를 얻습니다. 그리고 바이너를 돌립니다. 현재하는 것은 주어진 데이터 셋이고 스스로 다른 데이터를 만들어보아야 합니다. 설명서에 따르면 png 이므로 이것이 다를 것도 같습니다. 다른 github를 찾아야 하나 궁금합니다. 


데이터셋에서 만들어진 것의 실행결과는 다음과 같습니다.


하얀색 선이 일반적으로 잡는 것이며, 파란색이 물체를 잡는 모습입니다.

이것은 qt GUI로 돌렸을 때의 모습입니다. openFolder 버튼을 누른다음에 png file 을 엽니다. 여기에서 설정할 수 있는 파라미터들이 다양합니다. Show angle, Show segmentation, 다른 종류 anglePrecomputed가 있을 수 있고, Separation line distm separtion angle, ground remove angle, min cluster size, Max cluster size, Smoothing window size 가 있습니다. 여기서 궁금한 점은 어떻게 사진데이터를 사용한 것인지, 3D 데이터를 사용한 것인지 헷갈립니다. 폴더에는 분명 사진 자료만 있었는데 어떻게 위에서 찍은 듯한 사진이 나온 것인가요. 우분투에서 돌아가는 명령어를 보면 load cloud in , depth image st to gui, received Mat with typ, received depth, angles shown in 13676, Ground removed in 6316, Image based labeling took, labels image sent to clinets 이런 글들이 있습니다. clusters shared 도 있습니다. 차근 차근 이런 결과물들이 무엇을 의미하는지 확인해봅니다. 


다른 데이터를 활용하기 위해서 KITTI data 나 Ros input 을 활용할 수 있습니다. 또한 data 자료를 로드하므로써 GUI를 사용할 수 있습니다. ROS 인풋을 넣으라는 소리인데 어디서 해야하나요. 그럼 토픽 설정도 변경해야 하는데 어디서 해야하는지 궁금합니다. 


build 를 하기전에 수정해야 하는 부분들을 수정한 다음에 빌드를 하면 될 것 같다는 생각이 듭니다. 그렇다면 어떤 부분을 수정해야 하는지 현재, 데이터 들이 어떻게 들어가는지 확인하는 것이 필요합니다. 이 데이터만 저장된 데이터에서 실시간 데이터로 변경합니다. 


현재 안내에 따른 설치로 인해 빌드된 것은 depth_clustering_test, qt_gui_app, save_clusters_node, show_objects_kitti, show_objects+moosmann, show_objects_node 실행 파일들 입니다. 이들을 어떻게 사용하는지 보고, 어떤 것에 실시간 데이터를 연결해야 하는지가 궁금합니다. 따라서 --help를 통해서 사용방법과 나타나는 데이터들을 살펴보도록 하겠습니다. 


./depth_clustering_test --help


./show_objects_node 를 실행하였더니, --num_beams 8 에 걸리었다. 그렇다면 이 cpp 파일을 수정하면 되는 것이 아닌가. 실행 파일을 찾아서 수정해보도록 하겠습니다. 


http://wiki.ros.org/rosbridge-depricated

rosbridge 는 ROS 토픽과 서비스를 가능하도록만듭니다. TCP 소켓이나 web-sockers 을 JSON messages 로써. 소켓과 웹소캣은 사용합니다. 같은 JSON format을 요총과 응답. 


이 페이지의 마지막은 describes 설명합니다. rosbirdge 서버 자체를. 


show_objects_node.cpp 부분에서 string topic_clouds = /Sensor/points 로 변경하고 돌려보도록 하겠습니다. 코드 수정 후 재빌드를 합니다. 이 상태로 재빌드한 결과는 다음과 같습니다. 변경해야 하는 부분들이 여럿이 있는데, 이를 제대로 하기 위해서 분석할 시간이 필요합니다. 이것 말고 다음으로 카메라 칼리브레이션 단계로 바로 이동하도록 하겠습니다. 나중에 이것도 같이 연동할 수 있으니 소스파일을 잘 알고 어떻게 활용하는지 알고 있도록 합니다. 그리고 세부적인 것들 변경 가능하리라 생각됩니다.


rqt_graph


show_object_node


세세한 것들 수정을 뒤로 하고 칼리브레이션 부터 넘어가도록 하겠습니다.




다음으로 코드를 돌려보아야 할 것은 카메라와 라이더의 캘리브레이션 입니다. 여기서 제가 이해한 바로는 수식을 도출해내는 것이 목표입니다. 카메라 좌표와 라이더의 좌표가 어떠한 수식에 의해서 변형이 되는지 알고 싶은 것입니다. 그에 따라서 카메라와 라이더를 동시에 잡는 것을 시작하겠습니다. 또한 깃허브에 관련 소스가 2가지가 제공되어 있습니다. 


https://github.com/swyphcosmo/ros-camera-lidar-calibration

https://github.com/octoenigma/lidar_camera_calibration


먼저 상단에 올라오고 더욱 친절해보이는 코드를 따라 실행해보도록 하겠습니다. 결과 사진을 보아서는 아직 무엇을 하는 것인지 명확하게 감이 오지 않습니다. 따라서 실제로 구현해보고 설명하는 글을 읽어보도록 하겠습니다. 


제목: 카메라와 라이다 캘리브레이션과 시각화 로스에서. 

https://github.com/swyphcosmo/ros-camera-lidar-calibration

번역


vagrant init shadowrobot/ros-indigo-desktop-trusty64 명령어를 실행합니다. 

task1 먼저 카메라의 캘리브레이션 부터 시작합니다. 어떻게 하느지 그대로 따라해보도록 하겠습니다. 한번 설명을 쭉 읽고 실행하겠습니다. 무엇을 어떤 순서로 그리고 어떻게 결과가 나와야 제대로 하는지 알기 위해서. 그러면 결과같이 나옵니다. distortio_model 이라던지 coefficient 모델이라던지. 이러한 것들이 나옵니다. 


하나의 동영상을 촬영한 후에 그것으로 실행하는 듯합니다. 그리고 카메라 파라미터가 나오게 되면 그것을 사용하여 카메라를 보정하는 것 같습니다. 그렇다면 웹캠도 카메라가 왜곡된다는 것인가요. 모든 카메라가 왜곡되는 것인가요. 한번 직접 노트북 카메라를 활용해서 실험해보도록 하겠습니다.  



이것을 보시면 수정전과 수정후의 차이점을 알 수 있습니다. 원본 사진에서는 판이 저렇게 휘어져서 보이는 것을 알 수 있습니다.


2번째 작업으로는 라이더를 이미지에 캘리브레이션 하는 것입니다. 여기서 마하는 ROS_PACKAGE_PATH는 무엇인가요. 이 json 파일을 요구합니다. 아까 본 json 파일에 대입터를 대입하면 됩니다. 이 데이터의 점들이 어떤 것들인지 확인할 필요가 있습니다. 


어떻게 작동하는가

캘리브레이션 스크릅트는 의존합니다. scipy.optimize.minimize 함수를 찾기 위해서 translation 그리고 rotation 사이에 translation 과 rotation 병진운동 5미터로 제한됩니다. 회전각도는 360도 입니다. UV coordinates and those obtained by the state parameters at each step of the optimization. positive gradient. initial state vector. 


일단 최적화된 상태의 파라미터가 발견되면 이전 단계에서, 그 상태 벡터는 어떠한 노드에 더해질 수 있습니다. 한번씩 나오는 launch 파일에는 무엇을 수정해야 하는 것인가. 여기서 수정해야 할 부분이 따로 잇는 것인가. 실험할 때 확인이 필요합니다. 


제일 위에 사진이 복합 사진의 예라고 합니다. 이것은 어떻게 작동하는가. 잠깐 그래서 이것은 실시간이 아니라 웹캠에다가 라이더 사진을 입힌 것으로 볼 수 있을 것 같은데. 라이다는 어떻게 하는 것이지. 어떤 파일이 필요한 것이지. 이것은 요구 됩니다. 왜냐하면 그곳에는 공식적으로 지원되니다. 파이선 라이브러리 포인트 클라우드 라이브러리. external module. affine 변형 매트릭스 포함하다 회전 병진 운동. 4.0 미터 떨어짐 카메라로 부터. 


각 포인터는 레이저의 변형됩니다 카메라 프래임에. 포인터 4.0 떨어진 카메라로 부터. 포이트 부정적인 z 값은 나타냅니다. 카메라의 뷰. 전반적인 돌아가는 원리를 알아야 합니다. 그것을 위해서 정독이 필요합니다. 총 6개의 점이 찍힙니다. 최적화된 변형은 얻어집니다. 라디안으로 표기된 미터와 각도 포지션. offsetX, offsetY, offsetZ, yaw, pitch, roll 입니다. yawDeg, PitchDeg, rollDeg 각도를 얻어 낼 수 있습니다. 그렇다면 이것이 현재 라이더의 위치와 각도를 나타내느 것인가. 카메라 좌표를 넣고 나서 말입니다. 이것을 어디서 이해할 수 있을까요. 2D 와 3D에 대한 자료를 읽고 싶은데 찾을 수 있는 곳이 궁금합니다. 예상한 이미지의 좌표와 최적화해서 변형된 좌표를 알아 낼 수 있습니다. 이것을 결과값이 아니라 물리적으로 이해하고 싶은데 이것을 위한 키워드는 무엇일까요. 


보이는 바와 같이, 가장 큰 에러는 얼굴과 오른쪽 상단에 나옵니다. 그러나 전체 에러는 약 35픽셀만 이루어집니다. 변형을 활용하여, 비디오는 만들어 집니다. 나타냅니다. 싱크가 안맞는 것은 주파수가 다르기 때문에. 가상 머신에서 돌기 때문에. 그러나 사람이 잠시 멈추면 칼리브레이션도 잘 맞습니다. 자 그래서 여기까지 왔습니다. 다음으로 3번째 단계는 무엇인가요. 위의 단계는 카메라 파라미터 맞추고, 그 자료를 가지고 라이더로 카메라 캘리브레이션을 하는 것입니다. 


3단계: RGB 포인트 클라우드 라이다와 이미지 데이터를 가지고. 이미지에 포인트를 주사하는 대신, 본인은 이미지를 3디에 넣을 수 있습니다. 스크립트는 만들어졌습니다. 전송하다 새로운 포인터 RGB데이터를 이거 완전 좋은데. 3D position 과 intensity, 그리고 RGB color 를 활용합니다. 포인트클라우2 메시지와 publishing 을 메시지. 


변형 프레임이 만들어집니다. 라이다를 이미지에 캘리브레이션 하는 것과 결과는 대단하지 않습니다. 만으 이미지와 포인트 클라우드는 받습니다. 다른 주파수에서


문제에 대해서 명확히 할 것. 문제를 어디서 어떻게 찾아내고 이해할 수 있을까. 코드를 실행하기 전에 문제를 명확히 하는 것이 필요해보입니다. 코드를 돌려볼까요. 그냥. 이해가 따라올 수 있습니다. 그럼 오늘은 코드 돌려보도록 합니다. 처음부터 다시 정독하겠스니다.


제목 카메라와 라이다 캘리브레이션과 시각화 인 로스

ROS를 vagrant에서 설정하기.

먼저 vagrant 를 설치해줍니다. 설치에 문제가 있어서 https://github.com/saasbook/courseware/wiki/Setting-Up-Vagrant-Environment-on-Ubuntu-Platform

의 안내대로 따라서 환경 설정을 해줍니다. 이런 것들이 다소 헷갈릴 수 있습니다. 문제가 무엇인지 분명하면 반드시 해결이 가능합니다. 이것들은 모두 호환이 가능하게 설정되어 있기 때문입니다. vmware 에서 실행이 되지 않으므로 virtualbox 를 설치하도록 하겠습니다. virtualbox 실행시 dell 에서 불안정하였기 때문에 불안불안 합니다만, 그래도 vb에서만 된다니 울며겨자먹기로 실행해보겠습니다. 먼저 가상머신에 크롬과 복붙이 되도록 설정을 합니다. 설치하고 셋팅하는데도 시간이 오래걸립니다. 이번에는 우부툰 설치시에 보지 않고 했는데 제대로 됬는지 모르겠네요. 셋팅이 이상하면 디버깅하면 되니 너무 걱정 하지 않아도 되겠습니다. 크롬과 동시에 vagrant 설정을 해보도록 하겠습니다.


왜인지는 모르겠는데, vb가 반응속도가 상당히 느립니다. 그러므로 캘리브레이션을 하고 나서 vm으로 돌아오는 것을 원합니다. 아니면 지금 가상머신이 2개 설치되어서 느릴 수도 있습니다. 한 번 vm 을 켜보도록 하겠습니다.