본문 바로가기
Programming/Sensors

lidar-cam-calibration

by OKOK 2017. 8. 10.

파이프 라인

캘리브레이션 데이터를 준비합니다.

캘리브레이션 데이터를 kitti 캘리브레이션 서버에 업로드 합니다.

다운로드합니다 캘리브레이션 결과를

이 툴을 사용하여 새로운 데이터를 수정합니다.


lidar_camera_calibration


이 패키지는 사용됩니다. 캘리브레이션 합니다. 라이더와 카메라. 특히, 특히, Point Gray Baclkfly 와 zed 카메라는 성공적으로 캘리브레이션 되었습니다. 밸로다임 라이더에 대해서 사용하여, 라이더 카메라 캘리브레이션, 16은 오직 16개의 링을 제공하기 때문에 우리는 믿습니다. 더 높은 모델이 이 패키지와 연동되리라고.


이 패키지는 찾습니다. 회전과 이동 변합합니다. 모든 포인터 라이더프레임에 있는 카메라 프레임. 이 패키지는 사용합니다. aruco_ros 그리고 가볍게 수정된 aruco_mapping 독립적으로, 가능합니다. 독립적인 폴더 저장소에서. 이 라이더 카멜라 캘리브레이션, 포인트 클라우드 퓨젼은 제공합니다. 스크립트를 포인크 클라우드를 퓨즈하기 우해서 얻어진 2개의 스테레오 카메라. 2대의 카메라가 필요한지. 아니면 2장의 사진이 필요한 것인지 궁금합니다. 


oroca_ros_tutorials 패키지에 새로운 서비스 서버 노드, 서비스 클라이언트 노드, 서비스 파일을 추가하기 위하여 다음 예제와 같이 oroca_ros_tutorials  패키지로 이동한 후 CmakeLists.txt 파일을 수정하도록 합니다. 


이 패키지는 사용합니다. aruco_ros 와 약간 변경된 aruco_mapping 을 dependencies 로, both of 가느합니다. 저장소의 폴더로써 사용가능합니다.


이 라이더 카메라 칼리브레이션 포인트클라우느 퓨젼은 제공합니다. 스크립트를 포인트 클라우드를 퓨전하기 위해서 얻어진 2개의 스테레오 카메라로부터, 외부적으로 캘리브레이션된 사용하여 라이와 라이다 카메라 캘리브레션.


셋팅

ROS, aruco_ros, 약간 변형된 aruco_mapping ros package 카메라와 라이다 캘리브렝션 하기위한. 복사합니다. 당신의 기계를 저장소에. 저장된 저장소에 넣습니다. 그리고 폴더 돌립니다. 환경 설정 하는 부분을 어떻게 해야 하는지 정확하게 알기 위해서 quanergy_net_install 사의 것을 확인 해 봅니다. 


시작하기

그곳에 많은 환경 설정 파일 들이 있습니다. 필요로 하는 구체적인 캘리브레이션 하기위해서 카메라와 라이더. 이 config 파일은 사용가능합니다. 라이다 카메라 캘리브레이션 디렉토리. 이 find_transform.lauch 파일은 사용가능합니다. 라이다 카메라 캘리브레이션 라운치 directory.


tweaking 이 값은 도움이 될 것입니다. 이 use_camera_info_topic 은 boolean 플래그와 값 1과 0을 취합니다. 이 find_transform.launch 노드는 사용합니다 카메라 파라미터 포인트를 처리하기 위해서 그리고 표시합니다. 그들을 marking. 많약 당신은 카메라 인포 토픽을 사용하기 원한다면 read off 하기 위해서 파라미터. 이것을 1로 설정합니다. 또한, 이 외부적으로 제공된 카메라 파라미터를 사용합니다. 이 현재 파이프라인 가정합니다. 실험 셋업을 이 보드는 대부분 stationary 그리고 카메라와 라이더는 픽스합니다. 이 노드는 유저에게 마크 line-segments 첫 번쨰 이터레이션을 위해서. 일단 이 라인 세그먼트 각 보드 마크, 이 알고리즘은 돌아갑니다. 맥스 이터, 모으다 라이브 데이터와 생산합니다. 4바이4 행렬. 떄문에 이 마킹은 오직 됩니다 최초로, 


