2017년 6월 30일 금요일

play2! + scala 개발환경 구축하기


1. database
이 부분은 헷갈릴 것 같아서 정리를 해두자.

먼저 개발환경은 Linux 16.04 , Xenial + Play!(2.2.6) + scala(version 2.11.6 )

+ mysql(ver 5.7.17-0ubuntu0.16.04.2 (Ubuntu))
+ mysql_connector(/usr/lib/jvm/java-8-oracle/lib) --> 나같은 경우는 이곳에 있지만, 각자 jvm아래의 java가 설치된 곳의 lib으로 들어가서 거기에 connector를 넣어주면 인식한다.

참고로 jdk도 설치해야 되는데 버전을 확인하는 특별한 방법은 없고 본인이 적용한 곳으로 가면되는데 일반적으로 jdk이므로 jvm 아래 어딘가에 있을 것이다.(ex . /usr/lib/jvm/)

mysql download :
$ sudo apt-get update
$ sudo apt-get install mysql
#root 비밀번호 설정하라는 창이 뜨면 설정해주고 "ok"

$ sudo mysql_secure_installation
설치후 이것을 통해 보안 정도를 결정할 수 있습니다. 각자 영어 설명을 보고 잘 선택해주세요. 참고로 비밀번호 설정보안을 너무 높여놓으면 사용자를 만들 때 괴롭습니다.

$ mysql -u root -p
$ CREATE USER 'haei'@'localhost' IDENTIFIED BY 'haei';
이런식으로 사용자를 만들어줍니다.
$ GRANT ALL PRIVILEGES ON * . * TO 'haei'@'localhost';


#참고로 위의 비밀번호 설정보안을 나중에하겠다고 본인은 중간에 강제종료 시켰는데 기본 설정으로 인해서 보안정도가 'MEDIUM'으로 설정되어 비밀번호 설정에 애를 먹었다.
만약 "ERROR 1819 (HY000): Your password does not satisfy the current policy requirements" 가 뜬다면, 다음의 명령어를 실행시킨다음, 다시 사용자를 만들어보자.

$ mysql -h localhost -u root -p
$ uninstall plugin validate_password;

이 사진과 같이 play new 로 생성한 프로젝트로 가면, build.sbt가 존재한다. 이를 다음과 같이 수정한다.


그리고 conf/application.conf 내용을 다음과 같이 수정해준다.참고로username과 password는본인의 정보로 바꾸도록한다.

만약 이렇게 하고 play run 에 문제가 없으면 db적용에는 문제가 없다는 의미이다.

#Ros_launch_file_작성하기!


먼저, 앞에 world파일을 먼저 만들고 map을 만들기 위해 필요한 과정인 launch 파일을 작성해보자. world파일이 궁금한 분들은 본래 ros의 world파일을 보는 방법 + sdformat.org를 같이 본다면 빠른 습득이 가능할 것이다.

launch파일을 공부하기위해



직접 파일을 보고 습득해보자.
(먼저, http://wiki.ros.org/roslaunch/XML의 4.Tag Reference를 참조하였다.)

 <launch>는 root element of any roslaunch file로써 기본 시작이다.
그 다음으로 큰 카테고리인 <include>는 다음의 예를 보고 이해해보자.


위의 페이지 <arg> 페이지에 들어가게 되면 다음과 같은 예시를 들어주고 있다.

즉, my_file.launch에서 included.launch를 부르고 있는 모습을 볼 수 있다.
<include>태그를 통해서 included.launch를 부르고 그 안에서 <arg>태그의 역할은 included.launch파일에서 "hoge"대신이 된다.
included.launch에서 "hoge"의 역할은 <param>태그안에서 설정되어 있는데 그 안의 값을 "fuga"가 되는 것이다. 따라서

my_file.launch 파일은

included.launch
<launch>
   <arg name="fuga"  />
   <param name="param" value="fuga"/>
</launch>

가 되는 파일을 부르는 것이다.

+ <arg>태그를 정리해보자!

<arg>태그는 세 가지 방법으로 쓰일 수 있다.
1) <arg name="foo" /> 
: foo를 정의(declares), 단 이것은 command line 또는 <include>를 통해 정의될 수 있다.
2) <arg name="foo" default="1" /> 
: default값을 가진 foo를 정의, 이 또한 command line, <include>를 통해 정의 될 수 있다.
3) <arg name="foo" value="bar" /> 
: 상수(constant value)를 가진 foo를 정의, overriden 할 수 없다.
더 높은 레벨의 접근필요없이 내부 파라미터의 사용을 가능케 함.


