2017년 4월 3일 월요일

Software Test?


흠.. 소프트웨어 테스팅! 들어보신 적 있으신가요?
저는 다행이도 학과 수업을 통해 처음 접했습니다.
교수님이 테스팅에 관심이 많으시거든요!
덕분에 그런게 있고, 또한 중요하다는 걸 인식할 수 있었습니다.
그 외에도 학교에서도 최근 "테스팅"에 관심이 많더군요.

아무래도.. 차츰 들어가는 비용이 전체 예산의 많은 부분을 차지하면서 그렇게 된 것 같다는 생각이 듭니다. 공학은 경제적, 효율적이여야하니!















































동의대학교 IT융합부품연구소에서 강의가 진행이 되었는데,
이번 강의를 진행하신 강사분은 Ph.D Stuart Reid이신데 간단히 조선신문의 말을 빌리자면,
"국제 SW 테스팅 자격시험 단체인 ISTQB(International Software Testing Qualifications Board) 초대 회장과 ISO/IEC/IEEE 29119 표준 위원으로 활동하기도 했다. ISO/IEC/IEEE 29119는 SW 테스팅 관련 국제 표준의 하나로, 리드 CTO가 제정을 주도한 바 있다."
라는 분입니다. SW 테스팅 컨설트 전문가입니다.

먼저 크게는 4차 혁명시대의 SW Engineering / Testing without Testing(테스팅 없이 테스팅하는 방법) 으로 나뉘어서 진행되었으며 전체 강의는 영어로 진행되었고 3-40분 간격으로 영어를 알아듣기 힘드신 분들을 위해서 한국분께서 진행된 내용에 대해 간략히 요약하여 다시 설명해주고 다시 강의하는 형식으로 진행되었습니다.
대부분이 회사에서 근무하시는 분들이 참석을 많이하셨고 16:30까지 강의가 진행되어 Q&A시간은 생략되어버렸어요..

<4차 혁명시대>
4Generation technology
IoT, 3D print, AI, Bigdata.. 多

Robot :
china? Biggest market in a world, the main company is "Foxconn"
korea? Not bad, Except Car. automatic part is valuable in Korea.
-----------------------------------------------------------------------------------------------------------------------
As times go by, the maintained jobs will be disappeared. but instead, the new jobs will come.
: In 20 years, In England, 800,000 jobs gonna disappear and















The most dangerous in the jobs is the middle part of the graph above.
중간층에 위치하는 직업은 주로 반복적인 작업이여서 이부분의 직업군이 대거 로봇으로 대체되게 될 것으로 보인다.

꽤 인상깊었던 것은, ppt로 미래에 사라질 직업군을 간단히 보여주는데
 우리나라에서 하는 조사와 어른들이 하는 말은 교사가 제일 먼저 사라질 직업이라는 말을 듣고 자랐기 때문에 computer programmer 48%가 대체되는 것에 비해 HighSchool Teacher의 대체 비율은 1%정도인 것이 놀라웠다. 덧붙인 설명으로는 우리들의 아이들을 로봇에게 가르치게 하고 싶지않을거다. 아이들을 인간적으로 키우고 싶다면 사람인 선생님에게 맡길거라는 말이 인상깊었다.

직업군을 살펴보았을 때 creative한 직군일 수록 사라지기 힘들다는 사실을 알 수 있다.

-----------------------------------------------------------------------------------------------------------------------

최근의 %로 볼 때, 전체 비용의 35%정도가 Testing비용으로 쓰인다. 이 35%는 앞으로 더 늘어날 가능성이 농후하다.
따라서, 충분하지 x 테스팅& 많은 비용을 이용해 테스팅을 진행하고 있다는 것이다.

전체적인 테스팅을 볼 때,

Test 
Automation
(45%)
Manual 
Test
(55%)

여기서 Manual은 Manual대로 해야하지만, Automation은 대안을 찾아볼 수 있다. 그렇다면 대안에는 어떤 것들이 있을까?

