본문 바로가기

FOSCAR-(Autonomous Driving)/ROS 스터디

[2025 ROS 스터디] 신채영 #3주차 - ROS 메세지 통신 프로그래밍, roslaunch

반응형

메세지 통신 프로그래밍

 

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 태그의 종류

반응형