Priceless

[ROS1] ROS 원격 노드 통신 본문

ROS1 & ROS2

[ROS1] ROS 원격 노드 통신

Hyun__ 2023. 10. 15. 18:08

ROS에서 노드 간 원격 통신

ROS에서 노드 간 서로 통신하면서 협업한다

노드는 OS의 도움을 받아 하드웨어 장치를 제어하고, 노드들은 마스터의 도움을 받아 메시지를 주고 받는다

다른 디바이스 사이에서 네트워크로 통신한다(TCP/UDP)

통신 프로토콜

- XMLRPC 프로토콜: 노드들이 마스터와 통신할 때 사용한다

- TCPROS 프로토콜: 각 노드간 통신할 때 사용한다

원격 통신 예제 구동

구성

여러 publisher 노드가 teleop key를 발행하고

다른 하드웨어에서 master core를 실행하고 subscribe한다

호스트 PC

turtle_teleop_key

다른 디바이스

turtlesim_node

환경 설정

IP 주소 설정 

~/.bashrc을 수정한다

가장 아래에 내용을 추가한다

...
alias cm='cd ~/xycar_ws && catkin_make' 
source /opt/ros/<version>/setup.bash 
source ~/<workspace>/devel/setup.bash
export ROS_MASTER_URI=http://# 다른 하드웨어의 IP 주소
export ROS_HOSTNAME=# 호스트 PC의 IP 주소

이후 수정한 내용을 반영하기 위해 명령어를 입력한다

source .bashrc

 

새로운 터미널에서 원격 통신이 가능한지 확인한다

rosrun turtlesim turtle_teleop_key

# 다른 터미널에서
rostopic list
rosnode info /turtlesim
rostopic info /turtlesim
rostopic echo /turtle1/cmd_vel
rqt_graph

 

원격 통신 환경 구축

원격지 통신 구성

다른 장소에 있는 공유기에 접근하기 위해서는 포트 포워딩이 필요하다

장소 A

- 공유기 1: student에 DMZ 설정

- Student PC

장소 B

- 공유기 2: Teacher에 대해 1024~65000범위 포트 포워딩, 고유한 포트 번호를 가진다

- Teacher PC: 다른 하드웨어, 사설 포트 번호를 가진다

 

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

1단계: 공유기 설정

공유기의 포트 포워드를 설정한다

공유기 제조사 별로 매뉴얼을 보고 설정한다

포트 포워딩 설정할 때 포트 범위를 1024~65000으로 한다

 

혹은 DMZ를 설정할 수 있다

DMZ: 공유기의 모든 포트를 사설 IP에 포트 포워딩하는 방법

 

2단계: IP 환경 설정

- student

/etc/hosts 파일을 열어 아래줄을 추가한다

 

# remote network: Portable ISP router
사설 IP     student의 hostname(local) # operator의 사설 IP
Teacher의 공인 IP    Teacher의 hostname # xycar의 공용 IP

 

- teacher

/etc/hosts 파일을 열어 아래줄을 추가한다

# remote network : Portable ISP router
xycar의 사설 IP    xycar # xycar의 사설 IP
student의 공인 IP student의 hostname # Operator의 공용 IP

3단계: ROS 환경변수 세팅

ROS 마스터는 네트워크 내에서 하나만 실행되어야 한다

student의 관점에서 roscore가 실행되고 있는 teacher 컴퓨터의 공인 IP 주소가 필요하다

teacher에게 공유기의 공용 IP를 받아와야한다

 

ROS 환경변수 설정을 위해 ~/.bashrc 파일을 열어

ROS_HOSTNAME 환경 변수 추가 명령어를 주석 처리 한다

(/etc/hosts 파일에서 설정을 마쳤기 때문이다)

 

4단계: 제대로 설정되었는지 테스트 

반대 방향으로도 전송이 가능하다

 

Student(pub)

토픽은 /chatter, 전송 데이터는 hello이다

rostopic pub /chatter std_msgs/String hello

 

Teacher(Sub)

rostopic echo /chatter

 

 

원격 통신 프로그래밍

노드 간 원격 통신 구성

두 노드가 서로 publisher와 subscriber가 되어 토픽을 주고 받는다

커스텀 메시지 구성

파이썬에서 

from <msg file name> import <msg file folder>

를 통해 커스텀 메시지를 사용할 수 있다

 

my_msg.msg

string first_name
string last_name
int32 age
int32 score
string phone_number
int32 id_number

 

.py

from msg_send.msg import my_msg # 메시지 호출

msg = my_msg()

msg.first_name = "Gildong"
msg.last_name = "Cho"
msg.age = 23
msg.score = 100
msg.id_number = 2020
msg.phone_number = "010-1234-4321"

pub.publish(msg) # publish

 

원격통신 환경

서로가 publisher와 subscriber 노드가 될 수 있다

다른 하드웨어에서 roscore 실행

 

실습문제 1

학생이 msg를 전달하고 강사가 출력

한 번만 발행한다

다른 하드웨어가 수신한다

 

실습문제2

받은 메시지 중 이름을 다시 보내 학생이 출력하는 문제

학생이 개인 정보들을 보낸다

이후 강사로부터 문자열을 받아 출력한다

'ROS1 & ROS2' 카테고리의 다른 글

[ROS1] Xycar ROS 패키지  (0) 2023.11.07
[ROS1] ROS 노드 통신 프로그래밍 실습  (0) 2023.11.07
[ROS1] ROS 커스텀 메시지  (1) 2023.10.11
[ROS1] ROS1 노드 통신 (1대1 ~ N대N)  (1) 2023.10.09
[ROS1] ROS1 launch  (0) 2023.10.08