테스팅 종류들은 다음과 같다.
그리고 괄호안의 수는 표준적으로 이루어지면되는 %를 표현해 놓은것이다.
대부분이 표준과 비슷하게 실행되고 있지만, 유난히 테스팅에 있어서 많이 놓치는 부분이 BVA이다. 이것은 Boundary Value Advanced로 0.75수준으로 굉장히 많은 비용과 노력이 쏟아지고 있지만 표준정도의 비용과 노력으로 잡을 수 있다는 사실이다.
  • Statement (0.12) : Complex Testing↑
  • Branch(0.15)
  • BranchCondition(0.14)
  • MCDC(0.16)
  • BranchConditionCombination(0.16)
  • EP(0.16)
  • BVA(0.20) : Boundary Value Advanced (0.75)
-----------------------------------------------------------------------------------------------------------------------
그렇다면, 테스팅(팀)없이 테스트를 할 수 있는 방법은 없을까?(Testing without Test design)
  • Random Test : 1) Fuzz testing 2)Monkey testing
  • Crowd Test | A/B Test
  • Artificial Test
갑자기 테스팅없이 테스트를 소개하는 이유는 BVA부분을 제외한 나머지 부분은 Random Testing을 통해서 대부분의 테스팅결과를 잡을 수 있기 때문에 소개한다.
따라서, Random Testing이 가치가 있는 것이다.

-----------------------------------------------------------------------------------------------------------------------
테스팅을 하기 위해선 여러가지 방법이 쓰일 수 있지만, 그에 앞서 정보를 수집할 때 일어나는 위험성에 대해 알아보자.

위와 같이 간단히 나타낼수 있다. 
Raw Data는 무작위로 얻을 수 있다. 예시로는 Airliner, CCTV, Drone, Mobile등이 있다.

그리고 Data Collector가 위에서 가장 중요하다. 바로 사람들의 Privacy 문제와 직결되기 때문이다.(Valuable info)

따라서 위와 같은 과정이 필요하다. Random Data에서도 valid/invalid로 나뉘어서 한 번 거르고 Data Collector를 거친 이후에도 Verify Checking을 통해서 개인의 정보가 포함될 만한 것을 거른다음 접근권한과 전문가에 의해 한 번 더 걸러진 이후의 데이터를 Big Data에서 활용할 수 있게 하는것이다. 전문가가 들어가는 이유는 빅데이터라도 어디에 쓸 빅데이터인지에 따라 필요한 정보다 다르기 때문에 그에 맞는 전문가가 "필요한정보를" 걸러내는 일이다. 불필요한 정보까지 포함하면서 Privacy문제를 높일 필요가 없는 것이다.

-----------------------------------------------------------------------------------------------------------------------

자, 먼저 Crowd Testing을 살펴보자.
이 테스팅의 특징은 세가지가 있다.

  • X need Sketch personality of users
  • Diff environ, Diff device / Diff setting-up : expensive expense
  • Keep Secret
전 세계적으로 핸드폰의 기종은 24,000여 종. 그리고 가장 많이 쓰이는 기종은 전 세계적으로 30기종. 하지만 시장은 빠르게 바뀌고, 그 30기종을 모두 테스팅하는 것도 실질적으로 말이 안된다. 시간이 시장이 바뀌는거와 비교했을 때 따라가기 힘들다. 비용또한.
따라서, 클라우드 테스팅을 통해서 테스팅이 진행될 수 있다.
  1. 사용자의 특성을 생각하지 않아도 된다. : 사람마다 이렇게 쓸 수도 저렇게 쓸 수도 있다는 가정을하고 테스팅을 하지 않아도 된다. 직접 많은 다양한 사람들이 써 볼 것이기 때문에.
  2. 다른 환경, 다른 기종, 다른 환경세팅을 갖추고 테스팅을 진행하는 것은 회사에서 단독 진행시 많은 비용이 든다. 이 부담을 다양한 실제 사용자들이 사용하면서 테스팅을 한다면 훨씬 줄어들게 된다. 여기에서는 다른 나라에서의 테스팅은 특히 어려운데 이것을 Crowd Testing을 통해 해결한다면 보다 적은 비용으로 테스팅이 가능해진다.
  3. 계약을 통한 관계로, 비밀을 발설할 시 불이익을 당할 것이기 때문에 사용자들이 발설하지 않을 것이다.

