본문 바로가기
Programming/Sensors

LINUX ROS

by OKOK 2017. 10. 24.

정규화

수식: (요소값 - 최소값)/(최대값 - 최소값)

정규화는 전체 구간을 0~100으로 설정하여 데이터를 관찰하는 방법입니다.

이 바벙법은 데이터 군 내에서 특정 데이터가 가지는 위치를 볼 때 사용합니다.

시세와 같이 주기를 띄는 데이터의 경우 과거 대비 현재 데이터의 위치를 파악하기에 용이합니다.


표준화

수식 : (요소값 - 평균)/표준편차

평균을 기준으로 얼마나 떨어져 있는지 나타내는 값으로, 이 방법을 적용하려는 때는 2개 이상의 대상이 단위가 다를 때 대상 데이터를 같은 기준으로 볼 수 있게 합니다. 삼성전자와 현대차의 주식시세에 대해 동일 기간에 대해 표준화를 수행하면 두 종목이 어떤 특징을 가지고 움직이는 지 관찰하는데 도움이 됩니다. 또 다른 예시로 몸무게와 키에 대해 표준화를 수행한 후 데이터를 보았을 때 몸무게는 음수, 키는 양수 값이 나온다면 그 사람은 평균보다 키가 크고 몸이 마른 편이라 볼 수 있습니다.  


요 피치 롤

롤은 세로축 

요는 수직축

피칭은 가로축 


비행기를 생각하면 됩니다. 떠가는 방향에서 좌우로 둥실둥실은 롤이고,

말도 안되고 꼬리와 머리 방향으로 돌아가는 것은 피치라고 합니다.

다음으로 좌회전 우회전할 때는 요라고 합니다.


이제 여기서 .so 파일 하나 있고, Makefile 하나 있으므로, 이제 여기서 so 파일을 불러서 사용하는 방법에 대해서 실험을 해본다음에,


ros 헤더로 가져오는 것을 한 번 해보도록 합니다. 그동안 ros에 대해 잊고 있었으므로, 오케이 위에 것 하면 so 파일을 사용하는 방법에 대해서 익힐 수 있는 것입니다.  


make 파일에서 CAM_IN_OBJ 만 변경하도록 합니다.

그리고 clean 에서도 하나 변경하도록 해봅니다. 오케이;



그럼 사진 한장을 가지고 일단 opencv 부터 사용해보도록 합니다. 되나 안되나 확인차원에서. 라즈베리파이에서 opencv 를 설치한 기억이 없는데 어떻게 오픈cv 것을 불러서 사용하고 있는 것이지?



 cflags 와 cxxflags 는 무엇인가

cflags 와 cxxflags 는 c/C++ 코드를 컴파일할 때 빌드 시스템에 컴파일러 옵션을 늘상 전달할 때 활용하는 환경 변수 중 하나입니다. 이 변수를 표준화한 것은 아니지만, 언제 어디서든 활용하며 컴파일러를 실행할 때 추가, 제대로 작성한 빌드에 개별 옵션을 전달할 때 제대로 이해해야 합니다. 이 분야에서 일반적으로 활용하는 변수 일부 목록을 보려면 정보 페이지를 확인합니다.


젠투 시스템에서는 cflags 변수와 xxflags 변수를 /etc/portage/make.conf 에 설정합니다. 이 파일에 설정한 변수는 이 옵션을 기반으로 모든 꾸러미를 컴파일하는 포티지에서 실행할 프로그램의 환경으로 내보냅니다. 


CC = g++
CFLAGS = -g -Wall
SRCS = HelloWorld.cpp
PROG = HelloWorld
OPENCV = `pkg-config opencv --cflags --libs`
LIBS = $(OPENCV)
$(PROG):$(SRCS)
$(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)




https://gist.github.com/kevinhughes27/5311609 


다른 옵션들이 많아서 헷갈리므로, 일단 가장 간단한 opencv 만 참고하는 것을 하였습니다. 여기서 내용을 정리하고, 다음으로 svnet .so 파일만 불러와서 사용하는 방법을 익혀보도록 하겠습니다. 바로 되나 안되나 확인 해보도록 하겠습니다. 그냥 .so 파일이 같은 폴더 내에만 있으면 되는 것인가? 


하나씩 해보면서 없애나가기.

현재 bin 폴더에 데이터만, 그리고 include 폴더에는 헤더파일 하나만 그리고 lib 폴더에는 cpu용 lib 파일하하나만 있습니다. 그리고 makefile 에서 GPU 버전은 1로 해보고 돌려볼까요. 그럼 안돌아가는 것을 확인해봅니다. 오케이 대강은 읽어내려갈 수 있으므로, 이것을 계속해서 활용할 수 있도록 합니다.  


자 그럼 여기서 다른 것은 건들이지 않고 그냥 제가 사용하는 방법으로 사용해보도록 하겠습니다. 이 makefile 을 옮겨와서 단순하게 페이스를 디덱트 하는 것을 찾아보도록 하곘습니다. 


그럼 여기서 case 1 과 case 2 에대해서 모두 지워보고 사용해보도록 하겠습니다. 


stdio.h

size_t

file

fops_t

NULL

BUFSIZ

EOF

stderrm stdin and stdout

