[ROS] Robot Operating System Programing (2)
[2023-2] Mobility Service 강좌 정리본
1. 파라미터 개념 정리
- 매개 변수를 서버 형태로 송수신 ( 모든 노드가 자신만의 파라미터 서버를 가지고 있다)
- 각 노드는 파라미터 클라이언트도 포함시킬 수 있어 자기 자신의 파라미터 및 다른 노드 파라미터를 읽고 쓸 수 있다.
- yaml 파일 형태로 파라미터 설정 파일을 만들어 실행시에 불러와서 사용할 수 있다.
2. 파라미터 확인
# 목록 확인
ros2 param list
# 내용 확인
ros2 param describe /turtlesim background_b
3. 파라미터 읽기
- ros2 param get <node_name> <parameter_name>
ros2 param get /turtlesim background_r
ros2 param get /turtlesim background_g
ros2 param get /turtlesim background_b
4. 파라미터 쓰기
- ros2 param set <node_name> <parameter_name> <value>
ros2 param set /turtlesim background_r 148
ros2 param set /turtlesim background_g 0
ros2 param set /turtlesim background_b 211
5. 파라미터 저장
- 노드를 종료했다가 다시 시작되면 모든 파라미터 초깃값으로 설정된다.
- 그래서 현재 파라미터를 저장하고 다시 불러와야 한다.
# ros2 param dump 명령어에 노드 이름 적어주기 > yaml 형태로 저장
ros2 param dump /turtlesim
# 파라미터 현재 값이 저장되어있음
cat ./turtlesim.yaml
# 노드 실행시 저장된 파라미터 값들을 사용하려면 뒤에 yaml 파일 위치 적어주기
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
6. 파라미터 삭제
ros2 param delete /turtlesim background_b
# 삭제 상태 확인
ros2 param list /turtlesim
7. ROS 쓰는 주요 툴
- CLI 형태의 Command-Line Tools, GUI 기반 RQT, RViz, Gazebo
8. GUI 기반 RQT
- 플러그인 형태 그래픽 사용자 인터페이스
- 설치 및 실행
sudo apt install ros-foxy-rqt*
9. 메시지 기반 인터페이스 (msg)
- 토픽 메시지 인터페이스라는 건가...?
# 메시지 형태 및 이름 확인
ros2 interface show geometry_msgs/msg/Twist
ros2 interface show geometry_msgs/msg/Vector3
# 인터페이스 기본 형태 표시
ros2 interface list
ros2 interface packages
ros2 interface package turtlesim
ros2 interface proto geometry_msgs/msg/Twist
10. 서비스 인터페이스 (srv 파일)
- spawn 예시
ros2 interface show turtlesim/srv/Spawn.srv
11. 액션 인터페이스 (action 파일) : 서비스 및 메시지 인터페이스 확장형이라고 볼 수 있다.
- 출력 : --- 구분자를 사용해 목표, 결과, 피드
ros2 interface show turtlesim/action/RotateAbsolute.action
12. ROS 2 표준 단위
13. 좌표
14. DDS QoS
15. 파일 시스템
- 일관된 경험을 제공하기 위해 동일 구조 제공 : 패키지, 소스 코드 검색이나 파일 등 이용할 때
- 소프트웨어 구성 유지를 위해 패키지 관리로 진행중
- 바이너리 설치 및 소스 코드 설치
sudo apt install ros-foxy-teleop-twist-joy
cd ~/robot_ws/src
git clone https://github.com/ros2/teleop_twist_joy.git
cd ~/robot_ws/
colcon build --symlink-install --packages-select teleop_twist_joy
- 밑의 사진처럼 쭈욱 잘 된다.
16. ROS 2 Build System and Tools
- 패키지 생성
# 기본
ros2 pkg create [패키지이름] --build-type [빌드 타입] --dependencies [의존하는패키지1] [의존하는패키지n]
# GUI 프로그램은 ament_cmake 로 해주면 됨
ros2 pkg create test_pkg_rclcpp --build-type ament_cmake -> c++이나 GUI 작성
$ ros2 pkg create test_pkg_rclpy --build-type ament_python -> 이건 그냥 파이썬만 할 때
# 작업 폴더로 이동
cd ~/robot_ws/src
# my_first_ros_rclcpp_pkg 이게 생성할 패키지 이름
ros2 pkg create my_first_ros_rclcpp_pkg --build-type ament_cmake --dependencies rclcpp std_msgs
# 이건 파이썬용
ros2 pkg create my_first_ros_rclpy_pkg --build-type ament_python --dependencies rclpy std_msgs
- 빌드
# 전체 패키지 빌드
cd ~/robot_ws && colcon build --symlink-install
# 특정 패키지 빌드
cd ~/robot_ws && colcon build --symlink-install --packages-select [패키지 이름]
- 추가 명령어 : vsctool(컨트롤 시스템 툴) / rosdep (의존성 관리 툴) / bloom(바이너리 패키지 관리 툴)
# vcstool
mkdir -p ~/ros2_foxy/src
cd ~/ros2_foxy
wget https://raw.githubusercontent.com/ros2/ros2/foxy/ros2.repos
vcs import src < ros2.repos
wget https://raw.githubusercontent.com/ros2/ros2/foxy/ros2.repos
vcs import src < ros2.repos
# rosdep
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro foxy -y --skip-keys "console_bridge fastcdr fastrtps rti-connext-dds-5.3.1 urdfdom_headers"
# bloom
17. Package Files
- 패키지 설정 파일 (package.xml)
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>my_first_ros_rclcpp_pkg</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="pyo@robotis.com">pyo</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
- 빌드 설정 파일 (CMakeLists.txt)
cmake_minimum_required(VERSION 3.5)
project(my_first_ros_rclcpp_pkg)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()
18. Time, Duration, Clock, Rate
- 시간 동기화가 필수적 !!!
# ROS 2 시계와 시간 확인
ros2 run time_rclcpp_example time_example --ros-args -p use_sim_time:=False
- 시간 추상화 ( System Time, ROS Time, Steady Time )
# System Time
sudo ntpdate ntp.ubuntu.com
# ROS Time
ros2 run time_rclcpp_example time_example --ros-args -p use_sim_time:=True
# Steady Time : 무조건 단조증가