위와 같이 클라이언트의 App에 대한 테스팅 필요성이 필요할 시 요청되고, 지불되는 비요의 4/5를 클라우드 테스터들에게 쓰이게 되고, 1/5정도를 클라우드 테스터들이 테스트를 할 수 있는 환경, 서비스를 제공하는데에 쓰이게 된다. 
그리고 많은 기종과 다양한 환경의 테스팅을 완료하고 중간 서비스 제공회사측에서 그에 알맞는 테스팅 결과 레포트를 작성하여 전달하게 된다.
-----------------------------------------------------------------------------------------------------------------------
다음으로, A/B Testing은 주로 활용도, 선호도 판단시에 많이 이용이 된다.
현재, 네이버(naver)의 홈페이지가 모양새가 바뀌게 되었는데 그에 따라서 사용자들의 편의나 이용정도가 늘어났는지를 테스트 하는 느낌정도로 생각할 수 있다.
따라서 테스터들이 본인들이 테스팅을 하고 있는지 인지 못하는 경우가 많다고 한다.

-----------------------------------------------------------------------------------------------------------------------

마지막으로, Artificial Test. 인공지능을 이용한 테스팅인데 Directly Test가 가능하다.
주로 사람이 어떻게 문제를 해결할까?를 바탕으로 두고 만들어내는 알고리즘으로 작동하게 되는데 사람은 문제들을 풀기위해 여러 방법을 사용한다고 한다. 따라서 다양하게 이용하면 좀 더 사람에 가까운 해결능력을 가진 로봇을 찾아낼 수 있지 않을까 싶다.

AI toolkits를 알아보자.
  1. Google TensorFlow
  2. Torch
  3. Caffe
  4. IBM Watson : solve tiny problems. x free for company.
  5. CNTK
등이 있다. 각자의 사용법과 장단점은 직접 이용하면서 찾아보자.

기계의 장점은 사람이 놓치고 넘어갈 수 있는 부분까지 잡아줄 수 있다는 것이다. 이런 기계가 사람이 "$$%^^&&*(*%#$@%^But$%%&(*((*&^%$%&("를 알아 들을 수 있게 된다면? But을 기준으로 앞문장과 뒷문장이 다르다는 것을 알고 저런 문장이 많고 미사여구가 더 길어진다면 사람으로써는 놓칠 수 있는 부분이 생기게 된다.


다음 그래프를 보면, 우리가 고려해야 할 두 가지 조건이 있다. Module Size, Revision.
위와 같은 경우는 선을 그어 어떻게 테스팅해야하고, 어디에서 많이 버그가 나올지 대충 예상을 할 수 있다. 하지만 우리가 고려해야 할 조건이 한 두가지가 아닐 것이다. 속성이 다양할 수록 분석을 더 많이, 더 어려워진다.

[Static Analysis, 정적 분석] :
간단하게 이야기하고 넘어간다. 대표적인 예로는 Facebook의 Infer가 있다.
A tool to detect bugs in JAVA, C, C++, Obj-C, Android etc.

(참조 : http://fbinfer.com/)

위와 같이, 작성하고 infer -- javac javafile을 실행하면 분석을 시작하고 issue가 발생하면 알려주는 방식으로 진행된다.

[Regression Testing, 회귀 테스팅]
간단히 말하면 갈 수록 커지는 테스팅이다. A, A-B, A-B-C, ..이런식으로 진행되기 때문!
범위(Coverage): Branch/ Risk/ Defect-O => Optimize, Order the steps

tip, 만약 잘 모르겠다 싶으면 full regression을 추천하신다고 하심.

그냥 테스팅 결과가 실제결론에 들어가는 것으로는 테스팅이 충분하지 않음으로 위와 같이 바뀐 정보를 피드백으로 다시 넣어주어 새로운 결과를 뽑아내는 형식으로 진행된다.

위에서 Why Artificial Testing?에 대해 알아보았다면, Why they are not use?
  • Tester rely on the tool : little or no black box testing.
즉, 소스코드를 감춘상태에서 테스팅을 진행할 수 없게된다. 테스팅을 위해 반드시 소스를 기계에게 공개하게 되는 상황이 발생하고 이는, 정보의 위험에 이르게 되므로 무조건 좋다고 볼수도 없다.

-----------------------------------------------------------------------------------------------------------------------
마지막으로 Android Stress Testing Tools를 간단히 보고 마치도록하자.
  • Google : Cool Monkey BUT 많은 단계를 거침. (many steps)
  • Sapienz : Unique Crashes High Coverage.
  • Dynodroid
(강의에서 분석 그래프를 살펴보았을 때,) find bugs 가 가능하다.

2017년 4월 2일 일요일

#PLAY TURTLEBOT(ROS) IN REAL WORLD #실제로 TURTLEBOT을 실행시켜보자!



오늘은 학교에서 터틀봇을 이용하여 기본적인 예제를 직접 로봇에 적용하여 움직여보는 실습을 하게 되었다.

명령어들을 정리하여보자.

먼저, 환경설정을 알아보자.
<Hardware>
1) Raspberrypi3 with Ubuntu Mate 16.04
2) laptop with Ubuntu 16.04 Xenial
3) Asus camera
4) Lidar
5) Turtlebot
6) logitech lidar trace camera

