ROS2 개발서적 완독 챌린지 Week8
2023년 4월 부터 12주 동안, 판교오로카 회원님들과 "ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음) 을 완독하는 챌린지 입니다. 매주 4개의 Chapter 를 읽고 책의 내용을 블로그에 정리합니다.
ROS2로 시작하는 로봇 프로그램
https://www.yes24.com/Product/Goods/102949767
5장. 토픽, 서비스, 액션 인터페이스
ROS2에서 기본 제공하는 std_msgs, geometry_msgs, sensor_msgs 등이 아닌 사용자 정의 인터페이스를 작성하는 방법을 정리합니다. 사용자 인터페이스를 응용 프로그램 패키지에 넣을 수 있으나, 별도의 인터페이스 패키지를 만들어 사용하는 것을 추천합니다.
$ ros2 pkg create --build-type ament_cmake msg_srv_action_interface_example
아래와 같이 msg_srv_action_interface_example 디렉토리 아래에 action, msg, srv 디렉토리를 생성합니다. 그리고 각 디렉토리에 ArithmeticChecker.action, ArithmeticArgument.msg, ArithmeticOperator.srv 파일을 만들고 코드를 작성합니다.
$ tree
.
├── CMakeLists.txt
├── action
│ └── ArithmeticChecker.action
├── build.sh
├── msg
│ └── ArithmeticArgument.msg
├── package.xml
├── src
└── srv
└── ArithmeticOperator.srv
ArithmeticChecker.action
action 인터페이스에 목표값, 결과값, (중간)피드백 값을 구분자로 나눠서 정의 합니다.
# Goal
float32 goal_sum
---
# Result
string[] all_formula
float32 total_sum
---
# Feedback
string[] formula
ArithmeticArgument.msg
퍼블리시 되는 인터페이스 데이터를 정의 합니다.
# Messages
builtin_interfaces/Time stamp
float32 arg_a
float32 arg_b
ArithmeticOperator.srv
요청하는 인터페이스, 응답하는 인터페이스를 정의 합니다.
# Constants
int8 PLUS = 1
int8 MINUS = 2
int8 MULTIPLY = 3
int8 DIVISION = 4
# Request
int8 arithmetic_operator
---
# Response
float32 arithmetic_result
패키지 설정파일
<?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>msg_srv_action_interface_example</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="makepluscode@todo.todo">makepluscode</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<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>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
빌드 설정 파일
cmake_minimum_required(VERSION 3.8)
project(msg_srv_action_interface_example)
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(builtin_interfaces REQUIRED)
find_package(rosidl_default_generators REQUIRED)
# interfaces
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)
ament_package()
빌드 하기
#!/bin/sh
colcon build --symlink-install --packages-select msg_srv_action_interface_example
6장-11장. ROS2 패키지 설계 (파이썬) 및 구현
이제까지 배운 ROS의 토픽, 서비스, 액션을 파이썬으로 구현합니다.
패키지 설계
topic_service_action_rclpy_example 를 다음과 같이 4개의 Node 로 설계합니다.
STEP1-1. (토픽) argument node
arithmetic_argument 토픽으로 현재의 시간과 임의의 변수 a 와 b 를 발행합니다.
STEP1-2. (토픽) calculator node
arithmetic_argument 토픽이 생성된 시간과 변수 a와 b를 구독합니다.
STEP2-1. (서비스 클라이언트) operator node
arithmetic_operator 서비스를 통해 계산기 노드에게 연산자(+, -, *, /)를 서비스 요청 값으로 보냅니다. 그리고 연산자를 수신 합니다.
STEP2-2. (서비스 클라이언트) calculator node
- 변수 a와 b를 연산자를 이용하여 연산
- operator node에게 서비스 응답값
- 연산 결과값을 누적하고, 액션 피드백으로 연산식을 보냅니다.
- 누적된 연산 결과값이 목표값보다 크면 연산 결과와 연산식을 보냅니다.
STEP3-1. (액션 클라이언트) checker node
- 연산값의 합계의 한계치를 액션 목표값으로 전달
STEP3-2. (액션 서버) calculator node
- 액션 목표 미 달성시, 피드백 제공 (연산 계산식)
- 액션 목표를 달성 시, 결과값 제공
관련자료
'로보틱스' 카테고리의 다른 글
ROS2 완독 챌린지 Week7 (2부 Ch.01~04) (1) | 2023.06.03 |
---|---|
ROS2 완독 챌린지 Week6 (Ch.21~24) (0) | 2023.05.28 |
ROS2 완독 챌린지 Week4 (Ch.13~16) (0) | 2023.05.13 |