본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/임베디드

ROS2 humble 학습하기

by 베니스상인 2025. 1. 12.

 

1. turtlesim 실행해보기

 

1) turtlesim 패키지 리스트 확인

$ ros2 pkg executables turtlesim

 

 

2) turtlesim 노드 실행

$ ros2 run turtlesim turtlesim_node

 

 

아래와 같이 거북이 시뮬레이션 창이 나타남

 

 

 

 

3) turtlesim 텔레키보드 실행

  • 새로운 터미널 창을 열어서 원격으로 node에 명령을 줄 수 있는 키보드를 실행함
$ ros2 run turtlesim turtle_teleop_key

 

 

 

키보드로 명령을 입력하면 명령에 따라 거북이가 이동하거나 회전하게됨

 

 

 

 

2. ROS 구조 파악하기

 

1) Node

  • 노드는 실행가는한 프로세스
  • 아래와 같이 현재 실행중인 노드를 확인할 수 있음
$ ros2 node list

 

 

  • 노드의 정보는 아래 명령어로 확인할 수 있음
$ ros2 node info /turtlesim

 

 

 

 

 

2) Topic

  • 토픽은 노드들간에 주고 받는 모든 연동 메시지
  • 아래와 같이 현재 실행중인 모든 토픽을 확인할 수 있음, -t 옵션을 사용하면 데이터 타입정보까지 함께 확인할 수 있음
$ ros2 topic list -t

 

 

  • rqt_graph를 이용하면 topic 관계를 확인할 수 있음
$ rqt_graph

 

  • Echo 명령을 사용하여 현재 Topic의 메시지 내용을 확인할 수 있음
$ ros2 topic echo /turtle1/cmd_vel

 

tele_op_key로 명령을 주었을때 cmd_vel 메시지 내용들이 전시됨

 

 

 

  • show 명령어는 구조체 타입을 보여줌
$ ros2 interface show geometry_msgs/msg/Twist

 

  • pub 명령어는 직접 topic 메시지 값을 입력하여 발행할 수 있음, -t 옵션으로 실행횟수 입력 가능, --rate로 주기 설정 가능
$ ros2 topic pub --rate 1 /turtle1/cmd_vel  geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.57 }}"

 

 

pub 명령의 옵션들은 아래 참고

 

 

주기적으로 발행되는 메시지에 대해 pose 값이 계속 변하고 있는 상태를 모니터링할 수 있음

$ ros2 topic echo /turtle1/pose

 

 

아래와 같이 주기 확인이 가능함(앞에서 터미널창에서 1주기로 반복하도록 pub 메시지를 발행했기 때문) 

$ ros2 topic hz /turtle1/cmd_vel

 

 

debug 옵션을 해제하면 cli창에서 pub 명령이 발행되어 나가는 것을 topic이 있음을 확인할 수 있음

 

 

3) Service

  • 특정시점에 특정 명령을 수행하는 것, 한번 수행하고 끝남
  • 서버와 클라이언트가 존재하며, 클라이언트에서 request를 요청하는 것에 한해서 수행됨
$ ros2 service list -t

 

  • find 명령어는 메시지 타입에 해당하는 서비스를 찾아줌
$ ros2 service find std_srvs/srv/Empty

 

 

  • service에서도 show 명령으로 구조체를 파악할 수 있음
  • ---의 윗 부부은 request에 대한 구조체이고, 아래쪽은 응답으로 반환되는 메시지 구조체
$ ros2 interface show turtlesim/srv/Spawn

 

 

  • call 명령으로 service를 호출할 수 있음
$ ros2 service call /clear std_srvs/srv/Empty

 

 

Spawn을 service로 call 한 경우, my_turtle을 응답으로 회신하고, turtle창에 새로운 my_turtle가 생성되었음

$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 1.57, name: 'my_turtle' }"

 

 

 

 

 

 

 

 

4) Action

  • 노드에서 실행가는한 action으로 분류한 명령, service와 비슷하나 목표치에 도달할때까지 반복적으로 수행 가능
  • 서버와 클라이언트가 존재함, 클라이언트가 요청하면 서버가 응답으로 publisher 해주고, 클라이언트가 subscriber가 됨
  • action은 클라이언트가 요청한 목표값, 그에 대한 결과, 응답 세가지로 메시지를 전달함
$ ros2 action list -t

 

 

  • action 명령어의 관계를 알고 싶을때 info 명령어 사용
$ ros2 action info /turtle1/rotate_absolute

 

 

  • show 명령어를 사용하여, 타입의 구조체를 확인할 수 있음
$ ros2 interface show turtlesim/action/RotateAbsolute

 

구조체의 첫번째는 클라이언트가 요청하는 목표값, 두번째는 결과, 세번째는 응답임

 

 

  • send_goal 명령을 이용하여 목표값을 설정하고 그 결과를 얻을 수 있음
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"

 