<Software>
1) Ubuntu Mate 16.04(Raspberrypi3)
2) Ubuntu 16.04 Xenial
3) Ros kinetic (라즈베리파이3과 랩탑 모두에 설치)

자, 이제부터 실행 명령어들을 알아보자.
아, 실행전에 2017-03-31 기준으로 kinetic에서 turtlebot관련 package가 기본으로 깔리진 않는다. 따라서 다음의 명령어를 실행해주자.

$ sudo apt-get install ros-kinetic-turtlebot*

ros의 명령들을 찾고 싶다면 sudo apt-get install ros-kinetic "tab"키를 이용하여 찾아 설치하도록 하자.

-----------------------------------------------------------------------------------------------------------

먼저, 라즈베리파이3을 살펴보자.(라즈베리파이3에 Ros가 완전설치 완료후)
첫번째, usb 설정을 해주자. 왜냐면, usb의 이름이 우리가 알아볼 수 있는 이름으로 설정해두고 쓰는 것이 좀 더 진행에 있어서 수월하기 때문!

$ sudo vi /etc/udev/rules.d/71-kobuki.rules
#참고로,없는 파일을 임의로 생성해주는 것으로, 파일이름은 아무거나해도된다.
하지만, 앞의 숫자는 임의로 붙여주고 뒤엔 파일의 설명이나 이름을 적어주는 것이 나중에 이해하고 찾기 쉽다.(규칙을 지키는 것이 수월하다.)






#아래 내용을 추가해준다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="kobuki*", MODE:="0666", GROUP:="dialout", SYMLINK+="kobuki"

혹은, ros wiki에서는 다음과 같은 방법을 설명해주고 있다.
For convenience, to enable the device to appear on /dev/kobuki, use the following script to copy across the udev rule and restart udev (you'll need your sudo password):

$ rosrun kobuki_ftdi create_udev_rules
$ udevadm control --reload


그리고
$ sudo vi /etc/udev/rules.d/70-rplidar.rules
# 아래 내용을 추가해준다.

SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout", SYMLINK+="rplidar"


다음과 같이 설정하고 나면,
$ cd /dev

$ find -name '*rplidar'

$ find -name '*kobuki'

#검색을 통해 장치가 올바르게 설정되었는지 확인하자.

-----------------------------------------------------------------------------------------------------------

이제,환경설정을 해보자

$ cd ~
$ sudo vi .bashrc

ros가 정상 설치되었다면, 아래쪽에 다음과 같이 설정이 되어 있을 것이다.
이 설정을 다음과 같이 바꾼다.
이 설정을 바꿀 때에는,
[라즈베리파이설정]
1) ifconfig를 통해 라즈베리파이3의 현재 와이파이 주소를 확인한다.
2) 그 주소를 라즈베리파이의 ROS_MASTER, ROS_IP로 설정한다.
(http://는 없애지 않는걸로 한다. 없으면 작동 x)
만약, 다음과 같이 192.168.0.11 이 라즈베리파이의 주소라면,http://192.168.0.11:11311로 ROS_MASTER를 설정한다.

[노트북설정]
1) ifconfig를 참조해 ROS_IP는 본인의 IP로 설정한다.
(참고로, ROS_HOSTNAME를 없애고 ROS_IP로 명시하도록 하는 걸 권장한다. 같은 의미지만 오류가 나는 경우가 있으므로.)
2) ROS_MASTER_URI는 로봇과 통신연결을 해 줄 라즈베리파이3의 IP로 설정한다.
따라서 다음과 같이 설정할 수 있다.


 tip. 라즈베리파이에선 로그인상태를 만들지 않는 것이 좋다.
