2017년 1월 17일 화요일

#RobotOperatingSystem_00



ROS is a framework for writing robot software.
ROS는 로봇 소프트웨어를 작성하기 위한 프레임워크입니다.


ROS는 독립된 많은 수의 프로그램이 지속적으로 소통함으로써 이루어진다.

"Fetch An Item", 문제로 ROS를 구상해내었다.

<an office-assistant robot is instructed to retrieve a stapler.>

(1) the robot must understand the request
로봇이 문제를 이해한다.

(2)the robot must start some sort of planner
to coordinate the search for the item,    which    will    likely    require
navigating    through    various    rooms    in    a    building,    perhaps    including    elevators    and    doors.
물건을 찾기위해 계획같은 걸 짜기 시작하는데, 예를 들면 빌딩안의 다양한 방들을 navigating하는 것

(3)Once arriving in a room, the robot must    search desks cluttered    with similarly sized    objects (since all handheld objects are roughly the same size) and find a stapler.
방에 도착하면, 로봇은 비슷한 크기의 물체를 두고있는 책상을 찾는다.그리고 stapler를 찾는다.

(4)The robot must then retrace its steps and deliver the stapler to the desired    location.
로봇은 다시 왔던길을 되돌아가고 stapler를 원하는 장소에 배달한다.

->
- one group : producing indoor maps.

- another group : have expertise in using maps to robustly navigate indoor environments.

- other group : have discovered a particular computer vision approach that works well for recognizing small objects in clutter.

"--------------------------------------------------------------------------------------------------------------------------------"

ROS는 다양한 환경을 위해서 제작되었지만, 앞으로 진행되는 실습의 환경은

OS : Ubuntu 14.04 LTS(Ubuntu trusty)
ROS : Indigo
Python : python 2.7.6

인터넷을 찾아보면 이런저런 ROS를 설치하는 방법이 존재한다.
하지만, 간단한 방법인 Two line Install로 설치를 해보자.
 (workspace까지 설정된다. 단, 이렇게 설치하게 되면 catkin_ws_oroca에서 작업을 진행해야 합니다.)

http://wiki.ros.org/ROS/Installation/TwoLineInstall

$ sudo wget https://raw.githubusercontent.com/oroca/oroca-ros-pkg/master/ros_install.sh && chmod 755 ./ros_install.sh && ./ros_install.sh catkin_ws_oroca indigo

중간에 설치하다가
$ changing permission of './ros_install.sh': 과 같은 오류가 뜬다면,

$chmod 755 ros_install.sh
$./ros_install.sh cakin_ws_oroca indigo

하고 다시 입력해주면 정상적으로 설치가 시작된다.

"--------------------------------------------------------------------------------------------------------------------------------"

ROS 패키지를 찾거나 사용하는데 문제가 발생한다? 환경변수의 설정이 제대로 되어있는가 확인해보자.
ROS_ROOT, ROS_PACKAGE_PATH가 제대로 설정되어 있는가 확인?
$ export | grep ROS


01 파일시스템 도구
ROS에서 코드는 여러 패키지에 산재되어 있어 ls 나 cd 같은 명령어 만으로 찾아다니는 일은 번거로워서 ROS에서 몇 가지 도구를 제공합니다.