Attributes
  • name="arg_name" 
  • : name of argument.

  • default="default value" (optional) 
  • : default value of argument. value attribute와 함께 쓸 수 x

  • value="value" (optional) 
  • : argument value. default attribute와 함께 쓸 수 x

  • doc="description for this arg" (optional) New in Indigo 
  • : description of the argument.


그 다음으로 큰 카테고리인 <node>태그의 역할은 우리가 ros에서 배운 "node"를 부르는 것이다. node를 만드려면 node를 정의하는 파일이 필요하니까 그 파일들에 대한 정보를 제공해주는 것이다.

turtlebot_world.launch에서는 두 가지 node가 선언되어 있다.
1) robot의 상태 node
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher">
    <param name="publish_frequency" type="double" value="30.0" />
  </node>

2) robot의 laserscan node
<!-- Fake laser -->
  <node pkg="nodelet" type="nodelet" name="laserscan_nodelet_manager" args="manager"/>
  <node pkg="nodelet" type="nodelet" name="depthimage_to_laserscan"
        args="load depthimage_to_laserscan/DepthImageToLaserScanNodelet laserscan_nodelet_manager">
    <param name="scan_height" value="10"/>
    <param name="output_frame_id" value="/camera_depth_frame"/>
    <param name="range_min" value="0.45"/>
    <remap from="image" to="/camera/depth/image_raw"/>
    <remap from="scan" to="/scan"/>
  </node>


자, 그러면 위의 캡처 사진인 turtlebot_world.launch파일을 살펴보자.
(node 태그는 살펴보았으니 생략하도록 한다.) 

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="use_sim_time" value="true"/>
    <arg name="debug" value="false"/>
    <arg name="gui" value="$(arg gui)" />
    <arg name="world_name" value="$(arg world_file)"/>
  </include>





위와 같은 경로로 들어가서 empty_world.launch파일을 열게되면 

<arg name="use_sim_time" value="true"/>
<arg name="debug" value="false"/>
<arg name="gui" value="$(arg gui)" />
<arg name="world_name" value="$(arg world_file)"/>

다음과 같은 <arg>태그를 찾아볼 수 있다. 즉, turtlebot_world.launch파일에서 empty_world.launch파일을 읽어들이는데 다음과 같은 값을 넣어 불러들이겠다는 것이다.

특히
<arg name="gui" value="$(arg gui)" />
<arg name="world_name" value="$(arg world_file)"/>
이 <arg>태그 $(arg gui)은 empty_world.launch의 <arg name="gui" default="true"/>를 말하고 있다. 이런 부분은
 

사진과 같이 launch파일은 많고 어떤 파일이 불릴지 모를 상황에서 각자 안의 값이 다르기 때문에 다음과 같이 선언하고있다.

#RobotOperatingSystem_Base


Q. ROS는 운영체제(OS)다?

