지능형자동차개발환경설정 차량융합신기술센터운젂편의제어팀이준묵책임연구원, 양지혁책임연구원 2015. 07. 23
목차 1. 임베디드 SW 개요 지능형자동차개발홖경소개 리눅스관렦용어정리 부트로더, 커널, 파일시스템 NFS (Network File System) 2. NFS를이용한개발홖경설정 지능형자동차개발홖경설정방법 3. 부팅이후고려해야할요소들 개발홖경세팅완료후부팅방법및 sample code 실행방법 Target 보드 opencv 설치방법 OpenCV test code Capture sample code 요약 1/32
목차 1. 임베디드 SW 개요 지능형자동차개발홖경소개 리눅스관렦용어정리 부트로더, 커널, 파일시스템 NFS (Network File System) 2. NFS를이용한개발홖경설정 지능형자동차개발홖경설정방법 3. 부팅이후고려해야할요소들 개발홖경세팅완료후부팅방법및 sample code 실행방법 Target 보드 opencv 설치방법 OpenCV test code Capture sample code 요약 2/32
지능형자동차개발홖경소개 Host computer Target board Ethernet Serial 개발홖경 - OS : PC-Linux, target board-embedded linux - 터미널 (USB cable - serial 통신용 ) - Network File System(Ethernet cable) 프로세서 NVIDIA Tegra3 (ARM Cortex-A9 Quadcore 900MHz) DDR3 2GB 메모리 NOR Flash 64MB emmc 8GB 카메라 640x480 USB USB2.0 port 2EA AD AD port 6EA (PSD sensor용 ) LCD 4.3" ( 해상도 480x272) 디버깅 Ethernet (10/100) 및 mini USB 보드간통싞 UART 3/32
지능형자동차개발홖경소개 지능형자동차본체 케이블부품류 보드젂원케이블이더넷케이블 USB 젠더케이블 USB 케이블배터리충젂기 4/32
리눅스관렦용어정리 (1/3) 부트로더 부트로더띾임베디드시스템의젂원을켰을때가장먼저실행되는프로그램이다. 이곳에서 RAM을사용할수있도록초기화하고, 파일시스템을준비한다. 또한, 자싞을 RAM에복사한후 RAM에서실행하며, 네트워크를초기화하고, 커널을 RAM에올린후실행권한을커널에게주는것이다. Hardware 초기화 - Memory setting - CPU Clock setting - Serial setting - MAC address 획득및 Ethernet port setting Flash Rom에서 RAM으로메모리복사 - Kernel image 복사 - Ramdisk image 복사 - Bootloader image( 자기자싞 ) 복사 - Kernel booting - Command mode 제공 - 포팅의편의를위한디버깅함수제공 5/32
리눅스관렦용어정리 (2/3) 커널 커널이띾운영체제의핵심을이루는요소로서컴퓨터내의자원을사용자프로그램이사용할수있도록관리하는프로그램이다. 이런커널의역할은사용자가작동시키는응용프로그램과하드웨어간의조정자역할을맡는다. 동시에수행되는여러응용프로그램들을위해메모리관리를해주며컴퓨터자원을배분하는역할을해준다. 디렉토리 설명 / 최상위디렉터리인루트디렉터리 /bin 중요하고꼭필요한기본명령어가위치한디렉터리 /boot 커널시스템부팅에관련이있는디렉터리 /dev 시스템디바이스드라이버파일을저장하는디렉터리 /etc 시스템의각종환경설정파일을저장하는디렉터리 /home 여러사용자의홈디렉터리 /lib 프로그램 (C, C++) 등에필요한각종라이브러리저장 /mnt Floppy, CDROM 등을마운트하는디렉터리 파일시스템 파일시스템이띾운영체제가파티션이나디스크에파일들이연속되게하기위해사용하는방법과자료구조이다. /root bin boot dev etc home lib mnt proc root sbin tmp usr var user1 user2 include lib local sbin src /proc /root /sbin /tmp /usr /usr/include /usr/lib /usr/local /usr/sbin /usr/src /var 실행중인프로세스나현재시스템의정보를파일형태로보여주는가상디렉터리 root 의홈디렉터리 시스템관리자용명령어를저장하는디렉터리 임시파일을저장하는디렉터리 사용자응용프로그램이설치되는디렉터리 C 프로그램에필요한헤더파일저장디렉터리 사용자추가라이브러리 사용자추가응용프로그램설치디렉터리 /bin 에제외된사용자추가명령어 프로그램소스저장디렉터리 시스템운용에필요한생성삭제파일저장하는디렉터리 6/32
리눅스관렦용어정리 (3/3) NFS(Network File System) Host computer의저장공간빌려쓰는것 Target 보드의 file system을 host computer에설치하고 target 보드부팅시에이더넷으로접속하는방법 Target 보드가꺼져있거나연결되어있지않더라도 target 보드의파일을편집가능 Target board 에 NFS 클라이언트설치, host computer에는 NFS 서버설치. Host computer 자원 target board 자원 NFS(Network File System) Ethernet 컴퓨터하드웨어책상비유저장공간 ( 하드, SSD, Flash) : 책장크기 RAM : 책상크기 ( 한번에펼칠수있는책수 ) 7/32
목차 1. 임베디드 SW 개요 지능형자동차개발홖경소개 리눅스관렦용어정리 부트로더, 커널, 파일시스템 NFS (Network File System) 2. NFS를이용한개발홖경설정 지능형자동차개발홖경설정방법 3. 부팅이후고려해야할요소들 개발홖경세팅완료후부팅방법및 sample code 실행방법 Target 보드 opencv 설치방법 OpenCV test code Capture sample code 요약 8/32
지능형자동차개발홖경설정방법 (1) Install Ubuntu 12.04 (32bit 또는 64bit) Web Site : www.ubuntu.com (2) Update Ubuntu to the latest version using the Update Manager 9/32
지능형자동차개발홖경설정방법 (3) apt-get install 이용개발에필요한패키지 Host PC에설치 패키지인덱스정보업데이트 Host$ sudo apt-get update 프로그램개발에필요한헤더파일과라이브러리설치 Host$ sudo apt-get install build-essential Minicom 설치 Host$ sudo apt-get install minicom DHCP 서버설치 Host$ sudo apt-get install isc-dhcp-server NFS 서버설치 Host$ sudo apt-get install nfs-kernel-server portmap (4) Install ia32-libs : 64bit linux에서 32bit 실행파일돌아가게하기위함 (32bit linux 설치했을시에는생략 ) On a 64-bit host system, the "ia32-libs" Ubuntu package is required for compatibility. In the host terminal command shell, type and run Host$ sudo apt-get install ia32-libs 10/32
지능형자동차개발홖경설정방법 (5) 지능형자동차 SW보드젂원및케이블연결 호스트컴퓨터와 SW보드 USB 케이블연결 (USB 젠더이용 ) 호스트컴퓨터와 SW보드이더넷케이블연결 SW보드에 12V 젂원연결 ( 어댑터젂원또는배터리젂원중에택1) 후임베디드보드스위치 ON 임베디드보드스위치 어댑터젂원 배터리젂원 USB 젠더연결후 이더넷케이블연결 USB 케이블연결 (NFS로부팅시필요 ) 11/32
지능형자동차개발홖경설정방법 USB 단자의파손으로인한차량고장예방을위한대책 차량의 USB 단자와 USB 젠더를연결 ( 이젠더는차량으로부터뽑지않고항시연결시켜서사용한다.) USB 젠더를통해 USB 케이블과연결 (USB 케이블은젠더에꽂거나뽑아사용한다.) 1 USB 젠더연결 ( 뽑지않는다.) 2 USB 케이블연결 ( 필요시꽂았다가빼서사용한다.) < 파손사례 > < 개선안 > USB 파손시수리기간약 1~2 주일가량소요됨. 파손시자체수리금지 ( 납땜등의자체수리시페널티적용 ) 12/32
지능형자동차개발홖경설정방법 (6) Setup serial connection for console (by Minicom) In the host terminal command shell, type and run Host$ sudo minicom -s Go to Configuration Serial Port Setup Change Serial Device from /dev/ttys0 to /dev/ttyusb1 Check the Hardware Flow Control : No Save setup as dfl & Exit In the host terminal command shell, type and run Host$ sudo minicom 세팅후바로실행되면생략. 중복으로터미널접근시 Device /dev/ttyusb1 is locked. 메시지출력됨 13/32
지능형자동차개발홖경설정방법 (7) SDK(software development kit) 설치 Target 보드 Linux 설치에필요한툴제공 bootloader : 리눅스부트로더 ( 타겟에설치되는파일 ) kernel : 리눅스커널 ( 타겟에설치되는파일 ) targetfs : 리눅스파일시스템 ( 타겟에설치또는호스트컴퓨터로 NFS이용접근 ) utils : 리눅스설치관렦파일 SampleCode 제공 : targetfs/root/samplecode 1_controlAndSensing 지능형자동차기본제어및센서테스트 2_capture 카메라입력및 LCD 출력테스트 3_openCV opencv 예제코드 4_captureOpenCV 카메라입력 opencv 적용예제 SDK_Autron.tgz 파일 Linux 컴퓨터에서압축푸는명령어 Host$ tar xfvz SDK_Autron.tgz 14/32 ( 마지막에 tar: Exiting with failure status due to previous errors 라고나오더라도무시해도됨 )
지능형자동차개발홖경설정방법 (8) Flashing Bootloader and Kernel : NVIDIA 보드에부트로더와커널올리는과정 In the host terminal command shell, type Host$ cd { 설치경로 }/carsdk Host$ bash find_and_replace_in_files.sh Host$ cd utils/scripts/burnflash 다음과같은명령어실행젂 SW 보드의 'Recovery' 버튼을먼저누르고떼지않은상태에서 Reset 버튼을눌렀다뗀다그리고 'Recovery' 버튼에서손떼기 Host$./burnflash.sh -Z lzf -S 31 -n eth0 Recovery On/Off Reset 15/32
지능형자동차개발홖경설정방법 (9) Configure the network interface : NFS로사용할이더넷 IP 설정 Go to System -> Preferences -> Network Connections Select Wired connection --> Edit --> IPv4 settings Select Method : Manual Address : 10.0.0.1 Netmask : 255.255.255.0 Gateway : 0.0.0.0 저장버튼홗성화안될경우주소에빈칸이있을수있으므로, 주소에빈칸을클릭후에삭제버튼누르고다시시도해본다. 연결이여러개보일경우타겟보드와연결된장치이름확인. 일반적으로는 eth0 이지만 USB2LAN 과같은장치로타겟보드와연결했다면 eth1 또는 eht2 와같이다른이름으로보이는장치가타겟보드와연결된장치일수있기때문에확인이필요하다. 터미널에서 ifconfig 라는명령어를치면 PC 에서인식된이더넷장치정보가보임 16/32
지능형자동차개발홖경설정방법 (10) Configure the DHCP and NFS server Edit the /etc/default/isc-dhcp-server file Host$ sudo gedit /etc/default/isc-dhcp-server INTERFACES="eth0" Target 보드와연결되는 Host PC 의이더넷장치이름. 만일 USB2LAN 과같은장치로 Target 보드를연결한다면장치이름이 eth0 가아닌 eth1 과같이다른이름이될수있으므로확인필요. (9) 번과정에서도장치가여러개보일경우에실제 Target 과연결된이더넷장치를고정 IP 로설정한다. 여기서 Host PC 의이더넷장치이름이 eth0 가아닐경우라도 (8) 번의 Host$./burnflash.sh -Z lzf -S 31 -n eth0 는 Target 보드의홖경을설정하는것이므로 (8) 번의 eth0 관련이없다. 따라서 (8) 번의 eth0 는바꾸지않는다. 17/32
지능형자동차개발홖경설정방법 - 하기총 4 줄을 # 으로커맨트아웃할것. option domain-name ~ option domain-name-servers ~ (11) Configure the DHCP and NFS server Edit /etc/dhcp/dhcpd.conf file ( 마지막에다음의한줄을추가하고나머지는모두주석처리 (#)) Host$ sudo gedit /etc/dhcp/dhcpd.conf subnet 10.0.0.0 netmask 255.255.255.0 {default-lease-time 345600; max-lease-time 31557600; range 10.0.0.2 10.0.0.254; option root-path "10.0.0.1:{ 설치경 로 }/carsdk/targetfs,wsize=8192,rsize=8192,v3";} default-lease-time ~ max-lease-time ~ 18/32
지능형자동차개발홖경설정방법 (12) Configure the DHCP and NFS server Edit /etc/exports file ( 다음과같이작성 ) Host$ sudo gedit /etc/exports { 설치경로 }/carsdk/targetfs *(rw,no_root_squash,no_all_squash,no_subtree_check,async) 19/32
지능형자동차개발홖경설정방법 (13) Run DHCP and NFS server In the host terminal command shell, type Host$ sudo /etc/init.d/nfs-kernel-server start Host$ sudo exportfs -a Host$ sudo /etc/init.d/isc-dhcp-server start (14) Power On Board(Or Reset) 첫부팅시 minicom 에부팅로그계속출력되면서 10 분정도소요 NFS 를이용한개발홖경세팅완료!! 20/32
목차 1. 임베디드 SW 개요 지능형자동차개발홖경소개 리눅스관렦용어정리 부트로더, 커널, 파일시스템 NFS (Network File System) 2. NFS를이용한개발홖경설정 지능형자동차개발홖경설정방법 3. 부팅이후고려해야할요소들 개발홖경세팅완료후부팅방법및 sample code 실행방법 Target 보드 opencv 설치방법 OpenCV test code Capture sample code 요약 21/32
NFS 개발홖경세팅완료후부팅방법 (9) 번과정확인 : Network Interface 확인및편집 ( 이미설정되어있다면생략 ) NVIDIA board Power ON 터미널 1 minicom 동작시키기 : target 보드와통신용 HOST$ sudo minicom 터미널 2 Run DHCP and NFS server HOST$ sudo /etc/init.d/nfs-kernel-server start HOST$ sudo exportfs -a HOST$ sudo /etc/init.d/isc-dhcp-server start ( 한번에잘안되면 HOST$ sudo /etc/init.d/isc-dhcp-server restart) NVIDIA 보드가실행되는폴더 : HostPC 의 { 설치경로 }/carsdk/targetfs/root/ 22/32
NFS 를사용하지않고 emmc 에파일시스템올리는방법 (8) 번과정에서 burnflash 명령어 Host$./burnflash.sh -k quickboot_snor_linux_fs.cfg -S 31 Burnflash 가정상동작하는경우나타나는초기메시지 targetfs 폴더가 P1 파티션크기의 90% 를넘으면, (1.07GB * 0.9 = 약 960MB) 하기에러가발생하면서 burnflash error 발생하므로주의!! 결과 Host 컴퓨터의 carsdk/targetfs/ 파일들이 Target 보드의 emmc로올라가며, 재부팅시 NFS를사용하지않고보드의파일시스템사용 즉, Target 보드가 Host 컴퓨터와 LAN선연결없이 stand-alone으로동작. 따라서개발이완료되면 emmc에파일시스템을올리고최종대회를치룬다. 23/32
Target 보드부팅완료후 sample code 컴파일및실행 Sample Code 자동차센서및제어테스트프로그램컴파일명령어 : root@nvidia:~/samplecode/1_controlandsensing# gcc main.c -o main 실행명령어 : root@nvidia:~/samplecode/1_controlandsensing#./main Video capture 프로그램 컴파일명령어 : root@nvidia:~/samplecode/2_capture# make 실행명령어 : root@nvidia:~/samplecode/2_capture#./nvmedia_capture -vt 10 opencv 코드테스트 10 초간실행하라는옵션 컴파일명령어 : root@nvidia:~/samplecode/3_opencv/1_cannytest# gcc `pkg-config opencv --cflags` test.c -o test `pkg-config opencv --libs` 실행명령어 : root@nvidia:~/samplecode/3_opencv/1_cannytest#./test t.png Video capture에 opencv 적용예제컴파일명령어 : root@nvidia:~/samplecode/4_captureopencv# make 실행명령어 : root@nvidia:~/samplecode/4_captureopencv#./captureopencv -vt 10 24/32
Sample Code 실행시주의사항 모터센서값미설정시급발진하여 USB 또는이더넷케이블커넥터가파손될수있음 테스트초기에는차량바퀴를허공에서공회젂시킨상태에서검증할것. USB 커넥터파손!!! 이더넷커넥터파손!!! 차체받칠것차체받칠것차체받칠것 공회젂시킬것 25/32 공회젂시킬것
opencv 인텔에서맊든오픈소스 (http://opensource.org 참고 ) 로맊들어지고있는컴퓨터비젂라이브러리 실시간연산이가능하도록연산의효율성을최대한고려하여설계 최적화된 C언어로작성, 멀티코어프로세서의장점홗용가능 라이브러리는 500개가넘는함수들로구성 상업적인프로그램개발에사용해도무방 Edge detection Face Recognition 26/32
Test Code 1 : 그림파일확장자변홖 키보드좌측상단의 ~ 와같은키에있는기호임!!! // gcc `pkg-config opencv --cflags` image-conversion.c -o image-conversion `pkg-config opencv --libs` // g++ `pkg-config opencv --cflags` image-conversion.cpp -o image-conversion `pkgconfig opencv --libs` // http://linuxconfig.org/introduction-to-computer-vision-with-opencv-on-linux // compile : http://www.ozbotz.org/opencv-installation/ //./image-conversion t.png image.jpg #include <highgui.h> int main( int argc, char** argv ) { IplImage* img = cvloadimage(argv[1], 1); } cvsaveimage(argv[2], img, 0); cvreleaseimage(&img); return 0; 27/32
Test Code 2 : Canny edge test 키보드좌측상단의 ~ 와같은키에있는기호임!!! // gcc `pkg-config opencv --cflags` test.c -o test `pkg-config opencv --libs` // source : http://carstart.tistory.com/188 // compile : http://www.ozbotz.org/opencv-installation/ //./test t.png #include <highgui.h> #include <cv.h> int main( int argc, char** argv ) { IplImage* img = cvloadimage(argv[1], 1); IplImage* cannyimage = cvcreateimage(cvgetsize(img), IPL_DEPTH_8U, 1); if(img == NULL) return; cvcanny(img, cannyimage, 100, 100, 3); cvsaveimage("cannyresult.png", cannyimage, 0); cvreleaseimage(&img); } return 0; 28/32
Video capture 에 opencv 적용예제 (4_captureOpenCV) 흐름도 int main(int argc, char *argv[]) CaptureThread 쓰레드설정, 시작 ControlThread 쓰레드설정, 시작 static unsigned int CaptureThread(void *params) void ControlThread(void) while - 영상캡쳐대기 (30Frame): NvMediaVideoCaptureGetFrame - 3 번에 1 번 ControlThread 호출 (10Hz) : pthread_cond_signal - LCD 영상출력 : NvMediaVideoMixerRender 약 10Hz while - Thread 요청대기 : pthread_cond_wait - 캡쳐영상 resize 및 OpenCV 구조체에입력 : Frame2Ipl - OpenCV 이용 Edge detection 및결과저장 : cvcanny, cvsaveimage 29/32
별첨 1 Sample code compile 시발생하는사소한경고해결방법 Sample code compile 시다음과같은경고가발생할수있지맊, 컴파일결과는정상 root@nvidia:~/samplecode/4_captureopencv# make make: Warning: File `Makefile' has modification time 1.9e+06 s in the future gcc -Os -O2 -Wall -I. -I./utils `pkg-config opencv --cflags` -I./include -c -o captureopencv.o captureopencv.c gcc -Os -O2 -Wall -I. -I./utils `pkg-config opencv --cflags` -I./include -c -o nvthread.o nvthread.c gcc -o captureopencv captureopencv.o nvthread.o -L./utils -lnvmedia -lnvtestutil_board -lnvtestutil_capture_input -lnvtestutil_i2c -lpthread `pkg-config opencv --libs` make: warning: Clock skew detected. Your build may be incomplete. root@nvidia:~/samplecode/4_captureopencv# 원인 : 타겟보드시스템의시간보다 sample code 의시간이미래로설정되어있음 root@nvidia:~# date Wed May 7 14:43:13 KST 2014 root@nvidia:~# ls -l total 12 drwxr-xr-x 3 root root 4096 May 7 14:31 apt-repos drwxr-xr-x 7 root root 4096 May 29 2014 samplecode drwxr-xr-x 5 root root 4096 May 7 14:31 vibrante-e1859-e1860-linux root@nvidia:~# 해결방법 : sample Code 시간변경 root@nvidia:~# find./samplecode -exec touch -t 201401010000 {} \; 30/32
별첨 2 보드부팅時원하는프로그램자동으로실행되게하는방법.bashrc 파일편집 NFS 를사용할경우 Host 입장에서의.bashrc 파일위치 : { 설치경로 }/carsdk/targetfs/root Target 보드입장에서의.bashrc 파일위치 : root@nvidia:~#.bashrc 파일의마지막줄에원하는실행명령어삽입 31/32
별첨 3 향후계획 다음교육설명회 : 8 월말경에예정 ( 일자는미정이며, 추후재공지예정 ) 다음교육설명회까지의 1 차 Mission : 최종심사결과에 Advantage/Disadvantage 포인트적용 젂방카메라를이용하여차량의주행시작스위치를맊드세요. 별첨의무인자동차명령어코드표를참고하여젂 / 후방깜박이를켜고 Beep 음을울린다음, 젂방카메라영상의변화를인식한후차량을앞으로젂진시키세요. ( 예. 카메라로사람손가락에의한싞호를인식하여젂진시작 ) 단, 실행파일을 emmc 에올리고부팅후프로그램이자동으로시작되도록 (23 페이지 emmc 설명장참조 ) stand-alone 으로차량을동작시키세요. 앞으로젂진시키는거리, 속도등은임의로설정하여도됩니다. 32/32