ROS2 개발서적 완독 챌린지 Week6
2023년 4월 부터 12주 동안, 판교오로카 회원님들과 "ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음) 을 완독하는 챌린지 입니다. 매주 4개의 Chapter 를 읽고 책의 내용을 블로그에 정리합니다.
ROS2로 시작하는 로봇 프로그램
http://www.yes24.com/Product/Goods/102949767
21장. ROS2의 시간
다수의 노드로 구성된 로봇의 소프트웨어 동작에서 시작은 매우 중요합니다. ROS 프레임워크는 시간과 관련된 라이브러리를 제공하고 있으므로 적극적으로 활용합니다.
시간의 추상화
ROS2에서는 시간을 추상화하여 쉽게 사용할 수 있는 환경을 제공합니다. 기본적인 시계 뿐만 아니라 타임 머신처럼 동작하는 시계도 사용합니다. 시간을 추상화하여 3가지 형태로 제공합니다.
typedef enum rcl_clock_type_e
{
/// Clock uninitialized
RCL_CLOCK_UNINITIALIZED = 0,
/// Use ROS time
RCL_ROS_TIME,
/// Use system time
RCL_SYSTEM_TIME,
/// Use a steady clock time
RCL_STEADY_TIME
} rcl_clock_type_t;
ROS Time
ROS Time 은 시뮬레이션 환경에서 시간을 다루기 위해 사용됩니다. use_sim_time 라는 파라미터를 사용 합니다. 이 값이 True인 경우 설정된 노드가 clock 토픽을 수신할 때까지 시간을 0으로 초기화합니다.
System Time
Host 시스템의 시간을 사용하는 것을 의미합니다. 예외적으로, 호스트와 네트워크 시간이 동기화되면 시스템 시간이 반대로 진행될 수 있습니다. 네트워크 상에서 특정 서버의 시간을 기준으로 호스트 머신들의 시간을 동기화하는 방법은 다음 명령어를 사용하는 것입니다.
Steady Time
하드웨어 타임아웃을 사용하는 시간을 의미하며, 단조 증가하는 특성을 가집니다.
Time API
ROS2에서 제공하는 시간 API에는 time, duration, rate가 있습니다.
- Time 클래스는 시간을 다룰 수 있는 연산자를 제공합니다. 결과를 다양한 시간 형식으로 변환할 수 있으며, now 함수를 통해 현재 시간을 얻을 수 있습니다.
- Duration 클래스는 시간의 기간에 대한 연산자를 제공합니다. 이전 시간은 음수로 표기됩니다.
- Rate 클래스는 반복문에서 특정 주기를 유지시켜주는 API를 제공합니다.
22장. ROS2의 파일 시스템
ROS2 파일 시스템에 대해 설명하기 위해서는 기본 폴더 구조 및 파일 구성, 설치 폴더, 사용자 패키지에 대해 살펴볼 필요가 있습니다.
패키지와 메타패키지
패키지는 ROS2 응용프로그램의 논리적인 단위로, 하나 이상의 노드를 포함합니다. ROS2는 전 세계의 개발자들이 로봇 개발에 필요한 소프트웨어 패키지를 계속해서 만들어서 공개하고 있습니다. 패키지는 공통의 목적으로 묶일 경우 메타패키지로 관리됩니다. 각 패키지는 package.xml 파일을 포함하며, 이는 패키지 정보를 담고 있는 메타데이터입니다.
패키지 바이너리 설치
ROS2 패키지는 apt-get을 이용하여 다양한 패키지를 설치할 수 있습니다. 설치된 파일은 /opt/ros/humble에 저장됩니다.
sudo apt-get install ros-humble-teleop-twist-joy
소스코드 빌드 설치
소스 코드를 다운로드하고 빌드하여 설치하려면 git clone을 사용할 수 있습니다.
1. github 에서 package 예제를 다운로드
git clone https://github.com/ros2/teleop_twist_joy.git
2. colcon 을 이용하여 package 예제를 빌드
cd teleop_twist_joy/
colcon build --symlink-install --packages-select teleop_twist_joy
기본설치폴더
ROS2를 설치하면 /opt/ros/humble 디렉토리 아래에, 다음과 같은 하위 디렉토리들이 설치됩니다.
- /bin 실행 가능한 바이너리 파일
- /cmake 빌드 설정 파일
- /include 헤더 파일
- /lib 라이브러리 파일
- /opt 기타 의존 패키지
- /share 패키지의 빌드, 환경 설정 파일
- local_setup.* 환경 설정 파일
- setup.* 환경 설정 파일
23장. ROS2 빌드 시스템과 빌드 툴
빌드 시스템은 단일 패키지를 빌드합니다. 빌드 툴과의 차이점은 전체를 대상으로 한다는 것입니다.
빌드 시스템
ROS1에서는 catkin 빌드 시스템을 사용하지만, ROS2는 ament를 사용합니다. 이 두 빌드 시스템 모두 CMake로 만들어졌습니다.
빌드 툴
빌드 툴은 전체 패키지를 대상으로 하므로 하나의 패키지가 아닌 전체를 대상으로 합니다. 따라서 별도의 도구가 필요합니다. ROS2에서는 colcon(Collective Construction)이라는 빌드 툴을 사용합니다.
패키지 생성
ros2 pkg create 명령어를 통해 패키지의 기본 내용을 쉽게 생성할 수 있다.
ros2 pkg create (패키지명) --build-type (빌드타입) --dependencies (패키지1) ...
빌드 타입은 ament_cmake와 ament_python 중에서 선택하여 개발 언어를 정할 수 있습니다.
패키지 빌드
ROS2에서 특정 패키지 또는 전체 패키지를 빌드할 때는 colcon 빌드 도구를 사용합니다. colcon은 Python으로 작성된 통합 빌드 도구입니다. -package-select 옵션을 사용하여 특정 패키지를 빌드할 수 있습니다.
24장. ROS2의 패키지 파일
패키지 파일은 설정 파일 package.xml, 빌드 설정 파일 CMakeLists.txt, 파이썬 패키지 설정 파일 setup.py, 파이썬 패키지 환경 설정 파일 setup.cfg, RQt 플러그인 설정 파일 plugin.xml, 패키지 변경 로그 파일 CHANGELOG.rst, 라이선스 파일 LICENSE, 패키지 설명 파일 README.md등으로 구성 됩니다.
패키지 설정 파일 (package.xml)
모든 ROS 패키지는 xml 형식의 패키지 설정 파일(package.xml)을 반드시 포함합니다. 이 파일은 ROS 패키지의 필수 구성 요소로, 패키지 이름, 작성자, 라이선스, 의존성 패키지 등 패키지 정보를 기술합니다.
- <?xml> xml 버전 1.0 로 문서의 문법을 정의
- **<package>** 이 구문부터 맨 끝의 </package>까지가 ROS 패키지 설정 부분입니다. 세부 사항으로 format="3" 이라고 패키지 설정 파일의 버전을 기재합니다. ROS 2는 3을 사용합니다.
- <name> 패키지의 이름
- <version> 패키지의 버전
- <description> 패키지의 간단한 설명
- <maintainer> 패키지 관리자의 이름과 이메일 주소
- <license> 라이선스 (Apache 2.0, BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3, Proprietary)
- <url> 패키지를 설명하는 웹 페이지 또는 버그 관리, 소스 코드 저장소 등의 주소
- <author> 패키지 개발에 참여한 개발자의 이름과 이메일 주소
- **<buildtool_depend>** 빌드 툴의 의존성
- **<build_depend>** 패키지를 빌드할 때 필요한 의존 패키지 이름
- <exec_depend> 패키지를 실행할 때 필요한 의존 패키지 이름
- **<test_depend>** 패키지를 테스트할 때 필요한 의존 패키지 이름
CMakeList.txt
ROS 2의 빌드 시스템인 ament에서는 C++ 프로그래밍 언어를 사용한 패키지나 RQt Plugin의 경우 CMake(Cross Platform Make)를 이용합니다. 패키지 폴더의 CMakeLists.txt라는 파일에 빌드 환경을 기술하여 사용하고 있습니다. 이 빌드 설정 파일에서는 실행 파일 생성, 의존성 패키지 우선 빌드, 링크 생성 등을 설정합니다.
setup.py
ROS 2 Python 패키지에서는 CMakeLists.txt 파일 대신 setup.py 파일을 사용합니다. 이 파일은 ROS 2 C++ 패키지의 CMakeLists.txt와 package.xml의 역할을 합니다. setup.py 파일은 setuptools을 사용하여 다양한 배포를 위한 설정을 하게 됩니다. 그러나 package.xml 파일은 ROS 패키지의 필수 구성 요소이므로, 비슷한 내용을 포함하더라도 패키지에 반드시 포함되어야 합니다.
- name: 패키지 이름을 기입합니다.
- version: 패키지 버전을 기입합니다.
- packages: 의존하는 패키지를 하나씩 나열해도 되지만, find_packages()를 사용하면 자동으로 의존하는 패키지를 찾아줍니다.
- data_files: 이 패키지에서 사용되는 파일들을 함께 배포하기 위해 기입합니다.
- install_requires: 이 패키지를 설치할 때 함께 설치할 패키지를 기입합니다.
- tests_require: 이 패키지를 테스트하는데 필요한 패키지를 기입합니다. ROS에서는 pytest를 사용합니다.
- zip_safe: 설치할 때 zip 파일로 아카이브할지 여부를 설정합니다.
- keywords: 이 패키지의 키워드를 기입합니다. Python Package Index (PyPI) [8] 에서 검색하여 이 패키지를 찾을 수 있도록 합니다.
- author, author_email, maintainer, maintainer_email: 저작자와 관리자의 이름과 이메일을 기입합니다.
- description: 패키지 설명을 기입합니다.
- license: 라이선스 종류를 기입합니다.
- entry_points: 플랫폼 별로 콘솔 스크립트를 설치하도록 콘솔 스크립트 이름과 호출 함수를 기입합니다.
참고문서
'로보틱스' 카테고리의 다른 글
ROS2 완독 챌린지 Week8 (2부 Ch.5~11) (0) | 2023.06.10 |
---|---|
ROS2 완독 챌린지 Week7 (2부 Ch.01~04) (1) | 2023.06.03 |
ROS2 완독 챌린지 Week4 (Ch.13~16) (0) | 2023.05.13 |