1. rospack 사용하기
: 패키지의 정보를 제공하는 도구, 더 많은 정보를 원한다면, (http://docs.ros.org/independent/api/rospkg/html/rospack.html)

$ rospack find roscpp

2. roscd 사용하기
:  패키지의 이름만으로 cd 처럼 폴더를 이동효과.

$ roscd roscpp
(=$rospack find roscpp)

3.roscd log
: ROS의 로그파일이 저장되는 폴더로 이동효과.
 만약 한번도 ROS프로그램을 실행해 본 적이 없다면 폴더를 찾을 수 없다는 경고가 발생합니다.

$ roscd log

4.rosls
: rosbash 도구모음의 일부.  사용자가 지정한 패키지나 스택, 또는 일반적인 경로에 대해 바로 ls를 실행하는 효과.

$ rosls roscpp_tutorials

"--------------------------------------------------------------------------------------------------------------------------------"

ROS는 독립된 수많은 수의 프로그램이 지속적으로 소통함으로써 이루어진다.
그리고 그 독립된 수많은 수의 프로그램이 동시에 움직이는 것과 다른 것 사이에 메세지를 보냄으로써 소통하는 것으로 이루어져있다.

프로그램 자체는 node graph로 표현되고 프로그램 사이의 소통은 edges로 표현된다.

o (node) : module, sending/receiving messages.
- (edge) : a stream of messages between two nodes.

o (node) : typically POSIX Processes
- (edge) : typically TCP connections

따라서 일부가 손상되어도 그 프로세스를 제외하곤 평소처럼 돌아갈 수 있다. 그 부분과의 연결을 끊으면 차단되고 그 프로세스에만 이상이 생기니까.


2017년 1월 16일 월요일

#RobotOperatingSystem_01



catkin?
ROS 빌드 시스템
실행 가능한 프로그램, 라이브러리, 스크립트, 인터페이스를 생성한다.











화면에 catkin_ws_oroca가 생성된 것을 볼 수 있다.
catkin_ws_oroca안에 들어가면 build  devel  src가 기본으로 생성되어 있는 것을 볼 수 있다.

build : 라이브러리 및 작업결과 저장
devel :설치파일들 저장
src : 작업공간_package 생성 및 사용


[ROS Package]

$ cd ~catkin_ws_oroca/src
# catkin_create_pkg [패키지이름][의존성-의존할 요소]
$ catkin_create_pkg basics std_msgs rospy
: basics라는 package를 만드는데 내부 구성은 rospy, roscpp를 사용할거다.
$ cd ~catkin_ws_oroca/
$ catkin_make 
CMakeLists.txt, package.xml 파일을 자동생성

여기서 잠깐! catkin_make는  catkin을 이용한 일련의 작업 과정에서 쓰이는 편리한 도구로 이는 일반적으로 CMake 작업환경에서의 cmakemake가 합쳐져 있는 도구라 생각하면됨.





































앞서 배운것처럼 rospack을 이용해서 package정보를 알 수 있는데 rospack 요소 중에 depends1은 직접 의존(dependencies),
depends는 간접 의존(indirect dependencies)까지 포함.






$rospack depends1을 이용해서 package인 basics의 의존 정보를 알 수 있다.



$rospack depends는 package인 basics의 간접의존까지 모두 검색







$roscd basics를 이용해서
$cd cd catkin_ws_oroca/src/basics/
라는 명령어를 치지 않고 바로 basics package로 이동가능.
단, package인 경우만 이동가능 한 것을 볼 수 있음. 단순 ros의 ws(WorkSpace)도 이동x


자, 이제 그럼 package.xml을 살펴보자.
 
 (1) description tag








<description>The basics package</description>
 
<description>은 package에 대한 설명을 하는 부분으로써 가능한 한 줄로 요약한다는 전제를 가지고, 
패키지에 대한 설명을 적는다. 하지만 한 줄로는 설명이 어려운 경우 여러 줄이라도 가능하다.

(2) maintainer tags


 
 
package.xml에서 가장 중요한 부분 중 하나.
패키지의 관리자에 대한 정보가 기록되는 부분이며 최소 한 명 이상의 정보가 입력되어야.
관리자의 이름은 태그의 몸체가 되고, 반드시 입력되어야 하는 웹메일 주소를 속성으로 가지고 있음.

(3) license tags 
 
 
 
 
라이센스에 대한 정보를 반드시 입력해야 한다.
라이센스에 대한 정보는  (https://opensource.org/licenses/alphabetical)에서 찾아 볼 수 있다.
현재 사용자는 명시하지 않았지만, 
ROS tutorial(http://wiki.ros.org/ko/ROS/Tutorials/CreatingPackage)에서는 
ROS의 핵심부분에서 이미 사용되고 있는 BSD라이센스를 사용하겠다고 명시해놓고 있다.
 
(4)dependencies tags
 
 
 
 
 
 
 
 
 
package의 의존성을 알려주는 태그의 모음들을 볼 수 있다.
모든 package는 적어도 하나 이상의 의존성을 가진다. 
 
  • <buildtool_depend> 
    : 이 패키지가 스스로 빌드하기 위해서 필요한 빌드 시스템에 대해 명시한다.
     
  • <build_depend> 
    : 이 패키지를 빌드할 때 어떤 패키지들이 필요한지 명시한다.
  • <run_depend>
    : 이 패키지를 실행시킬 때 팔요해지는 패키지들에 대해 명시한다.

    (specify which packages are needed to run code in this package, or build libraries against this package.)

  • <test_depend>
    : unit tests를 위한 추가적인 의존성만을 명시한다. build_depend나 run_depend에 명시한 의존성을 명시하면 안된다.
위 네가지의 태그를 사용할 수 있다.  
 
package.xml에 쓰이는 자세한 설명을 알고 싶다?
: http://wiki.ros.org/catkin/package.xml#Build.2C_Run.2C_and_Test_Dependencies 

참고로 위에서 언급한 바와 같이 package.xml은 package를 생성하면 자동으로 만들어진다. 
하지만 이 파일을 사용자가 다시 한 번 어떤 내용인지 인지하고 재작성을 실시한다면 
보다 견고하고 간결해진 package를 구성가능해진다.

2017년 1월 12일 목요일

#Python State Pattern(파이썬 스테이트 패턴)


Java로 작성한 패턴 코드를 Python으로 짜보자!

그 전에 오늘 알게 된 정보 정리

(1) python에서 함수 이름을 만들 때에는 대문자를 넣지 않는다.
(2) string 표현을 무조건 ""으로 하지 않는다 ''으로 하는 경우와 ""으로 하는 경우 둘 다 string으로 취급을 받을 수 있다. 이것에 대한 정보는 좀 더 조사해서 정리하는 것으로 한다.
(3) import A와 from test import A는 다르다.
예를 들면 import A를 쓴 경우에는 A를 쓰려고 한다-하면 test.A()이라고 명시를 해줘야 하는 반면에
from test import A라고 쓴 경우에는 같은 파일안에서 쓰듯이 바로 A()로 쓸 수 있다.


전체적 구성은 다음과 같이 UML을 그려볼 수 있다.


자, 이제부터 java와  python의 소스를 같이 보자.

먼저, 파일의 구조는 다음과 같이 구성된다. 물론 python도 여러 파일로 나눠서 하는 것이 좀 더 좋을 수 있지만,
일단 한 파일안에서 모든 클래스를 구현해서 진행시켰다.



java
















python

 








State.java

 














Gumball.py

















python에서 interface클래스는 어떻게 구현하는걸까?
일단, 현재 찾아본 바로는 2가지 방법이 있는 것 같다.

(1) 위와 같이 class를 만들고 함수내부를 pass로 채워서 직접적인 구현은 구현 클래스에서 진행 시키는 방법

(2) ABCMeta를 이용하는 방법, (참조 : https://docs.python.org/2/library/abc.html)






여기서 register를 이용해서 관계를 등록하고 Foo() class를 MyIterable에서 구현하고 있다.
Foo() interface를 MyIterable에서 구현하고 있는 것이다.





SoldState.java

Gumball.py


가장 오랫동안 고민했던 부분은 GumballMachine gm;을 생성하지 않고 부르는 것.
그러니까 gm의 생성자를 부르지 않고 위 처럼 어떻게 python에서 참조를 할까?를 고민했었다.
이는 init을 보면 알 수 있듯 단순히 gm하고만 명명하고 있다. gm이 어떤 타입인지 모르는 상태에서 참조가 가능하다는 것을 알 수 있다. 처음에는 상당히 혼란스러울 수 있다.






SoldOutState.java

Gumball.py
 

























NoQuarterState.java


Gumball.py






HasQuarterState.java



Gumball.py




GumballMachine.java
Gumball.py































java에 toString()이 있다면 python에서는 __str__을 이용할 수 있다.

두 함수의 중요한 점은 gm.toString(), gm.__str__()이런 식으로 부르는 것이 아니라

그냥 객체 자체를 print하면 toString()의 문장을 출력해준다.

따라서 print gm, System.out.println(gm)으로 객체 자체를 출력해주면 된다.








GumballMachineTestDrive.java




Gumball.py




<결과>





(이상한 부분을 지적해주시면 좀 더 좋은 글로 보답하겠습니다.)
소스가 필요하신 분이 있을까봐 소스도 첨부합니다.
python java


2017년 1월 9일 월요일

#Head_First_C_00


기본적인 프로그래밍은

1. sequence 순차
2. condition 조건
3. reputation 반복

으로 이루어진다.












실행파일이 만들어지고 메모리 상에 적재가 되면서

stack 부분에서는 함수- 그에 따른 파라미터 값들이 들어가게되고
heap 부분에서는 동적으로 할당되는 값들이
global 부분에서는 전역변수가
constraints 부분에서는 상수가
code 부분에서는 전체 코드가 적재

예를 들어 살펴보자면 다음과 같다.


<stack>
int *b;
b = (int *)malloc(sizeof(int));
*b=3;
printing(int x = *b)
printf("x is %d\n", x=*b);
free(b);

a= 10;
printing(int x = a)
printf("x is %d\n", x=a);
 
<heap> 
b = (int *)malloc(sizeof(int));
free(b);
 
<global> 
int a;
a= 10;
char msg[] = “test”;
 
<constraints> 
char msg[] = “test”;
 
<code> 
#include <stdio.h>
#include <stdlib.h>

int a;

void printing(int x);

char msg[] = “test”;

int main(){

int *b;
b = (int *)malloc(sizeof(int));
*b=3;
printing(*b);
free(b);

a= 10;
printing(a);

return 0;
}
 
void printing(int x){

printf("x is %d\n", x);

}
 

Q. Constraints 안에선 어떻게 지역/전역 변수를 구분하는걸까?
A. 만약 그 변수가 지역이면 Constraints안에서 한 번 선언하고 그 변수를 복사해서 지역 혹은 전역 변수 공간에도 선언해준다.


#개발환경



개발 환경이란?

OS : windows, unix(ubuntu, mint ..), mac 등의 운영체제

Compiler : gcc, visual c++, dev-c++ etc..

Build environment : make, nmake, ant(java) etc..









(출처 : http://gayris.tistory.com/entry/컴파일러의-종류와-역활)

"컴파일러가 하는일은 고급언어를 기계어로 바꾸어주는 일"

(1)컴파일러가 소스를 목적파일로 컴파일하여 목적파일을 만듦
   목적파일만으로는 프로그램을 실행할 수 없음
(2) 따라서 목적파일을 운영체제의 요건에 맞도록 형태를 바꾸고 스타트업이라는 추가코드가 필요함. 이런 처리를 하여 실행파일로 만드는 동작을 링크(link)라고 함.
링크를 하는 프로그램을 링커라고 함

(1) 컴파일러에 의해 컴파일되어 목적파일 생성
(2) 링커에 의해 목적파일이 최종적으로 실행 파일을 만드는
이 과정을 빌드(Build)라고 함

IDE(Integrated Development Environment)?
디버거, 프로파일러, 리소스 편집기 등 개발에 필요한 편의 기능까지 제공하는 환경