해당 명령을 실행하면 turtlesim이 시계방향으로 180도 회전후 delta(수행결과)값이 theta(목표)값에 도달하게 되면 아래와 같이 'Goal finished with status: SUCCEEDED' 메시지가 나타남

 

 

rqt를 사용하면 위 항목들을 GUI 상에서 확인할 수 있고 수정하여 명령을 보낼 수 있음

 

 

 

 

5) Parameters

  • 각 노드들이 가지고 있는 파라미터의 정보
  • list 명령어로 모든 파라미터 전시 가능
$ ros2 param list

 

 

 

  • 파라미터의 타입 및 값을 보려면 get 명령어 사용
$ ros2 param get /teleop_turtle scale_angular

 

  • 파라미터에 값을 변경하려면 set 명령어 사용, 명령어 사용과 동시에 적용됨
$ ros2 param set /turtlesim background_b 128

 

 

  • dump 명령어를 사용하여 노드의 파라미터 정보들을 전시
$ ros2 param dump /turtlesim

 

 

  • 경로를 지정하면 dump 명령어를 이용하여 파일로도 출력 가능
$ ros2 param dump --output-dir ~/workspace /turtlesim

 

 

  • 반대로 load 명령어를 사용하여 파일에서 불러와서 파라미터 값을 변경할 수 있음
$ ros2 param load /turtlesim ~/workspace/turtlesim.yaml

 

 

  • 노드를 실행할 때 argument를 사용하여 저장된 파라미터를 불러와 실행할 수 있음
$ ros2 run turtlesim turtlesim_node --ros-args --params-file ~/workspace/turtlesim.yaml

 

 

 

 

 

3. ROS 사용하기

 

1) launch

  • 여러개의 노드를 한번에 설정하고 실행하기 위한 script 프로그램
  • ROS1에서는 XML 타입의 launch 파일만 지원하였으나, ROS2에서는 python 타입도 함께 지원함
$ ros2 launch turtlesim multisim.launch.py

 

두개의 turtlesim 노드가 생성됨

 

 

생성된 topic list 확인

 

새로운 터미널창에서 turtlesim1에 명령을 publish함

$ ros2 topic pub --rate 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z:  1.57 }}"

 

다른 새로운 터미널창을 열어서 turtlesim2에 명령을 publish함

 

$ ros2 topic pub --rate 1 /turtlesim2/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z:  1.57 }}"

 

 

 

 

 


2) rosbag

  • topic을 데이터베이스에 기록후 파일로 저장하고, 재생할 수 있음
  • record 명령을 사용하여 지정된 topic을 저장, cntl+C로 종료할 수 있음
$ ros2 topic echo /turtlesim1/turtle1/cmd_vel

 

 

  • subse 옵션으로 다수의 topic 저장도 가능함
$ ros2 bag record -o subset /turtlesim1/turtle1/cmd_vel /turtlesim1/turtle1/pose

 

  • info 명령으로 상세한 정보를 확인할 수 있음
$ ros2 bag info rosbag2_2025_01_12-16_21_09/rosbag2_2025_01_12-16_21_09_0.db3

 

 

  • 재생은 play 명령을 사용함, 하위 폴더에 저장된 bag 데이터가 있어야 함
$ ros2 bag play rosbag2_2025_01_12-16_21_09/rosbag2_2025_01_12-16_21_09_0.db3

 

 

 

 

 

4. ROS 프로그래밍

 

1) 작업공간 생성

  • ROS 작업공간을 만들어줌
$ mkdir -p ros2_ws/src

 

  • src 폴더로 이동
$ cd ros2_ws/src

 

 

 

 

2) 예제코드 다운로드

 

  • github에서 turtlesim 예제코드를 다운받음, -b옵션은 humble branch로 선택
$ git clone https://github.com/ros/ros_tutorials.git -b humble

 

  • 종속성이 있는 파일들을 함께 설치함(설치시 workspace의 root 폴더에서 실행해야 함)
$ rosdep install -i --from-path src --rosdistro humble -y

 

3) 빌드

  • ROS2에서는 colcon 명령어를 사용하여 빌드 수행
  • --packages-up-to [패키지명]을 사용하면 해당 패키지만 빌드 수행
  • --event-handlers console_direct+ 옵션을 사용하면 로그 내역을 상세하게 콘솔에 보여줌
  • --symlink-install 옵션은 이전에 빌드한 패키지는 빌드하지 않음
$ colcon build --packages-up-to turtlesim --event-handlers console_direct+

 

 

  • overay 영역을 소싱해줌, 해당 방법은 일회성이며, 새로운 빌드가 될 때마다 수행해주어야 함, ~/.bashrc에 해당 내용을 삽입하면 bash가 실행될 때마다 자동으로 overay 영역을 소싱해줌
$ source install/local_setup.bash

 

 

4) 실행

  • ROS2 run 명령어를 이용하여 빌드한 node를 실행
$ ros2 run turtlesim turtlesim_node

 

728x90

댓글