하지만 사용자 권한은 존재하는 것이 좋으므로 사용자 비밀번호를 가지고 있으되, 로그인을 auto상태로 바꿔주자.
(System Setting/User Account)















  1. Go to User Accounts and select the user in question.(right upside_unlock)
  2. Switch the Automatic Login field to the ON position.
-----------------------------------------------------------------------------------------------------------

자, 이제 방화벽을 해제 해보자.
[라즈베리파이3]
$ ssh localhost #작동하는지 확인해보자. 참고로, 실행하지 않아도 좋다.
$ sudo raspi -config

다음과 같이 ssh 설정을 해주고
[PC]
$ ssh 컴퓨터이름@연결할 ip주소
ex ) $ ssh hhh@192.168.0.11
위 명령어가 실행되고 비밀번호를 알맞게 입력해준뒤에도 오류가 난다면
[라즈베리파이3]
$gufw #open the firewall with gui.
이 명령어를 실행시켜서 라즈베리파이의 방화벽을 끄도록 하자.(대부분은 하지 않아도 가능하다.)

[라즈베리파이3]
1$ roscore
2$ roslaunch turtlebot_bringup minimal.launch
실행시 띠로릭-하고 소리가 난다.

-----------------------------------------------------------------------------------------------------------

자, 이제 3D_Sensor를 설정해보자.
3$ env | grep TURTLEBOT_3D*
명령어를 통해 다음과 같이 확인한다.





kinect를 사용한다면 그대로 유지하고, 만약 나와같이 ASUS 카메라등 다른 기종을 쓴다면 따로 설정을 해주어야 한다. 앞으로 카메라를 계속 쓰일 것이니 아예 .bashrc파일을 고쳐주자.

[라즈베리파이3]
3$ vim ~/.bashrc
export TURTLEBOT_3D_SENSOR=asus_xtion_pro
를 추가해주자.
3$ source ~/.bashrc
3$ roslaunch turtlebot_bringup 3dsensor.launch

[PC]
1$ roslaunch turtlebot_teleop keyboard_teleop.launch
2$ rviz
자, 이제 로봇을 조종해보자.

-----------------------------------------------------------------------------------------------------------

참고로, 라즈베리파이와의 통신을 종료시킬때!
[PC]
$ sync
명령어를 여러번 실행시켜준 다음,
$ exit

-----------------------------------------------------------------------------------------------------------

다음으로 지도를 만들어보자.
[라즈베리파이3]

1$ roscore
2$ roslaunch turtlebot_bringup minimal.launch 

[PC]
3$ roslaunch turtlebot_teleop keyboard_teleop.launch
4$ rviz
5$ roslaunch turtlebot_navigation gmapping_demo.launch #여기에서 Asus Xtion을 불러오고있다. 따라서, 따로 3dsensor.launch를 부를필요 x
# 만약 여기서 혹은 rviz에서 오류가 난다면





위의 요소들이 value값들을 모두 "true"로 바꾼다.
[PC]
$ roslaunch turtlebot_rviz_launchers view_navigation.launch
이제, 키보드를 움직여 원하는 장소를 돌아다니며 맵을 생성하자.

[라즈베리파이3]
6$  rosrun map_server map_saver -f /tmp/my_map
pc에 저장할 수도 있지만, 나중에 amcl 실행시에 로봇상에 있는 것이 좀 더 효율적임. 따라서 라즈베리파이에 저장하자.

***만약 pc상에 생성했다면 생성된 맵을 security-ftp로 보내보자!
[PC]
$ sftp hhh@192.168.0.11

[라즈베리파이3]
$ export TURTLEBOT_MAP_FILE=/tmp/my_map
$ roslaunch turtlebot_navigation amcl_demo.launch

