|
|
1.
17장
ROS 도구는 형태에 따라 4가지로 분류 가능.
CLI 형태의 Command-Line Tools, CUI 형태의 RQt, 3차원 시각화툴인 RViz, 3차원 시뮬레이터 Gazebo
1)CLI기반
명령어 기반 툴, 로봇 액세스 미 거의 모든 ROS 기능을 다룸
개발환경 및 빌드, 테스트 툴(colcon)
데이터를 기록, 재생, 관리하는 툴(ros2bag)
2)CUI 기반 RQt
그래픽 인터페이스 개발을 위한 Qt 기반 프레임워크 제공
노드와 그들 사이의 연결 정보 표시
속도, 전압 등 시간이 지남에 따라 변화하는 데이터 플로팅
3)RViz
3차원 시각화툴
레이저, 카메라 등의 센서 데이터를 시각화
로봇 외형과 계획된 동작 표현
4)Gazebo
3차원 시뮬레이터
물리 엔진을 탑재, 로봇, 센서, 환경 모델 등을 지원
타 시뮬레이터 대비 ROS와의 높은 호환성
ROS 2 CLI 사용법
ros2 [verbs] [sub-verbs] [options] [arguments]
verbs? run, launch, node 와 같은 것들
sub-verbs? info, list와 같은 것들
ROS 2 실행 명령어와 그 기능은 책 178페이지 참고.
18장
RQt는 플러그인 형태로 다양한 도구와 인터페이스를 구현할 수 있는 그래픽 사용자 인터페이스 프레임워크이다.
RQt는 Qt를 기반으로 하고 있어 Qt의 특징인 크로스 플랫폼과 다양한 프로그래밍 언어 지원이라는 특징을
그대로 반영하고 있음.
RQt 플러그인 종류
자주 사용하는 플러그인만 추림.
-Node Graph : 실행 중인 노드들의 관계 및 토픽을 확인 가능한 그래프 뷰
-Topic Monitor : 토픽 목록 확인 및 사용자가 선택한 토픽의 정보를 확인
-Message Publisher : 메시지 퍼블리셔(ros2 topic pub)
-Message Type Browser : 메시지 타입의 데이터 구조 확인(ros2 interface)
-Service Caller : 실행 중인 서비스 서버에 접속하여 서비스를 요청
-Parameter Reconfigure : 노드들에서 제공하는 파라미터 값을 확인하고 변경할 수 있음.(ros2 param)
-Plot : 2차원 데이터 플롯 기능을 갖춘 RQt 플러그인으로 2차원 데이터를 도식화 해줌.
-Image View : 카메라의 영상 데이터를 확인할 수 있는 RQt 플러그인
-Console : 노드들에서 발생되는 정보, 경고, 에러 등의 rosout 데이터를 확인할 수 있는 플러그인.
19장
ROS는 SI 단위와 국제단위계의 7개 기본 단위를 조합해 만들어진 SI 유도 단위를 표준 단위로 지정함.
>단위로 인한 잘못된 사용이나 버그, 불필요한 연산을 줄일 수 있음.
| 물리량 | 단위(SI unit) | 물리량 | 단위(SI derived unit) |
| Length | Meter | Angle | Radian |
| Mass | Kilogram | Frequency | Hertz |
| Time | Second | Force | Newton |
| Current | Ampere | Power | Watt |
| Voltage | Volt | ||
| Temperature | Celsius | ||
| Magnetism | Tesla |
20장
로봇은 기본적으로 x forward, y left, z up을 사용함.
회전축의 경우는 오른손의 검지, 중지, 엄지를 축으로 사용하며 오른쪽 손가락을 감는 반시계 방향이
정회전+ 방향임. 회전 각은 라디안(radian)사용
>로봇이 제자리에서 12시 방향에서 9시 방향으로 회전 – 정방향 1.5708rad만큼 회전했다.
1.기본 3축
ROS에서는 x forward, y left, z up을 사용. 시각화 툴 RViz,
3차원 시뮬레이터 Gazebo에서 이러한 기본 3축의 표현을 RGB의 원색으로 표현함.
순서대로 x-Red, y- Green, z- Blue임.
2.ENU 좌표
지리적 위치의 단거리 데카르트 표현의 경우 ENU(East North Up) 규칙을 사용.
실내 로봇에서는 잘 다루지 않는 좌표지만 드론, 실외 자율주행 로봇에서 사용하는 좌표.
3.접미사 프레임 사용
앞에서 언급한 x forward, y left, z up, ENU 좌표에서 벗어나는 경우 접미사 프레임을 사용해 기본 좌표계와 구별하여 사용한다.
1)optical 접미사
컴퓨터 비전 분야의 경우 카메라 좌표계로 많이 사용되는 z forward, x right, y down을 사용함.
이 경우 카메라 센서 이미지에 _optical 접미사를 붙여 구분
2)_ned 접미사
실외에서 동작하는 시스템의 경우, 사용하는 센서 및 지도에 따라 ENU가 아닌
NED(North East Down)좌표계를 사용할 때 _ned 접미사 사용
좌표 표현의 회전 표현 규칙
1.쿼터니언 – 간결한 표현 방식
2.회전 매트릭스
3.고정축 roll, pitch, yaw – 각 속도에 사용
4.오일러 각도 yaw, pitch, roll – 전역 좌표계에서 회전이 발생하기 때문에 한 축의 회전이
다른 축의 회전과 겹치는 문제로 인해 사용 권장하지 않음.
21장
ROS 2는 여러 노드들이 서로 통신하며 다양한 정보들을 주고받기 때문에
해당 정보들이 퍼블리시된 정확한 시간이 필수적임. ROS는 세가지의 시간을 제공하고있음
System Time
System Clock을 사용한 시간을 말함. 단조 증가하지만 타임 서버와 동기화를 통해 시간이 거꾸로 가는 경우도 있음.
ROS Time
시뮬레이션 환경에서 시간을 조절하기 위해 많이 사용.
Steady Time
Hardware timeouts를 사용한 시간을 말함. 무조건 단조증가.
22장
ROS 파일 시스템은 ROS 패키지 및 소스코드를 검색하거나 메시지 파일, 실행 파일, 파라미터 설정 및 환경설정 파일등을
이용할 때 사용자에게 일관된 경험을 제공하기 위해 동일한 구조를 가지고 있음.
패키지 ? 소프트웨어 구성을 위한 기본 단위
패키지는 노드를 하나 이상 포함하거나 다른 노드를 시행하기 위한 런치와 같은 실행 및 설정 파일들을 포함함.
메타 패키지 ? 공통된 목적을 지닌 패키지들을 모아둔 패키지의 집합 단위
각 패키지는 package.xml 파일을 포함하고 있는데 이는 패키지의 정보를 담은
xml파일로 패키지의 이름, 저작자, 라이선스, 의존성 패키지 등을 기술하고 있음.
1)기본 설치 폴더
기본 설치 폴더 경로
/bin : 실행 가능한 바이너리 파일
/cmake : 빌드 설정 파일
/include : 헤더 파일
/lib : 라이브러리 파일
/opt : 기타 의존 패키지
/share : 패키지의 빌드, 환경설정 파일
local_setup.* : 환경설정 파일
setup.* : 환경설정 파일
2)사용자 작업 폴더
경로 : /home/ncslab/지정하고 싶은 이름
1)폴더 및 파일구성
/build : 빌드 설정 파일용 폴더
/install : msg, srv, action 헤더 파일과 사용자 패키지 라이브러리, 실행 파일용 폴더
/log : 빌드 로깅 파일용 폴더
/src : 사용자 패키지용 폴더
src는 사용자 패키지 공간임. 그 구성요소는
/src : C/C++ 코드용 폴더
/include : C/C++ 헤더 파일용 폴더(각 패키지 이름별 폴더)
/param : 파라미터 파일용 폴더
/launch : roslaunch에 사용되는 launch파일용 폴더
/패키지_폴더 : 파이썬 코드용 폴더(패키지 이름으로 폴더를 생성한 경우)
/test : 테스트 코드 및 테스트 데이터용 폴더
/msg : 메시지 파일용 폴더
/srv : 서비스 파일용 폴더
/action : 액션 파일용 폴더
/doc : 문서용 폴더
Package.xml : 패키지 설정 파일
CMakeLists.txt : C/C++ 빌드 설정 파일
setup.py : 파이썬 코드 환경 설정 파일
README.md : 사용자 문서, github 리포지터리의 메인에 표시
CONTRIBUTIN.md : 해당 패키지 개발에 공헌하는 방법을 기술하는 파일
LICENSE : 이 패키지의 라이선스를 기술하는 파일
CHANGELOG.rst : 이 패키지의 버전별 변경 사항 모음 파일
23장
빌드 시스템과 빌드 툴의 차이 : 단일 패키지 대상인지 전체 패키지 대상인지
단일 패키지와 시스템 전체를 나눈 것은 의존성 때문.
ROS는 코드의 재사용성을 위해 패키지와 노드 단위로 구성되어 있는데, 각 패키지는 다른 패키지와 상호 호환성을 위해 의존성을 갖게 된다.
단일 패키지의 경우 빌드 시스템을 이용. CMake 기반의 catkin, ament_cmake
빌드 툴은 각 패키지에 기술된 종속성 그래프를 해석하고 토폴로지 순서로 각 패키지에 대한 특정 빌드 시스템을 호출. 툴로는 rosbuild, catkin_make, catkin_make_isolated, catkin_tools, ament_tools, colcon이 있음.
1)빌드 시스템
Cmake를 사용하는 이유는 멀티 플랫폼에서 빌드할 수 있게 하기 위함임.
ROS 2에서는 ament_cmake를 많이 사용.
2)빌드 툴
ROS 2에선 colcon을 사용함.
사용법 : colcon build와 같은 CLI 명령어 형태로 다양한 옵션과 함께 사용
패키지 생성
colcon build –symlink-install : 전체 패키지 빌드
colcon build –symlink-install –packages-select [package_name] : 특정 패키지만 빌드
colcon build –symlink-install –packages-up-to [package_name] : 특정 패키지의 의존성 패키지들까지 빌드
vcstool : 버전 컨트롤 시스템
rosdep : 의존성 관리
bloom : 바이너리 패키지 관리
24장
패키지 설정파일(package.xml)
ROS 패키지의 필수 구성 요소. 패키지의 정보를 기술하는 파일.
그 내용은 패키지 이름, 저작자, 라이선스, 의존성 패키지임.
위 ros2 pkg create 명령을 통해 이미 package.xml 파일이 생성되었음
<?xml> : 문서 문법을 정의하는 문구 하기 xml 버전 1.0을 따르고 있음을 알림
<package>~</package> : ROS 패키지 설정 부분 ROS2는 format=”3” 사용
<name> : 패키지의 이름. 패키지를 생성할 때 입력한 패키지 이름이 사용.
<version> : 패키지의 버전.
<description> : 패키지의 간단한 설명.
<maintainer> : 패키지 관리자의 이름과 이메일 주소 기재
<license> : 라이선스 기재.
<url> : 패키지를 설명하는 웹 페이지 또는 버그 관리, 소스코드 저장소 등의 주소 기재.
<author> : 패키지 개발에 참여한 개발자의 이름, 이메일 주소.
<buildtool_depend> : 빌드 툴의 의존성 기술
<build_depend> : 패키지를 실행할 때 필요한 의존 패키지 이름
<test_depend> : 패키지를 테스트 할 때 필요한 의존 패키지 이름
<export> : 위에서 명시하지 않은 확장 태그명 사용시 쓰임.
빌드 설정 파일(CMakelists.txt)
cmake_minimum_required() : cmake의 최소 요구버전
project() : 패키지의 이름 xml 파일에서 입력한 패키지 이름을 그대로 사용해야함.
CMAKE_C_STANDARD, CMAKE_CXX_STANDARD : 컴파일러 버전 설정하지 않을경우 C(99) C++(14)
add_compile_options() : 컴파일 옵션 지정
-Wall : 모든 warning 표시
-Wextra : Wall에서 활성화되지 않는 추가적인 경고 표시 활성화
-Wpedantic : _로 시작하고 끝나는 대체 키워드 사용하는 경우 경고 메시지 무시.
find_package : ament 빌드를 할 때 요구되는 구성 요소 패키지. rclcpp를 사용하는 경우
ament_cmake와 rclcpp는 기본적으로 포함. 사용자가 만든 패키지가 의존하는 다른 패키지를 먼저 설치하게 만드는 옵션임.
RQt 플러그인 설정 파일
xml 태그를 사용함.
라이선스 파일
패키지의 코드에 사용된 라이선스를 기술하는 파일.
패키지 설정 파일
md(Markdown) 문법을 따름.
2.
/build : 빌드 설정 파일용 폴더
/install : msg, srv, action 헤더 파일과 사용자 패키지 라이브러리, 실행 파일용 폴더
/log : 빌드 로깅 파일용 폴더
/src : 사용자 패키지용 폴더
src는 사용자 패키지 공간임. 그 구성요소는
/src : C/C++ 코드용 폴더
/include : C/C++ 헤더 파일용 폴더(각 패키지 이름별 폴더)
/param : 파라미터 파일용 폴더
/launch : roslaunch에 사용되는 launch파일용 폴더
/패키지_폴더 : 파이썬 코드용 폴더(패키지 이름으로 폴더를 생성한 경우)
/test : 테스트 코드 및 테스트 데이터용 폴더
/msg : 메시지 파일용 폴더
/srv : 서비스 파일용 폴더
/action : 액션 파일용 폴더
/doc : 문서용 폴더
Package.xml : 패키지 설정 파일
CMakeLists.txt : C/C++ 빌드 설정 파일
setup.py : 파이썬 코드 환경 설정 파일
README.md : 사용자 문서, github 리포지터리의 메인에 표시
CONTRIBUTIN.md : 해당 패키지 개발에 공헌하는 방법을 기술하는 파일
LICENSE : 이 패키지의 라이선스를 기술하는 파일
CHANGELOG.rst : 이 패키지의 버전별 변경 사항 모음 파일
3.
xml ? Extensible Markup Language의 줄임말. xml 사용시 공유 가능한 방식으로 데이터를 정의하고 저장할 수 있음.
웹 사이트, 데이터베이스 및 타사 애플리케이션과 같은 컴퓨터 시스템 간의 정보 교환 지원.
규칙이 이미 정의되어 있기 때문에 데이터를 효율적, 정확하게 읽을 수 있다.
4.
cmake ? 다양한 빌드 툴 중 하나임.
멀티플랫폼으로 사용할 수 있는 Make의 빌드관리시스템을 만들기 위한 오픈소스 프로젝트임.
지정한 운영체제에 맞는 Make 파일의 생성 및 관리만을 수행하므로 빌드 자동화 시스템임.
최대 이점으론 3대 운영체제에서 CMakelists.txt 파일의 수정 없이 사용할 수 있다는 장점이 있음.
5.
CMakelists.txt ? 빌드 환경을 기술해 사용하는 파일.
이 파일에 실행 파일 생성, 의존성 패키지 우선 빌드, 링크 생성 등(빌드 규칙)을 설정함.
6.
make는 object파일을 하나하나 지정해야하며 소스 사이의 이존 관계도 직접 지정해야함,
하지만 cmake는 모든 것을 자동으로 처리해줌.
7.
<?xml> : 문서 문법을 정의하는 문구 하기 xml 버전 1.0을 따르고 있음을 알림
<package>~</package> : ROS 패키지 설정 부분 ROS2는 format=”3” 사용
<name> : 패키지의 이름. 패키지를 생성할 때 입력한 패키지 이름이 사용.
<version> : 패키지의 버전.
<description> : 패키지의 간단한 설명.
<maintainer> : 패키지 관리자의 이름과 이메일 주소 기재
<license> : 라이선스 기재.
<url> : 패키지를 설명하는 웹 페이지 또는 버그 관리, 소스코드 저장소 등의 주소 기재.
<author> : 패키지 개발에 참여한 개발자의 이름, 이메일 주소.
<buildtool_depend> : 빌드 툴의 의존성 기술
<build_depend> : 패키지를 실행할 때 필요한 의존 패키지 이름
<test_depend> : 패키지를 테스트 할 때 필요한 의존 패키지 이름
<export> : 위에서 명시하지 않은 확장 태그명 사용시 쓰임.
8.
cmake_minimum_required() : cmake의 최소 요구버전
project() : 패키지의 이름 xml 파일에서 입력한 패키지 이름을 그대로 사용해야함.
CMAKE_C_STANDARD, CMAKE_CXX_STANDARD : 컴파일러 버전. 설정하지 않을경우 C(99) C++(14)
add_compile_options() : 컴파일 옵션 지정
-Wall : 모든 warning 표시
-Wextra : Wall에서 활성화되지 않는 추가적인 경고 표시 활성화
-Wpedantic : _로 시작하고 끝나는 대체 키워드 사용하는 경우 경고 메시지 무시.
자신만의 인터페이스 파일을 사용하는 경우는
rosidl_generate_interfaces를 사용하여 인터페이스 추가해야함.
add_executable : 빌드할 때 참조할 코드와 실행 파일 이름 지정
ament_target_dependencies :
해당 라이브러리 및 실행 파일을 빌드하기에 앞서해야 할 의존성이 있는 인터페이스를 우선 수행.
set(변수명, 값) : 변수명, 변수에 저장할 값 지정 참조시 ${변수명}
message() : 문자열 출력
INCLUDE_DIRECTORIES() : 헤더파일의 경로를 지정해주어야 함.
LINK_DIRECTORIES, LINK_LIBRARIES :
LINK_DIRECTORIES로 라이브러리 경로 추가 후 LINK_LIBRARIES로 링크할 라이브러리 지정.
TARGET_LINK_LIBRARIES : 특정 타겟을 위한 라이브러리 링크.
