Tnote

TIL - 03.03 본문

과거 자료들

TIL - 03.03

jfl 2022. 3. 4. 12:27

# ROS 노드간 통신

3

@통신 프로토콜 (TCP/IP 계열)

* TCP/IP : 인터넷접속, wifi, 광통신과 같이 무선으로 통신하는 것

XMLRPC 프로토콜 : 노드들이 마스터와 통신할 때 이용, 서버연결, URL 형식(https://192.s....)으로 되어있다.

TCPORS 프로토콜 : 각 노드간 통신할 때 이용

 

Q. 인터넷이 연결되어야 사용할 수 있는가?

A. 원격을 제외하고는, x 일듯

 

4

@하나의 장치에서 통신

노드 - 하드웨어 : 노드는 OS의 도움을 받아 하드웨어 제어

노드 - 노드 : 마스터의 도움을 받아 서로 메시지 주고 받음.

 

5,6

서로 다른 하드웨어끼리 원격 통신 : TCP/UDP, 네트워크 통신

단일 하드웨어 내부에서 통신도 반드시 네트워크로 통신

- 노드에게 전달하겠다.

- 외부든 내부든 상관없이 OS타고 wilfi로 간다.

- 내부에 전달한다는 걸 알면 다시 OS타고 내부로 돌아가서 노드에게 간다 ( 통일성을 위해서; ex. 택배 )

- 외부라면 wifi를 통해 TCP/UDP 다른 하드웨어로 연결

 

8

# ROS 원격 통신

소스코드가 변하는게 x -> 주변환경 세팅만 조금 바꾸면 된다.

 

*마스터의 주소는 모든 노드에게 공개되어 있기 때문에 노드들은 어떤 탐색과정없이 마스터에게 바로 연결가능하다.

 

9

원격 통신할 때, 나도 마스터키고, 피원격 컴퓨터도 돌리고 x

원격 통신할 때, 하나의 마스터만 돌리면 된다. (해당 마스터의 주소만 안다면, 설정을 통해 내 컴퓨터의 노드 정보를 원격으로 전달 가능.

 

10

한 컴퓨터에서 roscore, turtlesim_node, turtle_teleop_key를 모두 켜서 거북이 조종하는 것

A 컴퓨터에서 roscore, turtlesim_node 를 키고, B 컴퓨터에서 turtle_teleop_key를 켜서 거북이를 조종하는 것

=> 위 두 개는 동일한 작업이라고 생각할 것. 키보드로 거북이를 움직이는 노드를 다른 컴퓨터에서 킨 것 뿐이다.

=> 대신 이러면, B 컴퓨터가 A 컴퓨터에 실행된 roscore (마스터)와 연결될 수 있게 설정을 해줘야 한다.

 

11

위에서 설명한 B 컴퓨터가 A 컴퓨터에 실행된 roecore의 IP주소를 찾을 수 있게 설정해주기.

 - 용어

  ROS_MASTER_URL : 원격을 위해서 연결하고싶은 상대 roscore의 주소(ex. Xycar), URL 형식으로 되어있음.

  ROS_HOSTNAME : 내 IP 주소

 

 - 방법

  1) bash에 관한 txt 열기 /  sudo gedit ~/.bashrc 

  2) bashrc 내용 수정  

  상대방의 컴퓨터와 연결하고 싶을 때 / export ROS_MASTER_URI=상대 IP 주소

  내 컴퓨터 IP 주소를 알려줄 때 : ifconfig 명령으로 IP주소 알려주기.

  3) 저장

  4) 수정한 내용을 시스템에 반영 / source .bashrc

 

14

위 방법의 원격 통신에 문제가 발생했을 때 해결방법

- 컴퓨터-자동차 원격 연결

  PC -> 우리집 공유기 -> 인터넷 -> 실습실 공유기 -> 자동차

 

- IP  

  사설 IP: 하나의 컴퓨터, 기기 내에서만 유효한 IP, 중복가능

  공인 IP: 전 세계에 유일한 IP

 

- 포트 포워딩

  사설 IP를 가지고 있는 여러장치를 "포트 포워딩"을 이용하여 연결, 연결방법중 하나

 

17

네트워크 환경설정 작업순서

(1) 공유기 포트 포워드 설정

(2) /etc/hosts 파일 수정

(3) ROS 환경변수 설정

(4) 실행 테스트

 

18

공유기 포트 포워드 설정

*DMZ : 포트 포워드 설정하는 방법 중 하나

*DMZ : 공유기의 모든 포트를 특정 사설 IP에 포트 포워딩 하는 것.

 

1) 포트 포워딩 세팅 (공유기 설정)

  고급 설정 > NAT/라우터 관리 > 포트포워드 설정 > ros > 외부, 내부 포트 > 1024 ~ 65000로 설정.

  or

  고급설정 > 고급 NAT 설정 > DMZ/Twin-IP

 

2) /etc/hosts 파일 수정 (내 컴퓨터 설정)

  편집기로 /etc/hosts 파일 열고 gedit /etc/hosts

  원격으로 연결할 컴퓨터의 공인 IP, Hostname 작성 (21p)

 

3) /etc/hosts 파일 수정 (원격하고자 하는 컴퓨터 설정)

  편집기로 /etc/hosts 파일 열고 gedit /etc/hosts

  내 컴퓨터 공인 IP, Hostname 작성 (21p)

*터미널 bash 앞에 있는 이름, 만약 모르겠으면 hostname 명령어 입력

4) ROS 환경변수 세팅 (ROS_MASTER_URI, ROS_HOSTNAME)

  "A -> B(roscore)" 연결을 위해, A는 B에게 B가 가지고 있는 IP주소를 달라고 요청

  gedit ~/.bashrc

  export ROS_HOSTNAME=localhost를 주석처리 (A, B 모두)

  A: export ROS_MASTER_URI=http://B의 공유기 주소:11311

  B: export ROS_MASTER_URI=http://B의 사설 IP 주소:11311

 

5) 테스트

  A : rostopic pub /chatter std_msgs/String hello

  B : rostopic echo /chatter

  => B의 터미널에 data: 'hello' 라는 결과가 뜨면 연결된거임.

*publish 명령어 : rostopic pub <토픽명> <메시지타입> <값>

*토픽의 값 출력: rostopic echo <토픽명> 

28~

원격으로 메시지 주고 받기

 

 

'과거 자료들' 카테고리의 다른 글

TIL - 03.14  (0) 2022.03.14
TIL - 03.04  (0) 2022.03.04
TIL - 03.01  (0) 2022.03.02
TIL - 02.28  (0) 2022.02.28
TIL - 02.22~02.25  (0) 2022.02.27