Priceless
[ROS1] ROS 원격 노드 통신 본문
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 |