메세지 통신 프로그래밍
ROS 메세지 통신의 종류는 토픽, 서비스, 액션, 파라미터이다. 이번 주차에서는 각 메세지 통신을 위한 기본 프로그래밍에 대해서 실습을 해보았다.
1. Topic
topic은 단방향 통신으로, publisher node와 subscirber node가 있다.
1) 패키지 생성
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp
패키지의 이름과 의존성 패키지들을 같이 작성하여 패키지를 생성할 수 있다.
2) 패키지 설정 파일 수정
packge.xml 파일은 패키지 정보를 담은 파일로, 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술하고 있다. 아래와 같은 명령을 이용하여 파일을 수정할 수 있다.
$gedit package.xml
3) 빌드 설정 파일 수정
CMakeList.txt 파일은 빌드 설정 파일로, 노드를 빌드할 때 사용되는 옵션들을 지정한다. 여기에서는 요구되는 CMake의 최소버전, 메세지 선언, 각 노드에 대한 빌드 옵션 등에 대한 내용이 있다. 아래와 같은 명령어를 작성하여 수정할 수 있다.
$gedit CMakeList.txt
4) 메세지 파일 작성
아래와 같은 명령을 작성하여 메세지를 작성할 수 있다.
$ mkdir msg
$ cd msg
$ gedit MsgTutorial.msg
5) 퍼블리셔 노드 작성
$ cd src
$ gedit topic_publisher.cpp
위의 명령을 작성 후, 코드를 작성햐면 된다. 코드에 포함되는 내용은 ROS 기본 헤더파일, 메세지 파일 헤더, 노드 메일 함수 등이다. 메인 함수 내에서 노드를 초기화 하는 과정과 퍼블리셔로의 선언을 할 수 있다.
또한 ROS에서는 printf 문을 사용하지 않는데, ROS_INFO 등과 같은 로그 출력 매크로가 이를 대신한다. 이를 통해 중요도에 따른 구분과 분석, 디버깅 등이 용이하게 된다.
6) 서브스크라이버 노드 작성
$ roscd ros_tutorials_topic/src
$ gedit topic_subscriber.cpp
와 같은 명령을 작성하여 서브스크라이버 노드를 작성할 수 있다. 여기에서 'roscd' 를 사용했는데, 이는 경로를 입력하지 않고 패키지 이름을 입력함으로써 해당 디렉토리로 이동할 수 있는 명령어이다. 아래의 사진은 서브스크라이버 노드 코드이다.
7) ROS 노드 빌드
$ cd ~/catkin_ws
$ catkin_make
를 통해서 노드를 빌드할 수 있다. 빌드의 결과물은 /catkin_ws의 /build (캐킨 빌드에서 사용된 설정 내용)와 /devel (실행파일, 메세지 파일로부터 자동 생성된 메세지 헤더 파일) 폴더에 생성된다.
8) 퍼블리셔, 서브스크라이버 실행
노드 실행 명령어인 rosrun을 사용하여 퍼블리셔 노드와 서브스크라이버 노드를 실행한다. 각 노드를 실행하기 전에 roscore 실행하여 장을 열어주어야 한다.
$ rosrun ros_tutorials_topic topic_publisher
$ rosrun ros_tutorials_topic topic_subscriber
위 명령어를 입력하여 노드를 실행시켰으면
$ rostopic list
를 사용하여 현재 사용 중인 토픽 목록, 주기, 데이터 대역폭, 내용 확인 등이 가능하다.
9) 실행된 노드들의 통신 상태 확인
$ rqt_graph
를 사용하여 실행된 노드들의 통신 상태를 확인할 수 있다.
2. Service
1) 서비스는 일회성 양방향 통신으로, service server, service client 가 있다. 토픽의 경우와 비슷한 과정으로 파일을 작성할 수 있다.
2) 서비스 파일의 경우 메세지를 작성할 때 서비스 요청과 응답을 구분하는 구분자인 '---'를 작성해준다.
int64 a
int64 b
---
int64 result
와 같이 구분자를 사용하여 작성해준다.
3) 서비스 통신 방식의 경우 rqt_graph를 사용할 수 없다. 일회성 통신이기 때문이다.
4) 서비스 요청의 경우 서비스 클라이언트 노드를 실행할 수도 있지만 아래와 같은 방식으로도 가능하다.
1> 'rosservice call' 명령어
'rosservice call/ros_tutorial_srv 10 2' 와 같은 방식으로 명령어를 작성할 수 있다.
2> rqt의 ServiceCaller
$ rqt
를 통해 rqt를 실행하고, 'Plugins -> Service -> Service Caller' 를 선택하여 service에 원하는 서비스를 선택한다. 그 후 원하는 값을 대입하여 'call' 버튼을 눌러서 원하는 원하는 요청값을 받을 수 있다.
하나의 노드는 복수의 퍼블리셔, 서브스크라이버, 서버, 클라이언트로의 역할을 할 수 있다.
3. Parameter
파라미터는 integer, floats, boolean,string, dictionaries, list 등으로 설정할 수 있다. 이번 실습은 서비스 서버와 클라이언트 소스코드를 수정하여 진행하였는데, 이를 통해 파라미터 값이 변경이 되면 같은 서비스 요청에 대한 서비스 처리가 달라짐을 확인할 수 있다.
현재 네트워크에서 사용된 파라미터의 목록을 확인하기 위해서는 'rosparam list' 명령어를 사용하여 확인할 수 있다.
roslaunch
1) rosrun 은 하나의 노드를 실행하는 명령어, roslaunch는 하나 이상의 정해진 노드를 실행시킬 수 있는 명령어이다.
2) roslaunch는 노드를 실행할 때 패키지의 매개변수나 노드 이름 변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 환경 변수 변경 등의 옵션을 붙일 수 있는 명령어이다.
3) *.launch 파일을 사용하여 실행 노드를 설정한다. 이는 xml 기반이며, 태그별 옵션을 제공한다.
4) roslaunch를 실행하기 위한 명령어는 'roslauch [패키지명] [roslaunch 파일]' 이다.
roslaunch 의 사용
1) launch 파일 작성하기
$ roscd ros_tutorials_topic
$ mkdir launch
$ cd launch
$gedit union.launch
명령어 입력 후 내용을 작성하면 된다. 이 안에는 roslaunch 명령어로 노드를 실행할 때 필요한 태그들에 대한 내용이 있다. <node>는 roslaunch로 실행할 노드를 기술하며 옵션으로는 pkg(패키지 이름), type(실제 실행할 노드의 이름), name(이 type에 해당하는 노드가 실행될 때 붙여지는 이름. 일반적으로는 type과 같지만 필요에 따라 실행할 때 이름을 변경하도록 설정할 수 있다.) 이 있다.
2) 작성한 launch 파일 실행하기
$ roslaunch ros_tutorials_topic union.launch --screen
과 같은명령어를 작성하여 union.launch를 실행할 수 있다. 이때 --screen 옵션을 추가하면 해당 터미널에 실행되는 모든 노드의 출력들이 터미널 스크린에 표시된다. 이 옵션이 없으면 실행되는 노드들의 출력이 터미널 스크린에 표시되지 않아서 디버깅하기 어려워진다.
3) launch 태그의 종류
'FOSCAR-(Autonomous Driving) > ROS 스터디' 카테고리의 다른 글
[2025 ROS 스터디] 황희찬 #3주차 - ROS 기본 프로그래밍 (0) | 2025.01.31 |
---|---|
[2025 ROS 스터디] 이영상 #3주차- ROS 기본 프로그래밍 (0) | 2025.01.31 |
[2025 ROS 스터디] 이승찬 #3주차 - ROS 기본 프로그래밍 (0) | 2025.01.31 |
[2025 ROS 스터디] 홍동형 #3주차-ROS 기본 프로그래밍 (0) | 2025.01.31 |
[2025 ROS 스터디] 이호휘 #3주차-ROS 기본 프로그래밍 (0) | 2025.01.28 |