ROS

[ROS] Robot Operating System Programing (2)

소뎡둥 2023. 11. 1. 21:02

 

[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 : 무조건 단조증가