[PC]
$ roslaunch turtlebot_rviz_launchers view_navigation

-----------------------------------------------------------------------------------------------------------

자, 다음으로는 RPLidar를 이용해서 지도를 생성해보자.
[라즈베리파이3]
$ cd ~/catkin_ws/src/
$ git clone https://github.com/robopeak/rplidar_ros
$ cd ~/catkin_ws
$ catkin_make
$ roslaunch rplidar_ros rplidar.launch

[PC]
$ rviz

2D scan data 확인해보자.
[라즈베리파이3]
$ udevadm info --name=ttyUSB[0,1] #장치이름 확인가능
$ udevadm info --name=ttyUSB1


$ sudo -s
$ roscd turtlebot_description
$ cd urdf
$ sudo vi turtlebot_library.urdf.xacro

안의 내용을 amcl에 나오는 화면과 로봇의 싱크를 맞춰서 조절해준다.
어떻게?
<joint name="laser" type="fixed">
  <origin xyz="0.06 0.00 0.37" rpy="0 3.14159 0"/>
...
xyz는 기본 3d좌표계이고,
rpy는 rol pitch yo로 공간좌표계를 말하는 걸로 차례대로 x회전축 y회전축 z회전축이다.


그리고, /scan토픽의 충돌방지를 위해 수정해준다.
$ roscd turtlebot_bringup
$ cd launch
$ vi 3dsensor.launch

<arg name="scan topic" default="scan"/>
-> <arg name="scan_topic" default="xtion_pro_scan"/>으로 바꾼다.

&&&

rplidar실행을 위해서 minimal.launch를 아래의 내용을 복사하여 적절히 수정한다.
$ roscd turtlebot_bringup
$ cd launch
$ vi minimal.launch

 <node name="rplidarNode" pkg="rplidar_ros" type="rplidarNode" output="screen">
 <param name="serial_port" type="string" value="rplidar"/>
 <param name="serial_baudrate" type="int" value="115200"/>
 <param name="frame_id" type="string" value="base_laser_link"/>
 <param name="inverted" type="bool" value="true"/>
 <param name="angle_compensate" type="bool" value="true"/>
</launch>

$ roslaunch turtlebot_bringup minimal.launch
$ rosrun rviz rviz

-----------------------------------------------------------------------------------------------------------

추가적으로 usb_webcam을 사용해보자.

참고로, 현재 usb_cam을 공식적으로 제공하는 버전은 jade까지이다.
따라서 kinetic버전을 사용하는 사용자는 따로 방법을 찾아보아야한다. 찾은 두 가지 방법으로는
1)
$ mkdir -p ~/catkin-ws/src
$ cd ~/catkin-ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make
$ source ~/catkin-ws/devel/setup.bash
다음에
$ roscd usb_cam
위의 명령어가 실행된다면 아무문제없이 usb_cam을 사용할 수 있지만 본인같은 경우는 OpenCV문제에 걸리게 되어서..
몇 시간을 헤매게 되었다지요!
2)
$ sudo apt-get install ros-kinetic-video-stream-opencv 
를 실행시킨 다음,

$ mkdir -p ~/catkin-ws/src
$ cd ~/catkin-ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make
$ source ~/catkin-ws/devel/setup.bash

1)의 행동을 실행하게되면 해결되는 경우가 있습니다.

+ 참고로 노트북에서 웹캠이 탑재된 경우는
$ roscd usb_cam
$ cd launch
$ vim vim usb_cam-test.launch


위에서 세 번째 줄 쯤에 "video_device"의 "value"값을 /dev/video0 -> /dev/video1로 바꾸어주자.
물론, 본인의 장치를 컴퓨터에 인식시켜서 /dev안의 값이 바뀌는지 확인해서 작성해주어야한다. 이런 이름을 찾아야 되는 번거로운 일을 피하기 위해서 우리는 위에서 인식되는 usb의 이름을 바꾸는 작업을 실행해보았다.

2017년 3월 8일 수요일

#RobotOperatingSystem_ANDROIDwithROS_Kinetic



개발환경
(1) Ubuntu 16.04 LTS (Xenial Xerus)
! 참조로,Indigo는 Ubuntu 16에서 돌아가지 않는다.

