2017년 4월 15일 토요일

#Python + #Java socket. 파이썬+자바 소켓 파일 전송(이미지 전송)

-----------------------------------------------------------------------------------------------------------
imageServer.py
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env python
# -*- coding:utf8 -*-
import socket
import os
import sys
HOST = 'localhost'
PORT = 5000
ADDR = (HOST,PORT)
BUFSIZE = 4096
videofile = "../Pictures/desert.png"
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
filename = "i.png"
#Bind Socket
serv.bind(ADDR)
serv.listen(5)
conn, addr = serv.accept()
print 'client connected ... ', addr
#Open the file
#Read and then Send to Client
f=open(filename,'rb')# open file as binary
data=f.read()
print data,',,,'
exx=conn.sendall(data)
print exx,'...'
f.flush()
f.close()
#Close the Socket 
print 'finished writing file'
conn.close()
serv.close()
cs

-----------------------------------------------------------------------------------------------------------
imageClient.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package sending;
/**
 * @author haei
 */
import java.io.*;
import java.net.Socket;
public class FileClient {
  
    private Socket s;
  
    public FileClient(String host, int port) {
        try {
            s = new Socket(host, port);
                        saveFile(s);
        } catch (Exception e) {
            e.printStackTrace();
        }      
    }
      
        private void saveFile(Socket clientSock) throws IOException
        {
                InputStream in = clientSock.getInputStream();
                //바이트 단위로 데이터를 읽는다, 외부로 부터 읽어들이는 역할을 담당
                BufferedInputStream bis = new BufferedInputStream(in);
                //파일을 읽는 경우라면,BufferedReader보다 BufferedInputStream이 더 적절하다.
                FileOutputStream fos = new FileOutputStream("testfile.png");
                //파일을 열어서 어떤식으로 저장할지 알려준다. FileOutputStream을 쓰면 들어오는 파일과 일치하게 파일을 작성해줄 수 있는 장점이 있다.
               
                int ch;
                while ( (ch = bis.read()) != -1) {
                    fos.write(ch);
                    //열린 파일시스템에 BufferedInputStream으로 외부로 부터 읽어들여온 파일을 FileOutputStream에 바로 써준다.
                }
        fos.close();
        in.close();
    }
  
    public static void main(String[] args) {
        FileClient fc = new FileClient("localhost"5000);
    }
}
cs

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

이 소스를 만들어내는데 많이 헤매서 생각보다 오래걸렸다.
어떻게 보면 간단한 생각이지만, 아직 내가 많이 부족한 관계로 이 간단한 소켓하나 작성하지 못하는 수준이였다.. 결국 물어물어서 해결한 문제지만, 해결이 되고나니 뿌듯하다.

파이썬-파이썬 /자바-자바 간의 소켓문제는 많이 존재하지만, 다른 언어사이의 예제가 생각보다 찾기가 어려웠다.

파이썬Server 와 자바Client간의 파일 전송을 작성한 예제이다.
처음에는 자바에서 인코딩문제인가?를 생각해서 Binary로 처리해야되나?라는 생각을 하게되었고 f=open(filename,'rb') 파일을 "ReadBinary"하고 있다.

두번째로는 BufferedInputStream이다. 자바에는 많은 처리 함수들이 존재하기 때문에 각자 어떤때에 쓰이는지 정리, 공부해두면 좋을 것같다는 생각이 들었다.

파일이 필요한 사람이 있을까봐 파일도 첨부 해 놓겠다.
java python

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의 이름을 바꾸는 작업을 실행해보았다.