my calibration 이라는 폴더 안에 ros camera calibration 패키지를 다운받아서 사용하려 합니다. 그러다 opecv2 문제가 발생하여 이것을 해결하려 합니다. CMake warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake:76 could not find a package configuration file provded by opencv2 with any of the following names: opencv2COnfig.cmake opecv2-config.camke Add the installation prefix of opencv2 to CMAKE_PREFIX_PATH or set opencv2_DIR to a directory containing one of the above files. IF opencv2 provids a separate development package or SDK, be sure it has been installed. 


http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html


여기 안내에 따르면 opecv2 를 설치하도록 합니다. 


https://m.blog.naver.com/PostView.nhn?blogId=windowsub0406&logNo=220526108844&targetKeyword=&targetRecommendationCode=1

지금 어디서 돌아다니는 것이지.


갑작스레 opencv2 를 통해서 라이더 데이터를 받아 올 수 있지 않을까라는 생각이 들었습니다. 그래서 사용해보고 있습니다. camera lidar calibration .... 


http://www.c2l-equipment.com/content/solution/solution.html

Nebula LP:차량 장착용 고정밀 모바일매핑장치


http://item.gmarket.co.kr/DetailView/Item.asp?goodscode=990677323&GoodsSale=Y&jaehuid=200001169&NaPm=ct%3Dj66721ww%7Cci%3Dd9552c8163e1179b35db3ab48f7ced142b2274a9%7Ctr%3Dslc%7Csn%3D24%7Chk%3Db0ca5832269070c0e31d7a3230e25bacb080f14c


이런 작은 삼각대를 고정시키는 방법은 어떨지 생각해봅니다. ros를 배워서 적용해 보려고 합니다. ROS는 로봇 제어를 위한 일종의 오픈 소스 소프트웨어 플랫폼입니다. low level programming 을 선호해 왔습니다. 


http://enssionaut.com/xe/index.php?mid=board_robotics&page=2&document_srl=416


레지스터와 메모리르 직접 제어하고 라이브러리의 사용을 최대한 자제하는 것이 최적화와 신뢰성 측면에서 우위에 있다고 생각하기 때문입니다. 그러한 방식은 특히 제한적인 성능의 컨트롤러를 사용할 떄나 mission-critical한 응용 분야에서 유용합니다. 일반적인 로봇들은 고성능 처리기를 둘 수 있는 여유가 있고, 복잡한 알고리즘의 처리를 구현하는데 낮은 레벨의 세부적인 코딩을 가지고 시간을 투자하는 것이 썩 바람직하지 않습니다. 영상 처리나 내비게이션 같은 기능들을 써보려고 했으나, 그것들에 대한 하부 구조에 대한 것들을 배울 시간이 나지 않았습니다. 


제어 플랫폼의 기존 OS 위에 ROS가 들어갑니다. 기존 OS는 주로 Ubuntu이고, 부가적으로 다른 OS도 사용 가능합니다. 기본적으로 각종 영상 처리와 모션 제어, 매핑, 네비게이션, 데이터 수집 등의 기능을 제공합니다. ROS에서 지원하는 로봇 플랫폼이나 센서를 사용하면 기존에 있는 패키지를 사용하여 빠른 개발이 가능합니다. 기존 패키지가 없는 하드웨어를 사용한다면 패키지를 직접 작서앟여 사용할 수 있습니다. CPU의 아키텍쳐나 내부 메모리의 사용법을 몰라도 다양한 프로그램을 만들 수 있듯이 말입니다. Arduino처럼 하드웨어에 대한 지식을 최소화하면서도 로봇을 제어할 수 있다는 것은 이쪽 분야의 대세가 되어가고 있다는 느낌을 받습니다. 


ros 는 우분투 같은 os 위에서 동작하기 떄문에 이러한 os가 구동 가능한 하드웨어가 준비되어야 합니다. 개발용으로는 PC가 사용하기 편하며, 실제 로봇 내에서 ROS의 구동이 필요한 경우 SBC를 사용하게 됩니다. AVR 같은 8bit MCU들은 ROS를 직접 구동시키기는 어렵습니다. 이런 저성능 MCU들은 주로 ROS를 통해 처리된 데이터들을 전달받아 하드웨어를 직접 구동시키고, 센서 데이터를 ROS쪽에 보내는 역할을 합니다. 


