본문 바로가기
로보틱스

ROS2 완독 챌린지 Week8 (2부 Ch.5~11)

by makepluscode 2023. 6. 10.
반응형

ROS2 개발서적 완독 챌린지 Week8

2023년 4월 부터 12주 동안, 판교오로카 회원님들과 "ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음) 을 완독하는 챌린지 입니다. 매주 4개의 Chapter 를 읽고 책의 내용을 블로그에 정리합니다.

ROS2로 시작하는 로봇 프로그램

https://www.yes24.com/Product/Goods/102949767

 

ROS 2로 시작하는 로봇 프로그래밍 - YES24

이 책은 ROS 공식 플랫폼인 TurtleBot3의 개발자이자 10여 년간 ROS 기반 프로젝트를 진행한 로보틱스 엔지니어인 필자들이 실무에서 얻은 경험과 커뮤니티 활동을 바탕으로 작성한 ROS 로봇 프로그래

www.yes24.com


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 로 설계합니다.

출처 :&nbsp;"ROS2로 시작하는 로봇 프로그램"(표윤석, 임태훈 지음)

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

  1. 변수 a와 b를 연산자를 이용하여 연산
  2. operator node에게 서비스 응답값
  3. 연산 결과값을 누적하고, 액션 피드백으로 연산식을 보냅니다.
  4. 누적된 연산 결과값이 목표값보다 크면 연산 결과와 연산식을 보냅니다.

STEP3-1. (액션 클라이언트) checker node

  1. 연산값의 합계의 한계치를 액션 목표값으로 전달

STEP3-2. (액션 서버) calculator node

  1. 액션 목표 미 달성시, 피드백 제공 (연산 계산식)
  2. 액션 목표를 달성 시, 결과값 제공

관련자료

https://github.com/robotpilot/ros2-seminar-examples.git

 

GitHub - robotpilot/ros2-seminar-examples: ROS 2 example packages for the ROS 2 seminar

ROS 2 example packages for the ROS 2 seminar. Contribute to robotpilot/ros2-seminar-examples development by creating an account on GitHub.

github.com

반응형

'로보틱스' 카테고리의 다른 글

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