A. 우리가 흔히 생각하는 운영체제는 아니다.
우리가 흔히 생각하는 OS의 예시인 WINDOW, UNIX, LINUX, MAC OS X etc.. 가 아니라 "메타 운영체제(Meta-Operating System)"인 것이다.
그렇다면, 그냥 Operating System과 무엇이 다르냐면 메타 운영체제는 기존의 운영체제를 이용하고 있다. 기존 운영체제의 프로세스 관리 시스템, 파일 시스템, 유저 인터페이스, 프로그램 유틸(컴파일러, 쓰레드 모델 등)등을 사용하고 있다. 이에 추가적으로 다수의 이기종 하드웨어간의 데티어 송수신, 스케줄링, 에러 처리 등 로봇 응용 소프트웨어에 필요한 필수 기능들을 라이브러리 형태로 제공하고 있다.
(출처 : 표윤석님의 ppt : http://www.slideshare.net/yoonseokpyo/20150708-ros-seminarinbusankorea)

ROS를 공부할 때에 많이 나오는 단어가 "메세지, 토픽, 서비스, 매개변수" 정도가 될 것이다. 이는 그 단어들이 ROS에서 가장 핵심 부분이라고 할 수 있기 때문이다.

각기 목적에 따라 분화된 최소 실행 단위인 노드들은 "메세지 통신"을 통해 노드간의 입/출력 데이터를 주고 받는 처리를 하고 있다.

Message, msg :
노드는 메세지를 통해 노드간의 데이터를 주고받게 된다. 메세지는 integer, floating, boolean와 같은 변수형태이다. 메세지 안에 메세지가 있는 구조, 메세지들의 배열과 같은 구조도 사용할 수 있다.
메세지를 이용한 통신방법으로는 TCPROS, UDPROS 등이 있으며, 단방향 메세지 송/수신 방식의 TOPIC과 양방향 메세지 요청/응답 방식의 SERVICE를 이용하고 있다.


























Topic?
topic은 이야깃거리다.

publisher node가 하나의 이야깃거리에 대해서 topic이라는 이름으로 master에 등록한 후, 이야깃거리에 대한 이야기를 message형태로 발행한다.
이 이야깃거리를 수신 받기를 원하는 subscriber node는 master에 등록된 토픽의 이름에 해당되는 발행자 노드의 정보를 받는다.


Service?
Topic은 비동기 방식이라 필요에 따라서 주어진 데이터를 전송하고 받기에 매우 훌륭한 방법이다. 또한 한 번의 접속으로 지속적인 메세지를 송/수신하기 때문에 지속적으로 메세지를 발송해야하는 센서 데이터에 많이 사용되고 있다.
하지만, 경우에 따라서는 요청/응답이 함께 사용되는 동기 방식의 메세지 교환 방식도 필요하다. 서비스는 이런 동기 방식의 메세지 교환 방법이다. 서비스는 토픽과 달리 1회성 메세지 통신이다. 요청/응답이 완료되면 두 노드의 접속은 끊기게 된다. 이런 서비스는 로봇에게 특정의 일을 수행하는 요청시에 명령어로써 많이 사용된다. 네트워크 부하가 적은 장점이 있다.

Parameter?
노드에서 사용되는 매개변수를 말한다. 이는 엄밀히 말하면 메세지 통신이라고 볼 수 없지만, 메세지를 이용한다는 점에서 메세지 통신의 범위에 속할 수 있다. 예를 들자면 접속하는 usb포트 및 카메라 캘리브레이션 값, 속도 및 명령어들의 최대/최저 값등의 설정 등



ros
ros는 메타 운영체제이며, 로봇 응용프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 프로세스간의 메시지 파싱, 패키지 관리, 개발환경에 필요한 라이브러리와 다양한 개발 및 디버깅 도구를 제공한다.

catkin
ROS의 빌드 시스템을 말한다. ROS의 빌드 시스템은 기본적으로 CMake(Cross platform Make)를 이용하고 있어서 package 폴더에 CMakeLists.txt라는 파일에 빌드 환경을 기술하고 있다.이는 ROS와 관련된 빌드, package 관리, package간의 의존관계 등을 편리하게 사용할 수 있도록 하고 있다.

rosbuild
catkin 빌드 시스템 이전에 사용되었던 빌드 시스템이다.

master
마스터는 노드와 노드사이의 연결 및 메시지 통신을 위한 네임 서버와 같은 역할을 한다.
roscore가 실행 명령어 이며, 마스터를 실행하면 각 노드들의 이름을 등록하고 필요에 따라 정보를 받을 수 있다. 마스터가 없이는 노드간의 접속, 토픽과 서비스와 같은 메시지 통신을 할 수 없다.

마스터는 마스터에 접속하는 슬레이브들과의 접속 상태를 유지하지 않는 HTTP기반의 프로토콜인 XMLRPC를 이용하여 슬레이브들과 통신하게 된다. 즉, 슬레이브인 노드들이 필요할 때만 접속하여 서로간의 접속 상태를 체크하지 않는다. 이러한 기능으로 매우 크고, 복잡한 환경에서도 적용 가능하다. 또한 XMLRPC는 매우 가볍고 다양한 프로그래밍 언어를 지워하고 있기 때문에 다기종 하드웨어, 다 언어를 지원하는 ROS에 매우 적합하다.
ROS를 구동하게되면 사용자가 정해놓은 ROS_MASTER_URI 변수에 기재되어 있는 URI 주소 및 포트를 갖는다. 사용자가 설정해놓지 않은 경우에는 URI 주소로 현재의 로컬 IP를 사용하고, 11311 포트를 이용하게 된다.

node
ros에서 최소 단위의 실행 프로세서를 가르키는 용어이다.
하나의 실행 가능한 프로그램으로 생각하면 된다. 하나의 목적에 하나의 노드를 작성하길 권하고 있으며 재사용이 쉽도록 구성하여 만들도록 권고하고 있다.

package
ros를 구성하는 기본 단위로써 실행 가능한 노드를 포함하고 있다.
ros는 패키지를 단위로 각각의 응용 프로그램들이 개발된다.

metapackage
공통된 목적을 가지는 패키지들을 모아둔 패키지들의 집합

massage,msg
노드는 메세지를 통해 노드간의 데이터를 주고받게된다. 메세지는 integer, floating pointer, boolean와 같은 변수 형태이다. 메세지안에 메세지를 품는 형태와 메세지들의 배열과 같은 구조도 사용할 수 있다.

topic
토픽은 이야깃거리이다. 발행자 노드가 하나의 이야깃거리에 대해서 토픽이라는 이름으로 마스터에 등록한 후 , 이야깃거리에 대한 이야기를 메세지 형태로 발행한다. 토픽을 수신 받기를 원하는 구독자 노드는 마스터에 등록된 토픽의 이름에 해당되는 발행자 노드의 정보를 받는다.

publish & publisher
발행은 토픽의 내용에 해당되는 메세지형태의 데이터를 송신하는 것을 말한다.

subscribe&subscriber
구독은 토픽의 내용에 해당되는 메세지 형태의 데이터를 수신하는 것을 말한다.

roscore
ROS 마스터를 구동하는 명령어이다. 같은 네트웍이 라면 다른 컴퓨터에서 실행하여도 된다.
단, 멀티 ROS코어를 지원하는 특수한 경우를 제외하고는 ROS코어는 동일 네트워크에서 하나만 구동되게 된다.
ROS를 구동하게 되면 사용자가 정해놓은 ROS_MASTER_URI 변수에 기재되어 있는 URI 주소 및 포트 를 갖는다. 사용자가 설정해놓지 않은 경우에는 URI 주소로 현재의 로컬 IP 를 사용하고, 11311 포트를 이용하게 된다.

parameter server
 매개변수 서버는 패키지에서 매개변수 를 사용할 때, 각 매개변수를 등록하는 서버를 말한다.
매개변수 서버는 마스터의 일부분 이다.

rosrun
ROS의 기본적인 실행 명령어이다. 패키지에서 하나의 노드를 실행하는데 사용된다. 노드가 사용하는 URI 주소 및 포트는 현재 노드가 실행중인 컴퓨터에 저장된 ROS_HOSTNAME 라는 환경 변수값을 URI 주소로 사용하며, 포트는 임의적 고유의 값으로 설정되게 된다.

roslaunch
rosrun이 하나의 노드를 실행하는 명령어라면 ROS런치(roslaunch) 는 복 수개의 노드를 실행하는 개념이다.
이 명령어를 통해 정해진 단일 혹은 복수의 노드 를 실행시킬 수 있다. 그 이외의 기능으로 실행시에 패키지의 매개변수를 변경, 노드 명의 변경, 노드 네임 스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 이름 변경, 환경 변수 변경 등의 실행시 변경할 수 있는 많은 옵션들을 갖춘 노드 실행에 특화된 ROS 명령어이다. ROS런치는*.launch라는ROS런치파일을 사용하여 실행 노드에 대한 설정을 해주는데 이는 XML 기반으로 되어 있으며, 태그별 옵션을 제공하고 있다.

bag
ROS에서 주고받는 메시지의 데이터를 저장할 수 있는 있는데 이를 배그라고 한다. ROS에서는 이 배그를 이용하여 메시지를 저장하고 필요로 할 때 이를 재생하여 이전 상황을 그대로 재현할 수있는 기능을 갖추고 있다.
예를들어, 센서를 이용한 로봇 실험을 실행할 때, 센서 값을 배그를 이용하여 메시지 형태로 저장한다. 이 저장된 메시지는 같은 실험을 수행하지 않아도 저장해둔 배그 파일을 재생하는 것으로 그 당시의 센서값을 반복 사용가능하다. 특히, 기록, 재생의 기능을 활용하여 반복되는 프로그램 수정이 많은 알고리즘 개발에 매우 유용하다.

ROS Wiki.
ROS의 각 패키지 및 기능들을 설명하는 페이지(http://wiki. ros.org/)이다. 각 패키지는 위키 페이지에 패키지에 대한 간단한 설명, 사용되는 매개변 수, 저작자, 라이선스, 홈페이지, 저장소, 튜토리얼등을 기술하고 있다.

repositoy
공개된 패키지의 경우, 각 패키지의 위키에 저장소를 명시하고 있다. 저장소는 패키지가 저장된 웹상의 저장소 URL 주소이며 svn, hg, git 등의 소스 관리 시스템을 이용하여 이슈, 개발, 다운로드 등을 관리하고 있다.

graph
위에서 설명한 노드, 토픽, 발행자, 구독자 관계를 그래프 를 통해 나타나게 하는 것이다. 현재 실행중인 메시지 통신을 그래프화 시킨 것으로 1회성 서비스에 대한 그래프는 작성할 수 없다. 실행은 rqt_graph 패키지의 rqt_graph 노드를 실행하면 된다. 실행 명령에는 두 가지가 있는데 rqt_graph과 rosrun rqt_graph rqt_graph 이다.

name 노드, 매개변수, 토픽, 서비스는 모두 이름을 갖고 있다. 이 이름은 마스터에 등록하고 각 노드의 매개변수, 토픽, 서비스를 사용할때 이 이름을 기반 으로 상호적으로 동작하도록 되어있다. 또한, 이름은 실행시에 변경가능하기 때문에 매우 유연하고, 같은 노드, 매개변수, 토픽, 서비스라고 하여도 다른 이름으로 중복 실행이 가능하다. 이러한 이름의 사용으로 ROS는 큰 규모의 프로젝트, 복잡한 구조의 시스템에도 적합하다.

client libray
ROS는 사용되는 언어의 의존성을 낮추기 위하여 클라이언트 라이브러리라는 이름으로 각종 언어의 개발환경을 제공하고 있다. 주요한 클라이언트 라이브러리로는 C++, Python, Lisp 등이 있으며, 그 이외에도 java, lua, .NET, EusLisp, R 등의 언어들을 사용가능하다. 이를 위해 roscpp, rospy, roslisp, rosjava, roslua, roscs, roseus, PhaROS, rosR 등의 클라이언트 라이브러리가 개발되었다.

URI (Uniform Resource Identi?er)
URI(UniformResourceIdentifier, 통합 자원 식별자) 는 인터넷에 있는 자원을 나타내는 유일한 주소이다. URI 은 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에서 식별자로 사용된다.

MD5 ,Message-Digest algorithm 5
MD5는 128비트 암호화 해시 함수 이다.주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용된다.
ROS에서의 메시지를 이용한 통신에서 MD5를 이용하여 메시지 송수신의 무결성 검사를 하고 있다.

RPC(RemoteProcedureCall).
RPC란’멀리 떨어져(Remote)있는 컴퓨터 상의 프로그램이 다른 컴퓨터 내에 있는 서브프로그램(Procedure)을 불러내는(Call)’ 것을 의미한다. 컴퓨터 프로그램이 다른 주소 공간에서 원격 제어를 위한 프로그래머의 세세한 코딩 없이 함수나 프로시저의 실행을 허용하는 기술로써 대표적으로는 TCP/IP, IPX 등의 전송 프로토콜을 이용한다.

XML(ExtensibleMarkupLanguage).
XML은W3C에서 다른 특수 목적의 마크업 언어를 만드는 용도에서 권장되는 다목적 마크업 언어(markup language)로 태그 등을 이용하여 데이터의 구조를 명기하는 언어의 한 가지이다.

XMLRPC.
XML-RPC란, RPC 프로토콜의 일종으로서, 인코딩 형식에서는 XML을 채택하고, 전송 방식에서는 접속 상태를 유지하지 않고 체크하지 않는 요청/응 답 방식의 HTTP 프로토콜을 사용하고 있다. XML-RPC는 매우 단순한 규약으로서, 작은 데이터 형식이나 명령을 정의하는 정도로만 사용하고 있어서 꽤나 단순한 편이다. 이러한 특징으로, XMLRPC는 매우 가볍고, 다양한 프로그래밍 언어를 지원하고 있기 때문에 다기종 하드웨어, 다언어를 지원하는 ROS에 매우 적합하다.

TCP/IP(TransmissionControlProtocol/InternetProtocol). TCP는Transmission Control Protocol 의 약자로써, 전송 제어 프로토콜이라고 부른다.
흔히 TCP/IP 라 부르는데 이는 인터넷 프로토콜 계층의 시각에서 보면 IP(Internet Protocol) 를 기반으로 전송 제어 프로토콜인 TCP 를 사용하여 데이터의 전달을 보증하고 보낸 순서대로 송/ 수신하게 된다.

TCPROS.
메시지 및 서비스에서 사용되는 TCP/IP 기반의 메시지 방식을 TCPROS라고 한다.

UDPROS.
메시지 및 서비스에서 사용되는 UDP 기반의 메시지 방식을 UDPROS라고 한다.
일반적으로 ROS에서는 사용되지 않고 있다.

CMakeLists.txt.
ROS의 빌드 시스템인 캐킨은 기본적으로 CMake를 이용 하고 있어서 패키지 폴더에 CMakeLists.txt 라는 파일에 빌드 환경을 기술하고 있다.

package.xml.
패키지의 정보를 담은 XML 파일로써 패키지의 이
름, 저 작자, 라이선스, 의존성 패키지 등을 기술하고 있다