ROS는 ROS가 구동되는 시스템끼리 데이터를 주고 받을 수 있습니다. 이 경우 TCP/IP 프로토콜을 통해 데이터가 전달되며, UDP 프로토콜도 지원되기는 하지만 거의 쓰이지 않습니다. ROS가 데이터를 주고 받는 형식은 메시지 라는 단위를 기본으로 합니다. 메시지는 토픽과 해당 토픽에 대한 데이터 값을 가지고 있습니다. 메시지를 주고 받는 당사자들을 노드라고 하며 노드는 ROS 위에서 구동되는 프로그램의 최소 단위입니다. 각 노드는 주로 기능에 따라 구성되며 메시지를 보낼 수도 있고 받을 수도 있습니다. 이 때 메세지를 보내는 노드를 발행자라고 하며, 메시지를 받는 노드를 구독자라고 합니다. 노드들은 한 시스템 내의 ROS 위에서 통신할 수 있지만 다른 시스템의 ROS 위에 있는 노드들 간에도 메시지를 주고받을 수 있습니다. 마스터는 각 노드들의 정보를 가지고 있으며, 어떤 노드가 어떤 토픽으로 메시지를 주거니 받으려 하는지를 관리하는 일종의 서버 입니다. 이러한 메시지 통신이 구체적으로 어떤 과정으로 이루어지는지 나타내 보겠습니다. 


메시지 기반 통신은 메시지 전달이 시작되면 그것이 중단되기 저까지 지속적으로 메시지를 전달합니다. 어떤 값을 지속적으로 읽어야 하거나 보내야 하는 경우 편리하게 적용될 수 있는 부분입니다. ROS에서는 마스터나 각 노드, 메시지 등의 관계를 도식화 하여 나타내주는 도구도 제공합니다. 


꼭두각시는 다양한 자세를 취할 수 있지만 꼭두각시를 움직이는 와이어들은 보통 +자 모양의 단순한 형태의 막대에 연결됩니다. 노드들 간에는 메시지나 서비스를 통하여 통신이 이루어지고, 노드와 하드웨어 사이에서는 USB, RS232, 표준입력 같은 인터페이스를 이용해 통신이 이루어진다는 점입니다. 


실제 제품에서는 언급이 없지만 개발 과정에서 트래커와 드론 카메라는 서로 ROS의 메시지 기반 통신을 통해 서로에 대한 위치를 파악한다고 합니다. 드론 카메라의 움직임을 ROS의 Rvic 노드에서 미리 시뮬레이션하여 개발 기간과 비용을 단축했다고 합니다.


ROS는 하드웨어를 직접 구동하는 것보다 데이터와 알고리즘 처리를 통핸 행동 결정이나 제어에 초점을 맞추고 있다는 것을 알 수 있습니다. 기존에 정해진 행동과 몇 가지의 기능을 반복하는 로봇들에 사용되던 제어 방식과 알고리즘은 다양한 임무가 요구되는 복잡한 로봇에 적용되기 힘들다는 문제가 있습니다. 또한 로봇들의 하드웨어가 규격화되고 있습니다. 드론의 성능 또한 얼마나 오래 날고 무거운 것을 운반 가능한지보다 어떤 기능을 얼마나 자도억으로 수행할 수 있는가에 의해 결정되는 추세입니다. ROS는 사용자가 그러한 측면에서 쉽게 개발을 하고 로봇을 만들 수 있도록 도와주는 역할이 부각된 개발 환경입니다. 하드웨어의 직접적인 구동과 간단한 임무 수행에는 기존에 사용되던 저가형 MCU 기반의 로봇 제작이 개발 속도와 비용, 신뢰성 등에서 여전히 우위를 점한다고 할 수 있습니다. 


ROS는 약 1녀 주기로 새로운 버전이 올라오며, 8번째 release인 Indigo lgloo가 지원 기간이 더 길고 안정성이 높으므로 이를 설치하도록 하겠습니다. 


우분투 저장소 설정. 우분투는 커맨드 입력을 통해 프로그램을 간편하게 설치할 수 있는 repositories 기능을 가지고 있습니다. 스마트폰에서 앱을 간단하게 설치할 수 있는 것과 유사합니다. 우분투의 소프트웨어들은 유지 지원 여부, 라이선스 등에 따라 main, restricted, universe, multiverse 등으로 분류됩니다. ROS를 설치하기 위해서 이들을 설치할 수 있또록 허용 설정하는 작업이 필요합니다. 


PC가 packages.ros.org로 부터 ROS 관련 소프트웨어를 받을 수 있도록 설정합니다. 터미널에 아래 명령어를 입력합니다. 입력해야 하는 명령어는 구분하기 쉽도록 앞에. sudh sh-c 'echo "deb http://packages.ros.org/ros/ubuntu

