ROS2 스터디 중 기록해두고 싶은 내용 위주로 적어보았습니다.
참고 자료 : 표윤석박사님의 ROS 2로 시작하는 로봇 프로그래밍 (https://cafe.naver.com/openrt/24070)
목차
> 014 ROS 2 도구와 CLI 명령어
앞서 '005 ROS 1과 2의 차이점을 통해 알아보는 ROS 2의 특징'을 살펴보았었는데,
이 중 가장 중요한 ROS2의 특징을 선정하자면, 로봇 개발에 필요한 다양한 개발 도구가 있다는 것이다.
ROS의 도구들은 커뮤니티 내 여러 의견과 경험을 담은 필수 도구들로,
코드를 쉽게 빌드/패키징하고, 패키지와 노드를 관리하고, 데이터들을 기록/재생/관리하고,
CLI/GUI 형태의 프로그램을 만들고, 3차원 시뮬레이터 안에서 자유자재로 디버깅/테스트가 가능했다.
또한, 이러한 툴을 이용하는 것 뿐만 아니라, 이 툴을 기반으로 개선 또는 신규 툴 자성이 가능하기 때문에 로봇 개발의 효율성 향상에 크게 도움을 주고 있다.
ROS 도구는 형태에 따라 4가지로 분류할 수 있다.
1. CLI 형태의 Command-Line Tools
2. GUI 형태의 RQT
3. 3차원 시각화툴 RViz
4. 3차원 시뮬레이터 Gazebo
각 사용법 및 응용방법은 앞서 일부 다뤘으므로, 하나씩 실습을 통해 익혀보겠다.
1. CLI (Command Line Interface)기반 Command-Line Tools
* CLI : 텍스트 터미널을 통해 사용자와 컴퓨터가 빠르게 상호작용하는 방식으로, 키보드 등을 통해 문자열 형태로 입력하면, 컴퓨터로부터의 출력 또한 문자열 형태로 주어진다.
터미널에서 명령어 기반의 툴로 로봇 액세스 및 거의 모든 ROS 기능을 다룬다.
- 개발환경 및 빌드, 테스트 툴(colcon) / 데이터를 기록, 재생, 관리하는 툴(ros2bag) 등
- colcon, ros2bag 외 20여 가지 (아래 참고)
> action
> bag
> component
> daemon
> doctor
> extension_points
> extensions
> interface
> launch
> lifecycle
> multicast
> node
> param
> pkg
> run
> security
> service
> topic
> wtf
* ROS 2 CLI 사용 방법
// ros1의 경우
$ rosrun
$ roslaunch
$ rostopic list
$ rosparam
$ ros2 [verbs] [sub-verbs] [options] [arguments]
//네임스페이스 및 리매핑 기능 개선으로 더 유연한 토픽 및 서비스 관리 가능
$ ros2 run <pakage_name> <executable_name> --ros-args --remap __ns:=/my_namespace
$ ros2 launch <package_name> <launch_file.py>
$ ros2 topic list
$ ros2 param set <node_name> <param_name> <value> //런타임 동안 동적 파라미터 설정 및 변경 지원
[verbs] : 특정 툴 선택 : `run`, `launch`, `node`
[sub-verbs] : 예: `node`인 경우 `info`, `list`
[options / argumnets] : 선택적으로 옵션 및 매개변수 입력하여 특정 명령 수행
자동 완성 키
$ ros2 [tab] [tab] [tab] [tab] ...
사용 방법 안내
$ ros2 -h
$ ros2 node -h
$ ros2 node info -h
더 자세한 실습 : 043 ROS2CLI ( https://cafe.naver.com/openrt/24884 )
2. GUI 기반 RQT
대표적으로 잘 사용하는 rqt_graph를 떠올리면 된다.
- 그래픽 인터페이스 개발을 위한 Qt 기반 프레임워크 제공
- 노드와 그들 사이의 연결 정보 표시(rqt_graph)
- 속도, 전압 또는 시간이 지남에 따라 변화하는 데이터를 플로팅(rqt_plot)
- rqt_graph, rqt_plot 외 30여 가지
3. RViz
- 3차원 시각화툴
- 레이저, 카메라 등의 센서 데이터를 시각화
- 로봇 외형과 계획된 동작을 표현
4. Gazebo
- 3차원 시뮬레이터
- 물리 엔진을 탑재, 로봇, 센서, 환경 모델 등을 지원
- 타 시뮬레이터 대비 ROS와의 높은 호환성
> 015 ROS의 종합 GUI 툴 RQt
$ sudo apt install ros-foxy-rqt*
(+) rqt에서 숫자 변경하려고 키보드 누르니 인코딩 문제가 있었다. 이는 방향키를 ASCII로 인식되서 생기는 문제라고 한다.
해결 방법
sudo apt-get update
sudo apt-get install vim
vim ~/.vimrc
set number " line 번호 표시
set tabstop=4 " tab을 4칸 공백으로 설정
set ignorecase " 검색 시 대소문자 구별 안함
set hlsearch " 검색 시 하이라이트로 표시
set nocompatible " 방향키로 이동
set fileencodings=utf-8,euc-kr " 파일 저장시 인코딩 형식 : utf-8, euc-kr
set fencs=ucs-bom,utf-8,euc-kr " 한글 파일은 euc-kr, 유니코드는 utf-8
set bs=indent,eol,start " backspace 사용가능
set ruler " 상태 표시줄에 커서 위치 표시
set title " 제목 표시
set showmatch " 매칭되는 괄호 표시
syntax on " 문법 하이라이트
RQt 실습 영상
Message Publisher
Service Caller
Parameter Reconfigure
Plot
Image View
Console
> 016 ROS 2 인터페이스 (interface)
노드 간 데이터를 주고 받을 때 토픽, 서비스, 액션이 사용되는데
이 때 데이터의 형태를 ROS 2 인터페이스라고 한다.
기존 ROS1과 동일한 토픽(msg), 서비스(srv), 액션(action) interface와 함께,
이를 단순화하는 인터페이스 정의 언어 IDL(interface definition language)가 있다.
DDS에서는 IDL를 사용해 메세지 정의 및 직렬화를 더 쉽게, 포괄적으로 다룰 수 있다.
정수, 부동 소수점, 불리언과 같은 단순 자료형을 기본으로 하여
https://github.com/ros2/common_interfaces/tree/foxy/std_msgs
메세지 안에 메시지를 품고 있는 간단한 데이터 구조,
예) geometry_msgs/msgs/Twist의 'Vector3 linear'
https://github.com/ros2/common_interfaces/blob/foxy/geometry_msgs/msg/Twist.msg
https://github.com/ros2/common_interfaces/blob/foxy/geometry_msgs/msg/Vector3.msg
메세지들이 나열된 배열과 같은 구조
예) sensor_msgs/msgs/LaserScan의 'float32[] ranges'
https://github.com/ros2/common_interfaces/blob/foxy/sensor_msgs/msg/LaserScan.msg
도 사용할 수 있다.
실제로 인터페이스를 만든다고 한다면 아래와 같은 절차로 진행되는 것으로 이해했다.
‘.msg’, ‘.srv’, ‘.action’ 파일 작성 → 'CMakeLists.txt’, ‘package.xml’에서 인터페이스 등록 → colcon 빌드 시스템으로 '.idl’ 파일 변환 → ‘.idl’ 파일 기반으로 각 언어에서 사용 가능한 코드 생성 |
메세지 선언 방법
fieldtype1 fieldname1
fieldtype2 fieldname2
fieldtype3 fieldname3
1. 메세지 인터페이스 (토픽, msg)
이전에 살펴본 turtlesim 패키지에서 '/turtle1/cmd_vel' 토픽을 예시로 보자.
'/turtle1/cmd_vel' 토픽은 geometry_msgs 패키지의 / msgs 분류의 / Twist 데이터 형태이다.
이 Twist는 Vector3 형태의 linear라는 메시지와, Vector3 형태의 angular라는 메시지가 있으며,
Vector3은 float64 형태의 x, y, z 값이 존재한다.
즉, geometry_msgs/msgs/Twist 메시지 형태는 float64 자료형의 linear.x, linear.y, linear.z, angular.x, angular.y, angular.z 라는 이름의 메시지인 것이다. 이를 통해 병진 속도 3개, 회전 속도 3개를 표현할 수 있게 된다.
메시지는 linear / angular 성분으로 나뉘어 자유 공간에서의 속도를 표현한다는 의미
$ ros2 interface list
Messages:
action_msgs/msg/GoalInfo
action_msgs/msg/GoalStatus
action_msgs/msg/GoalStatusArray
(생략)
Services:
action_msgs/srv/CancelGoal
composition_interfaces/srv/ListNodes
(생략)
Actions:
action_tutorials_interfaces/action/Fibonacci
example_interfaces/action/Fibonacc
(생략)
2. 서비스 인터페이스 (서비스, srv)
메시지 인터페이스의 확장형이라 볼 수 있는데, /spawn
'---' 구분자를 사용해, 서비스 요청(Request)와 서비스 응답(Response)를 나누어 표현한다.
서비스 서버단은 지정된 서비스를 수행하고, name 데이터를 서비스 클라이언트단에 전송하게 된다.
3. 액션 인터페이스 (액션)
메시지 및 서비스 인터페이스의 확장형으로 볼 수 있다.
'---' 구분자를 사용해, 액션 목표(goal), 액션 결과(result), 액션 피드백(feedback)으로 나누어 사용하게 된다.
(각 데이터는 각도의 SI 단위인 라디안(radian)을 사용함)
(+) 인터페이스 만들기
위의 링크를 참고하여 자료형 매칭을 파악하고, 인터페이스 작성
인터페이스 작성 예시
https://www.robotstory.co.kr/king/?board_page=3&vid=891#google_vignette
4. IDL 생성을 위한 'CMakeLists.txt', 'package.xml' 수정
package.xml 수정
# 인터페이스 전용 패키지에서 빌드시 IDL 생성에 필요한
<buildtool_depend>rosidl_default_generators</buildtool_depend>
# 의존성 추가
<exec_depend>builtin_interfaces</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
CMakeList 수정
find_package(ament_cmake REQUIRED)
find_package(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
################################################################################
# Declare ROS messages, services and actions
################################################################################
set(msg_files
"msg/ArithmeticArgument.msg"
)
set(srv_files
"srv/ArithmeticOperator.srv"
)
set(action_files
"action/ArithmeticChecker.action"
)
# 인터페이스 정의
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
${srv_files}
${action_files}
DEPENDENCIES builtin_interfaces
)
ament_export_dependencies(rosidl_default_runtime)
> 017 ROS 2의 물리량 표준 단위
앞서 본 인터페이스는 어떤 '이름'과 '자료형'으로 데이터를 보내느냐가 기술되어 있다.
이때, 각자 생각하는 단위가 다르다면 개발자와 사용자 간의 불편 및 버그로 이어질 수 있다.
단위 변환 프로그램을 추가로 넣을 수도 있지만, 이는 불필요한 계산이 발생한다.
ROS 에서의 표준 단위는 SI 단위 (7개)와 SI 유도 단위 (20개)를 표준 단위로 지정.
> 018 ROS 2의 좌표 표현
예를 들어 카메라의 경우, 컴퓨터 비전에선 널리 z forward, x right, y down를 기본 좌표계로 사용하는데, 로봇은 x forward, y left, z up를 기본 좌표계로 사용한다.
이외에 LiDAR, IMU, Torque 센서들도 제조사별로 서로 다른 좌표계를 사용할 수 있고,
좌표 변환 API가 있더라도 기본 출력이 무엇인가 미리 알아볼 필요가 있다.
IMU가 NED 타입(x north, y east, z down, relative magnetic north)인지 ENU 타입(x-east, y-north, z-up, relative to magnetic north)이냐를 잘 살펴봐야하고
각 센서 값을 사용하기 전에 각 센서들의 좌표를 로봇 좌표에 맞추어 적절한 좌표 변환이 필요하다.
1) 기본 3축과 정회전 방향
2) ENU(East-North-Up) 좌표
특정 지리적 위치를 단거리 데카르트 표현(지구 곡률을 무시할 정도로 작은 범위에서 평면 좌표계를 사용)
실내보다 비교적 큰 맵을 다루는 드론, 실외 자율주행 로봇의 경우, 지리적 위치를 로컬 ENU 좌표계를 사용
East - X축 방향
North - Y축 방향
Up - Z축 방향
3) 접미사 프레임 사용 (Suffix Frames)
3-1) `_optical` 접미사
컴퓨터 비전 분야의 경우, 카메라 좌표계로 많이 사용되는 z forward, x right, y down를 사용하게 되는데 이럴 경우에는 카메라 센서의 메시지에 `_optical` 접미사를 붙여 구분한다. 이때에는 z forward, x right, y down의 카메라 좌표계와 x forward, y left, z up의 로봇 좌표계 간의 TF(transform)가 필요하다.
3-2) `_ned` 접미사
실외에서 동작하는 시스템의 경우, 사용하는 센서 및 지도에 따라 ENU가 아닌 NED (north east down, [6]) 좌표계를 사용해야 할 때가 있다. 이때에는 `_ned` 접미사를 붙여 구분한다.
4) ROS 2의 좌표 표현의 회전 표현(Rotation Representation) 규칙
회전의 경우 좌표계는 같아도 목적 및 계산 방법에 따라 표현하는 방법이 다양한데 대표적으로 사용하는 회전 표현 방식에는 아래와 같으며 ROS 커뮤니티에서는 1~3번의 경우를 권장하고 있으며 특이점이 있는 4번의 경우 ROS 커뮤니티에서는 사용을 권장하지 않고 있다.
1) 쿼터니언 (quaternion)
- 간결한 표현방식으로 가장 널리 사용됨 (x, y, z, w)
- 특이점 없음 (No singularities)
2) 회전 매트릭스 (rotation matrix)
- 특이점 없음 (No singularities)
3) 고정축 roll, pitch, yaw (fixed axis roll, pitch, yaw about X, Y, Z axes respectively)
- 각속도에 사용
4) 오일러 각도 yaw, pitch, roll (euler angles yaw, pitch, and roll about Z, Y, X axes respectively)
- 전역 좌표계에서 회전이 발생하기 때문에 한 축의 회전이 다른 축의 회전과 겹체는 문제(일명 짐벌락)로 인해 사용을 권장하지 않는다.
실습을 진행하면서 ROS2 재설치가 필요하거나, ROS2가 잘 빌드되었는 지 확인하고 싶은 분들을 위한 코드 다시 정리
1. ROS2 패키지 제거
cd ~
sudo apt-get remove --purge ros-*
2. ROS2 설치에 의해 추가된 의존성 패키지 제거
sudo apt-get autoremove
3. ROS2와 관련된 설정 파일 및 캐시 삭제
sudo rm -rf /etc/ros
sudo rm -rf ~/.ros
(4. 환경 변수 정리) 저는 재설치를 할 것이기 때문에 진행하지 않았습니다.
nano ~/.bashrc #ROS2 관련 환경 변수 삭제하기
source ~/.bashrc
5. 필수 패키지 업데이트 및 재설치
sudo apt update
sudo apt install curl gnupg lsb-release
6. ROS2 GPG 키 추가
curl -sSL http://repo.ros2.org/repos.key | sudo apt-key add -
7. ROS2 저장소 추가
sudo sh -c 'echo "deb [arch=amd64] http://repo.ros2.org/ubuntu/main $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
8. ROS2 패키지 설치
sudo apt update
sudo apt install ros-foxy-desktop
(9. 환경 설정하기) 저는 기존에 ROS2와 관련된 설정을 삭제하지 않았기 때문에 생략합니다.
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
source ~/.bashrc
설치 확인
Talker
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp talker
Listner
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_py listener
'1-1. Fundamental > ROS2' 카테고리의 다른 글
[ROS2] 인터페이스 프로그래밍을 해보자 1 - 프로그래밍 기초, 인터페이스 복습, 패키지 설계 (C++ / 23,25,27,34) (0) | 2024.08.01 |
---|---|
[ROS2] 노드와 메세지 통신, 토픽/서비스/액션/파라미터 (08~13) (0) | 2024.07.21 |