(2) Ros Kinetic
  One line Install :
wget https://raw.githubusercontent.com/oroca/oroca-ros-pkg/kinetic/ros_install.sh && chmod 755 ./ros_install.sh && bash ./ros_install.sh catkin_ws kinetic
[출처] ROS Kinetic 1줄 설치! (오픈소스 소프트웨어 & 하드웨어: 로봇 기술 공유 카페 (오로카)) |작성자 표윤석

cf) 설치가 제대로 되지 않을 시 추가참조 :
http://hrepository.blogspot.kr/2017/01/robotoperatingsystem00.html
 
(3)Android Studio

http://hrepository.blogspot.kr/2017/01/ubuntu-androidstudio-tutoiral.html
 : 다음 페이지를 참조해서 설치하도록하자.
참고로,
- select Configure->SDK Manager option make sure you have installed Android SDK Build Tools 25.0.2, Android APIs 10 (gingerbread), 13 (honeycomb), 15 (ice cream), 18 (jellybean).(위와 같은 것들의 설치가 필요하다.)
- Some settings you might like to configure: Version Control->Github
- make sure you have the latest. (가장 최근 버전으로 update하시오.)
path에 다음을 추가하시오.
(이것은 Android Studiofmf /opt/android-studio나 /opt/android-sdk가 아닌곳에서도 작동할 수 있게 수정해야한다.)
$ echo export PATH=\${PATH}:/opt/android-sdk/tools:/opt/android-sdk/platform-tools:/opt/android-studio/bin >> ~/.bashrc
$ echo export ANDROID_HOME=/opt/android-sdk >> ~/.bashrc
 
 
Error
"Inotify Watches Limit" https://confluence.jetbrains.com/display/IDEADEV/Inotify+Watches+Limit
 이 페이지에서 언급한 에러가 난다면,
  페이지에서 언급 된 것처럼 
(1) > vim /etc/sysctl.conf
파일 아래에 다음을 추가해준다.
> fs.inotify.max_user_watches = 524288
 
 or
 
 (2) 새로운 .conf file을 /etc/sysctl.d/ directory 아래에 추가해준다. 예를 들면 idea.conf같이 생성해서
파일에 다음을 작성해준다.
> fs.inotify.max_user_watches = 524288
 
 본인은 (1)방법으로 실행하였다.
그리고 두 방법 중 한 방법을 적용한 뒤 

> sudo sysctl -p --system
#바뀐 설정을 적용하기 위해 명령을 해준다. 
 
자, 이제 IDE를 재시작해보자. 
 

<START>
 먼저,Android와 ROS의 연결을 확인하기 위해 ROS Wiki의 예제를 따라해보자.
Android를 작성하기 위해서 Java가 필요하니, rosjava를 먼저 설치하기를 말하고 있으나, 본인은 홈페이지를 따라 같이 설치하는 방향으로 간다.

(1) PreRequisites
sudo apt-get install ros-kinetic-rosjava-build-tools
 
(2) Core Sources
 > mkdir -p ~/android_core
> wstool init -j4 ~/android_core/src https://raw.github.com/rosjava/rosjava/kinetic/android_core.rosinstall
> source /opt/ros/kinetic/setup.bash
> # You only need to do the next step if you opted for a source installation of rosjava:
> source ~/rosjava/devel/setup.bash //rosjava를 미리 설치한 사람만 실행할 것.
> cd ~/android_core
> catkin_make // ***이쯤에서 실행이 안 될 경우, 
***~/android_core/src/android_extras폴더를 삭제 혹은 ~/으로 이동 시킨 후 다시 catkin_make를 실행해보자.

(3)Your Own Sources
workspace를 두개로 나눈다. 하나는 완전히 자바 workspace 그리고 다른 하나는 java workspace에서 네 작업을 늦추지 않기 위한 android workspace.
(자바에서 하는 building/testing는 ros연결이 안드로이드로 연결하는 것보다 훨씬 쉽다.)