file *fopen(const char *filename, const char *mode)


stdlib.h

null

exit_failrue

exit_success

int atoi

long int atol

double strtod

long int strtol

unsigned long int strtoul


string.h

void *memchr(const void *str, int c, size_t n)

int memcmp(const void *str1, const void *str2, size_t n)

void *memset(void *str, int c, size_t n)

int strcmp(const char *str1, const char *str2)

char *strcpy(char *dest, const char *str2);


환경 변수는 크게 사용자 변수와 시스템 변수로 나뉩니다.

사용자 변수는 다수의 사용자계정에 대해서. 그 사용자의 계정내에서만 적용되는 변수입니다. 해당 사용자 계정으로 컴퓨터 로그온시에만 적용되는 변수입니다. 함수로 여기면 일종의 지역 변수 입니다.


시스템 변수는 시스템 전반에 걸쳐 적용되는 변수입니다. 다른 계정으로도 해당 변수를 사용 할 수 있습니다.  


paht 시스템 변수를 설정하거나 변경하려면 어떻게 해야 하나요.

일반정보 path는 운영체제가 명령행 또는 터미널 창에서 필요한 실행 파일을 찾는 데 사용하는 시스템 변수입니다. path 시스템 변수는 windows의 제어판이나 linux 및 solaris 사용자 셀의 시작 파일에 있는 시스템 유틸리티를 사용하여 설치할 수 있습니다. windows 또는 Mac OS X 를 실행하는 컴퓨터의 경우 일반적으로 시스템 PATH 변수를 변경할 필요가 없습니다. 


Bash 셀

시작 파일 (~/.bashr)를 편집합니다.

path = /usr/local/jdk1.8.0/bin:$PATH

export PATH

파일을 저장하고 닫습니다.

시작 파일을 로드합니다.

% . /.profile

java 명령을 반복하여 경로가 설정되었는지 확인합니다. 


 API_EXPORTED int libusb_init(libsusb_context ((context) {}

ctag 로 API_EXPORTED로 들어가보니, #define API_EXPORTED __atttriute__(visibility("default"))) 선언.

함수 정의를 위해 맨 앞에 쓰여져야 할 것은 데이터 타입. 데이터 타입이 API_EXPORTED 인데, 그 자료형이 두 개의 언더바로 시작하는 함수는 시스템과 관련되어 있는 경우가 많습니다.


이 경우 C 컴파일러 내부에서 선언한 함수 입니다.

시스템과 밀접한 프로그램을 접하게 될 떄에는 컴파일러에서 지정한 함수나 시스템 내부 함수를 알아두는 것이 도움이 됩니다. 왜 컴파일러는 소스를 바이너리로 변경해 주는데, printf나 scanf 같은 함수를 정의할 수 있을까. 시스템 API와 커널에 내용.


이제 메인 함수만 작성하고 수정해서 돌려보면 됩니다. 그리고 ROS에는 어떻게 쓰이고 있는지 알아보도록 합니다. 


makefile 로 한번 해보기, 그리고 cmake 로 해보기, 둘 다 빌드가 될 것 같은데, 그리고 catkin 에 대해서도 알아야 합니다. 어? 그런데 ros 랑 opencv 는 makefile 로 안되어 있잖아???? 이런 그럼 먼저 이것 부터 해보고, 돌아와서 다시 해보도록 합니다. 연동을 어떻게 해야 하는지 독립적으로 만드시 알아보도록 합니다. ros 를 가져다 쓰기 위한 방법은 무엇이 될지!! 


wow 생각이 안나니, 다시 천천히 하나씩 꺼내서 시작해보도록 합니다. ros 에서 opencv 사진 같이 포함해서 돌려보았던것을 해봅니다. 그 전에 순서가 먼저 가장 정상적인 캐니엣지 했던 것을 해보도록 합니다. 거기서 파일을 수정할 수도 있다고 생각합니다. 


무슨 개똥같으 소리이지. 

그럼 이미지를 먼저 퍼블리시 한다. 한번 더 켜야된다는 소리인가.

이게 어떤 것인지 분명하게 알아야지. 어디서 알 수 있을까. 일단 이미지를 읽어오도록 해보자.

 


catkin_make 사용하는 방법 알았습니다.

다른 path 에서 해도 되는지 궁금하네.  

저기에 뭐가 설정되어 있다는 것 같은데, 잘 모르겠습니다. 


현재의 결론은 catkin_make 로 해도 빌드가 된다는 사실입니다. 이제 지금 현재 여기에서 opencv를 사용하고 있습니다. 아, 그럼 라즈베리파이에서 호환하듯이 로스에서 받은 것을 호환하면 되는 것 같은데??헐... 단순하게 생각합니다. 호환한다는 개념을 받아서 처리한다는 개념으로 생각합니다. 


오 그럼 왜 imshow를 했을때 안나왔을까, 다시 한번 해봅니다. 

제발 waitkey(0)을 작성하지 않아서 나왔으면 좋겠네..


.so 파일에 대해서 정리해보고, 내일 질문 할 수 있을 것 같다. 먼저 .so 파일에 대한 정리, 그리고 catkin_make 에 대한 정리를해보고, 할 수 있는데 까지 해보고, 질문할 것.