https://cafe.naver.com/openrt/24798
토픽, 서비스, 액션이 서로 연동되어 구동되는 방식으로 설계된 예제 패키지를 구현해 보자.
035~040에서 다룰 예정이다.
포스팅에는 나오지 않았는데 먼저 패키지를 만들어 줘야 한다.
$ cd ~/ros2_ws/src/
$ ros2 pkg create topic_service_action_rclcpp_example --build-type ament_cmake --dependencies rclcpp rclcpp_action msg_srv_action_interface_example
의존하는 패키지는 오로카 포스팅의 package.xml을 보고 유추했다(..
원래 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>topic_service_action_rclcpp_example</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="hcw@todo.todo">hcw</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>rclcpp_action</depend>
<depend>msg_srv_action_interface_example</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
원래 파일 내용
cmake_minimum_required(VERSION 3.5)
project(topic_service_action_rclcpp_example)
# 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(rclcpp_action REQUIRED)
find_package(msg_srv_action_interface_example 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()
$ cd ~/ros2_ws/src
$ git clone https://github.com/robotpilot/ros2-seminar-examples.git
$ cd ~/ros2_ws && colcon build --symlink-install
$ echo 'source ~/ros2_ws/install/local_setup.bash' >> ~/.bashrc
$ source ~/.bashrc
이전에 설치했던 teleop_twist_joy디렉토리를 지우고 실행했다.
cd ~/ros2_ws && colcon build --symlink-install실행시 아래와 같은 에러가 나온다.
ros2-seminar-examples 가 통으로 들어오면서 중복된 패키지가 존재하기 되었기 때문에 생긴 에러다.
(예를 들어 msg_srv_action_interface_example을 보면 ros2_ws/src에도 있고 ros2-seminar-examples안에도 있다)
ros2-seminar-examples 쪽을 삭제하고 진행했다.
그랬더니 한참 진행이 잘 되다가 이런 에러를 뱉었다.
source file이 없다길래,
일단 완전한 version인 ros2-seminar-examples의 topic_service_action_rclcpp_example을 복사해 src경로에 넣고 재진행했다.
이제 빌드가 성공하긴 했다만,
완전한 버전을 끌어오는 것이 맞는지 모르겠다.(수학 문제 해설지를 보고 문제를 푸는 기분이다)
추후 다루는 걸로.
노드를 실행 시, 받을 준비를 먼저 하고 그 다음 주는 노드를 실행한다.
subscriber(calculator)를 먼저 실행한 후 publisher(argument)를 실행하고,
server(calculator)를 먼저 실행한 후 client(operator)를 실행하는 식이다.
6.1 토픽 서브스크라이버, 서비스 서버, 액션 서버 실행
calculator 노드 실행
$ ros2 run topic_service_action_rclcpp_example calculator
6.2 토픽 퍼블리셔 실행
새 터미널 열어서 argument 노드 실행
$ ros2 run topic_service_action_rclcpp_example argument
6.3 서비스 클라이언트 실행
새 터미널 열어서 operator 노드 실행
$ ros2 run topic_service_action_rclcpp_example operator
6.4 액션 클라이언트 실행
새 터미널 열어서 checker 노드 실행
$ ros2 run topic_service_action_rclcpp_example checker
합계의 한계치를 100으로 수정
$ ros2 run topic_service_action_rclcpp_example checker -g 100
6.5 런치 파일 실행
$ ros2 launch topic_service_action_rclcpp_example arithmetic.launch.py