> sudo apt-get install ros-kinetic-rosjava-build-tools ros-kinetic-genjava
 
 > mkdir -p ~/myjava
 
 > wstool init -j4 ~/myjava/src my_java_sources.rosinstall
 > wstool init ~/myjava/src // 아직 rosinstalls 하지 않았다면
 
 > mkdir -p ~/myandroid
 
 > wstool init -j4 ~/myandroid/src my_android_sources.rosinstall
 > wstool init ~/myandroid/src // 아직 rosinstalls 하지 않았다면
 
 
 > source /opt/ros/kinetic/setup.bash
 
 > cd ~/myjava; catkin_make
 
 > source ~/myjava/devel/setup.bash
 
 > cd ~/myandroid; catkin_make


(4) Testing

pc :
In a first shell

> source /opt/ros/kinetic/setup.bash
# Set ROS_IP with your pc's ip
> export ROS_IP=192.168.1.101 //본인의 ip로 바꿀 것!
> roscore
 
 
아랫쪽을 보면 ROS_MASTER_URI=http://192.168.25.62:11311/로 바뀐다는 것을 알 수 있다.
만약 이것이 export해도 바뀌지 않는다면, .bashrc에 강제로 선언이 되어 있는 경우도 있으니
> vi .bashrc
에서 ROS_MASTER_URI설정을 없애던가 강제적으로 적어 넣어준다.
export ROS_MASTER_URI=http://192.168.25.62:11311
export ROS_IP=192.168.25.62 //참고로, ROS_HOSTNAME이나 ROS_IP 둘 중 하나만 써주면 된다.
 
In a second shell
 
> sudo apt-get install ros-kinetic-image-view ros-kinetic-rqt-image-view ros-kinetic-image-transport-plugins
> source /opt/ros/kinetic/setup.bash
# Set ROS_IP with your pc's ip
> export ROS_IP=192.168.1.101 //본인의 ip로 바꿀 것! 만약, 위에서 .bashrc에 직접 적었다면 다시 설정 해 줄 필요가 없다.
 > rqt_image_view
# OR
> rosrun image_view image_view image:=/camera/image _image_transport:=compressed

자세한 ROS_IP에 대한 정보는 ?
http://wiki.ros.org/ROS/NetworkSetup#Setting_a_name_explicitly

Android

> source ~/android_core/devel/setup.bash
> /opt/android-studio/bin/studio.sh // Android 실행 studio.sh
 
- File >  New > Import Project
 ~/android_core/src/android_core를 import한다.
 
- phone을 pc에 연결시켜서 실행하도록 한다.
 
본인이 중간에 일어난 오류 사항에 대해서만 작성하도록 하겠다. 중간에 다른 오류 사항이 일어날 수 있지만,
차근차근 오류를 검색하여 수정하도록 하자.
 
실행 시 일어나는 오류,
  
!!! error while loading shared libraries: libopencv_core.so.2.4: 
cannot open shared object file: No such file or directory
 
 File > Settings > Build,Execution,Deployment > InstantRun > check Boxes 모두 해제!
 
 Build > Clean Project
 Build > Rebuild Project 하면 문제가 해결된다.


기본 화면
본인이 ros core를 연결할 때 사용한 ip를 적어준다.

 advanced options를 wifi가 공유되는 상황에서 설정
New Private Master -> Hz화면이 뜬다.

 advanced options를 wifi가 공유되지 않는 상황에서 설정
New Private Master -> 오류 발생 -> 강제 종료


 <Ros 화면>


 

이렇게 돌아가긴 하는데 정말 이게 프로그램이 작동한 것일까? 하는 의문이 드니,
ros_graph를 실행시켜보자.

In a third shell
>rqt_graph
 정상적으로 작동한다는 것을 알 수 있다. 왜냐하면, 모바일 상의 앱을 종료하였을 때 roscore가 켜져 있음에도 어떤 토픽도 존재하지 않는 화면이 나타나기 때문에 roscore에서 정상적으로 연결이 되었음을 확인 할 수 있었다.

결론 : 솔직히 이 프로그램이 정확히 무엇을 위한 프로그램인지 아직 정확히 파악하진 못했음.
하지만, ros 자체가 android에 올라가서 돌아간다는 점. 그리고 ros와 android간의 연결이 ip로 연결한다는 점을 짚고 넘어갈 수 있음.