(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list


key 설정 다운로드 받는 패키지가 신뢰할 수 있다는 것을 확인하기 위해 key 값을 설정해 줍니다. sudo apt-key adv --key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116


debian package index 업데이트 sudo 


추가 의존성 파일 설치. 우부투 14.04.2 버전에서 의존성 문제가 발생하는 경우가 있으므로 아래 패키지를 설치합니다. 


ros 설치

sudo apt-get install ros-indigo-desktop-full

rosdep 초기화

rosdep은 ROS 구동에 필요한 요소들을 쉽게 설치할 수 있도록 합니다. rosdep 초기화를 위하여 아래 명령어를 입력합니다. 

sudo resdep init

rosdep update


rosinstall 설치

rosinstall 은 ROS 관련 source tre 나 패키지를 다운로드할 때 사용하는 도구입니다. 


sudo apt-get install python-rosinstall


개발 디렉토리 설정 같은 환경 설정 방법을 설명드리겠습니다.catkn ROS의 빌드 시스템, gedit 우분투에서 사용되는 GUI 기반 text editor. windows 의 메모장이나 워드패드르 생각. Shell: 사용자가 OS의 기능을 직접 실행할 수 있도록 해 주는 interface. Command-line 형식을 이용하는 것도 있고 GUI를 이용하는 것도 있습니다. 우분투를 포함하는 Unix 계열 OS에서 사용하는 command-line interpreter 똫ㄴ scirpting language 입니다. Scripting languague는 일반적으로 흔히 접할 수 있는 C언어 같은 programming language, 즉 source를 build한 뒤 실행시키는 개념과 달리 하나 하나의 command 를 직접 입력시켜 원하는 기능을 수행하는 형태의 언어입니다. bash 는 그러한 scripting language의 한 종류입니다. Dot file 리누스에서 현재 경로 내의 폴더와 파일을 볼 수 있는 ls 명령어로 볼 수 없는 숨겨진 파일입니다. 


리눅스에서 현재 경로 내의 폴더와 파일을 볼 수 있는 ls 명령어로 볼 수 없는 숨겨진 파일입니다. 주로 user configuration을 저장할 때 사용합니다. .bashrc: Dot file의 한 종류이며 bash 가 interactive shell user input에 의해 script가 실행되는 shell mode로 실행될 떄 먼저 자동적으로 실행됩니다. 여기에 관련 설정을 넣어 두면 새 터미널을 열 때마다 그 명령이 수행됩니다. 파일 위치는 ~/ 경로에 있습니다. 


환경 설정

1. ROS indigo 환경 설정 bash shell 실행 합니다.

$source /opt/ros/indigo/setup.bash


2. 작업 디렉토리 생성 및 초기화 합니다.

$mkdir -p ~?catkin_ws/src


3. 컴파일 하기

$cd ~/catkin_ws/ build를 하기 위해 catkin_ws 경로로 이동합니다

$catkin_make build 명령어 사용합니다.



http://enssionaut.com/xe/index.php?mid=board_robotics&page=2&document_srl=812


집중력 떨어졌으니, 내일 아침에 다시 시작합니다. 


환경 설정하고 작업 디렉토리 생성 및 초기화를 합니다. 그리고 컴파일 하면 그 다음부터 런이나 launch 를 사용할 수 있습니다. ros indigo 환경 설정 bash shell 실행합니다. 작업 디렉토리 생성 및 초기화 합니다. 컴파일 합니다. 명령어를 통해 build 결과 파일들이 생성된 것을 확인합니다. 


quanergy 사에서 나온 글에서도 명령어를 확인 할 수 있습니다. 저장소에와 빌드하는 순서가 담겨있습니다. 작업 디렉토리 생성 및 초기화 후에 노드를 받습니다. 


catkin 명령어와 관련된 bash shell 실행은 ㄷ아래와 같습니다. 이게 무슨 용어이지. source 명령어를 bash shell 을 실행시키는 기능을 합니다. 다음으로는 .bashrc 를 수정하여 source 명령어가 터미널을 켤 때마다 자동적으로 실행되도록 설정하고, master 주소와 hostname 및 alis 설정을 해보겠습니다. alias는 C언의 #define 과 비슷한 기능을 합니다. 긴 명령어를 짧은 줄임마로 사용할 수 있도록 해 줍니다. 


gedit ~/.bashrc

.bashrc 하단에 아래 내용을 추가합니다.


source/opt/ros/indigo/setup.bash ROS 설정이 포함된 bash shell 이 실행되도록 합니다. 

source ~/catkin_ws/devel/setup.bash catkin 명령어 관련 bash shell 이 실행되도록 합니다. ros package path 설정을 어디서 해야 하는 것인지 궁금합니다. 


rqt_graph 노드는 실행되고 있는 노드들의 이름과 그들의 메시지 통신 관계를 보여줍니다. ROS를 우분투에 설치한 뒤 환경 설정과 간단한 테스트를 진행해 보았습니다. ROS를 이용해 하위 제어기에 간단한 명령을 내리고, 이를 통해 하위 제어기가 하드웨어를 직접 구동하도록 만들어보겠습니다. 


노드 작성법을 간단히 요약하면 디렉토리 생성 소스 작성 설정 파일 작성 빌드입니다. 디렉토리 생성 패키지 생성 패키지를 생성하면 디렉토리 아래에 CMakeLists.txt 와 pacakage.xml 파일이 생성됩니다. 이 두 파일이 빌드에 관련도니 설정 정보를 가지고 있습니다. 


publisher 노드 작성

publisher 노드를 작성하도록 해보겠습니다. 실제로는 한 노드가 publisher 와 subscriber로서 모두 작동할 수 있지만 각각을 별개의 노드로 만들어보겠습니다. publisher는 0.2초마다 0부터 1씩 증가하는 값을 아스키코드로 메시지를 통해 전달하는 노드입니다.


콜백함수

프로그래밍에서 콜백은 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말합니다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있습니다. 일반적으로 콜백수신 코드로 콜백 코드를 전달할 때는 콜백 함수의 포인터(핸들), 서브루틴 또는 람다함수의 형태로 넘겨줍니다. 콜백수신 코드는 실행하는 동안에 넘겨받은 콜백 코드를 필요에 따라 호출하고 다른 작업을 실행하는 경우도 있습니다. 다른 방식으로는 콜백 수신 코드는 넘겨받은 콜백 함수를 핸들러로서 등록하고, 콜백수신 함수의 동작 중 어떠한 반응의 일부로서 나중에 호출할 떄 사용할 수도 있습니다.  


콜백함수라고 부릅니다. 일바적인 함수는 파라미터를 받아 함수 내부로 진입하고 결과값을 돌려줄 떄는 return 키워드를 사용해 호출자에게 값을 돌려주는 구조로 되어 있습니다. 또는 파라미테 자체를 Call by reference 로 전달해 호출자가 참조하는 값 자체를 함수 내부에서 변경하기도 하였습니다. 


콜백 함수를 사용하는 함수는 콜백의 끝 부분에서 해당 단위 작업이 완전히 종료돼야 합니다. 호출자 측에서 처리 결과를 동기적으로 받아볼 방법은 없기 떄문에 여러 단위 작업을 동기화하기에는 매우 불편합니다. 


ROS는 기본적으로 python 으로 동작하지만 roscpp 라이브러리를 통해 C++로 소스를 작성할 수 있습니다. 별도이 언급이 없는 한 C++을 사용하는 것을 기준으로 하겠습니다. 메시지의 형식은 사전 정의되어 있으며, std_msgs 와 common_msgs 그리고 사용자 정의 메시지가 있습니다. 


std_msgs 패키지에는 bool, char, float, int, string 등의 일반적으로 사용되는 자료형이 들어 있습니다. common_msgs 패키지에는 로봇의 구성부와 관련 패키지에서 주로 쓰이는 자료형이 포함되어 있습니다. common_msgs 패키지에는 가 포함되어 있습니다. 다양한 자료형을 사전 정의해 놓은 이유는 데이터를 표준화하여 서로 다른 패키지간의 정보 전달과 사용을 원할하게 하기 위해서입니다. 사용자의 필요에 따라 사전 정의된 메시지 형식 말고도 직접 메시지 형식을 만들어 사용하는 것도 가능합니다. 


소스 내에서 실제로 publisher 선언을 하는 부분은 ros::NodeHandle 클래스의 advertise()를 이용합니다. advertise()가 호출되면 마스터가 개당 토픽의 메시지를 subscribe하고자 하는 노드에게 그 토픽으로 publisher 하고자 하는 노드가 있음을 전달합니다.


queue size는 발행하는 메시지를 몇 개까지 저장해 둘 것인지 정하는 값입니다. 위에 작성한 예제 소스에서는 advertise()를 이용해 객체를 생성하고, 그 객체의 publish()를 이용해 std_msgs::Int32 자료형의 testmsg 객체가 가진 data 값을 메시지로 발행하고 있습니다.  


설정 파일 작성하기

처음에 패키지를 생성했을 때 만들어진 package.xml 과 CMakeLists.txt 파일을 수정하여 빌드 관련 내용들을 수정해 보겠습니다. 


CMakeLists.txt 파일에는 패키지 빌드와 catkin에 관련된 설정 정보가 포함되어 있습니다. catkin 버전, file include 경로, 노드 리스트, 라이브러리 의존성 등이 작성되어 있습니다. 아래의 예시에서는 순서대로 cmake 버전, 프로젝트 이름, 의존 패키지 목록, 포함 디렉토리, 노드 추가 순으로 작성하였습니다. 


package.xml 과 MakeLists.txt 파일을 모두 작성하고 난 다음에 cm 또는 ~catkin_ws/src 경로에서 catkin_make 를 통해 작성한 노드를 build 합니다. 빌드가 끝나면 ~catkin_ws/devel/lib/nodetest 경로에 pub_node 와 sub_node 두 실행 파일이 생성된 것을 확인하실 수 있습니다. 


빌드가 성공적으로 끝나면 노드를 실행시켜 작동하는지 확인합니다. roscore, rosrun nodetest pub_node, rosrun nodetest sub_node rosrun rqt_graph rqt_graph ROS 마스터 노드 실행 퍼플리셔 노드 실행, 서브스크라이버 노드 실행, rqt_graph node 를 실행합니다. 노드 관계 도식화합니다. 


왼쪽의 publisher 노드는 0부터 1씩 증가하는 값을 Asc2로 발행하고, 



rqt를 이용한 데이터 모니터링

ros는 로봇으로부터 얻을 수 있는 데이터를 쉽게 확인하고 관리할 수 있도록 rqt라고 하는 모니터링 도구를 제공합니다. rqt는 GUI개발에 쓰이는 Qt framework 기반의 ROS softwareframewrok 입니다. 프레임워크란 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것 이라고 정의하였습니다. 프레임워크는 라이브러리와 달리 애플리케이션의 틀과 구조를 결정할 뿐 아니라, 그 위에 개발된 개발자의 코드를 제어합니다. 프레임워크는 구체적이며 확장 가능한 기반 코드를 가지고 있으며, 설계자가 의도하는 여러 디자인 패턴의 집합으로 구성되어 있습니다. 


라이브러리의 정의는 자주 쓰일 만한 기능들을 모아 놓은 클래스(유틸)들의 모음집 정도로 정의할 수 있습니다. 사용자와 실제 구현하고자 하는 기능 사이에, 사용자로 하여금 구현하고자 하는 기능을 쉽게 제공해주는 중간 계층이란 면에 있어서 라이브러리와 프레임워크는 일견 비슷한 점이 있습니다. 


프레임워크와 라이브러리의 가장 큰 차이점이라 할만 한건 프레임워크에는 라이버르리에 뼈대가 되는 클래스들과 그 클래스들의 관계로 만들어진 일종의 설계의 기본 틀이 추가된다는 점일 것입니다. 확장 가능한 기반코드라든지, 재사용 가느안 형태의 협업화된 클래스들 이라는 말과 같은 뜻입니다.


설계의 기반이 되는 부분을 기술한 확장 가능한 기반 코드와 사용자가 이 코드를 자기 입맛대로 확장하는 데 필요한 라이브러리 이 두 가지 요소가 통합되어 제공되는 형태를 말하며, 사용자가 이를 이용해 일정 수준 이상의 품질을 보장받는 코드를, 비교적 빠른 시간에 완성 및 유지 보수할 수 있는 환경을 제공해주는 솔루션으로 기본적인 설계나 필요한 라이브러리는 알아서 제공해 줄거니 하고 싶은 기능 구현에만 전념해라는 .


개발 용어에도 일반적으로 사용하지만 다른 뜻이 있는 경우가 있습니다. 

라이브러리의 예시 가장 유명한 자바스크립트 라이브러리는 jQuery 입니다. 간혹 프레임워크라고 소개되는 곳이 있는데 공식 사이트에서도 라이브러리로 명시되어 있습니다. 그래픽 사용자 인터페이스에서 재사용하기 쉽게 버튼, 테이블 같은 구성 요소를 호출해서 쓸 수 있도록 분리해두었다면 라이브러리입니다. Windows 에서 간혹 보았을 dll 확장자는 동적 링크 라이브러리의 약자로 라이브러리라고 할 수 있습니다. 


프레임워크만으로는 실행되지 않으며 기능 추가를 해야 되고 프레임워크에 의존하여 개발해야 되며 프레임워크가 정의한 규칙을 준수해야 합니다. 겉보기에는 비슷하지만 많은 프레임워크가 존재하는 이유는 아래에서 설명하게 될 아키텍처가 다른 것이며 규칙을 준수해야 되는 이유기도 합니다. 


아키텍처란

프로그램 주요 구조 설계

기획한 내용을 프로그램화했을 경우 필요한 주요 특징을 기술적으로 설계하고 명시하는 것입니다. 결과물에 필요한 모든 구성 요소를 명시하지만, 구체적인 구현 방법은 포함되어 있지 않습니다. 가령, 아래에서 설명할 플랫폼은 주요 특징이지만 프레임워크와 라이브러리는 주요 특징이 아니므로 명시되지 않을 가능성이 큽니다. 


rqt 라고 하는 모니터링 도구를 제공합니다. rqt는 GUI 개발에 쓰이는 Qt frameork 기반의 ROS software framwork 입니다. rqt는 지금까지 노드간 관계를 확인할 때 써 오던 rqt_graph와 같은 GUI 플러그인을 여러 개 포함하고 있습니다. rqt는 3개의 metapackage로 구성되며 각각 rqt, rqt_common_plugins, rqt_robot_plugins 입니다. rqt 메타패키지는 rqt를 구동하는 core module 입니다. 


rqt를 처음 실행하면 아무것도 없는 빈 화면이 출력됩니다. 플러그인을 실행하여 배치하도록 합니다. Plugins 에서 아래 plugin 을 각각 실행시킨 뒤 플러그인 창을 끄어다가 원하는 위치에 배치합니다. Introspection -> Node graph 노드와 메세지 간 관계를 도식화 하여 나타내는 rqt 플러그인 Visuialization -> Plot 두 번 실행 메시지 데이터를 그래프로 나타내는 rqt 플러그인, Logging -> Bag 메시지를 실시간에 따라 저장하는 rqt 플러그인 


rqt는 매우 간단하게 모니터링 도구를 제작할 수 있도록 해 줍니다. GUI 개발에 관한 별다른 지식 없이도 데이터를 관측하고 관리할 수 있다는 점은 큰 장점입니다. Qt를 사용 가능하신 분은 자신만의 로봇 패널을 제작하여 사용해 보는 것도 괜찮을 것 같습니다.


ROS는 여러 가지 이미지 관련 패키지를 제공하고 있습니다. 


export | grep ROS

디렉토리, 디스트로, DIR, HOSTNAME, MASTER_URI, PATH, ROOT 가 있습니다. ROS가 주로 PC나 sbc 위에서 구동되기 떄문에 USB 카메라를 이용하게 됩니다. 이번에는 USB 카메라와 관련 패키지를 이용해서 영상 데이터를 얻은 다음 이미지 출력 노드를 이용해 영상을 확인해 보도록 하겠습니다. 


$ ls -ltr /dev/video*

카메라가 /dev/video0로서 연결되어 있다고 출력되었습니다. 이 파일을 알아 두었다가 카메라 인터페이스 노드 parameter 설정 부분에 기입해 주시면 됩니다. 인터페이스 패키지는 Bosch 에서 제공하는 표준 USB 카메라 인터페이스 패키지인 usb_cam을 이용하였습니다. 


image_view 를 통해 화면 상에 영상을 출력하는 것까지 보였습니다. 예전에 말씀드렸듯 메시지의 형태는 사전 정의되어 있으며 usb_cam 노드에서 사용하는 이미지의 전달 방식도 미리 정의된 sensor_msgs::image로 전달됩니다. 다른 노드에서도 이러한 형태로 이미지를 전달하거나 받는 경우가 많으며, 그 예시 중 하나로 ROS 메시지를 OpenCV에서 사용하는 이미지로 변환하는 


http://enssionaut.com/xe/board_robotics/967