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
- 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
'엔지니어링 > 임베디드' 카테고리의 다른 글
Ubuntu 22.04에 ROS2 humble 설치하기 (0) | 2025.01.12 |
---|---|
[ STM32 ] VS Code로 Nuttx OS 빌드 및 디버깅 환경설정하기 (0) | 2023.05.07 |
[ STM32 ] STM32F4보드에 NuttxOS 설치하기 (0) | 2023.05.07 |
NuttX OS 알아보기 (0) | 2023.03.16 |
Docker로 Ubuntu 18.04 + ROS melodic 개발환경 구축 (0) | 2022.01.08 |
댓글