CAFE

강의자료

[ROS2기초] 16. 서비스,파라미터 프로그래밍

작성자Sungryul Lee|작성시간22.12.05|조회수58 목록 댓글 0

1. 이론 공부

 

토픽, 서비스, 액션, 파라미터 개념설명 : 교재 1부 11장 ~16장

토픽, 서비스, 액션, 파라미터 프로그래밍 : 교재 2부 13장 ~ 16장

교재의 예제는 복잡해서 이해하기 어렵다,

ROS2 사이트의 Tutorials에 나오는 예제가 간단하여 이해하기 쉬우니 아래 주소의 내용으로 공부하기 바란다.

서비스 프로그래밍 : https://docs.ros.org/en/eloquent/Tutorials/Writing-A-Simple-Cpp-Service-And-Client.html

파라미터 프로그래밍 : https://docs.ros.org/en/eloquent/Tutorials/Using-Parameters-In-A-Class-CPP.html

yaml파일을 이용한 파라미터 초기화 : https://docs.ros.org/en/eloquent/Tutorials/Node-arguments.html

액션은 토픽과 서비스의 결합이므로 나중에 공부해라

 

라이다(LIDAR/LiDAR, light detection and ranging)

레이저 펄스를 쏘고 반사되어 돌아오는 시간을 측정하여 반사체의 위치좌표를 측정하는 레이다 시스템이다.

https://namu.wiki/w/%EB%9D%BC%EC%9D%B4%EB%8B%A4

 

RPLIDAR 

제조사 홈페이지 :https://www.slamtec.com/en/Lidar/A1

github:  https://github.com/Slamtec/rplidar_ros.git -> 깃허브에서 ros2 브랜치

rpLidar ROS wiki :  http://wiki.ros.org/rplidar

튜토리얼 : https://github.com/robopeak/rplidar_ros/wiki

 

2. rplidar_ros2 패키지를 이용한 서비스, 파라미터 실습

 

(1) 깃허브에서 rpLidar 패키지 다운로드

라이다패키지 작성시 다운로드 했으면  다음으로 진행하고 안했으면 같은 방법으로 다운로드하라.

 

(2) 패키지 빌드 

$ cd ~/ros2_ws -> 빌드명령어를 실행하는 위치 주의할 것, src 디렉토리가 아님

$ colcon build --symlink-install --packages-select rplidar_ros2 

(3) 패키지 실행

젯슨 보드의 USB포트에 rplidar를 연결한다.

여기서는 지금까지 사용한 개별노드를 실행하는 대신에 런치파일을 실행하는 방식으로 진행한다

런치파일은 나중에 다루는데 여러 개의 노드프로그램을 동시에 실행하도록 설정하는 파일이다.

런치파일(launch/view_rplidar_launch.py)내용은 아래코드처럼 2개의 패키지 프로그램 rplidar_scan_publisher와 rviz2를 동시에 실행하라는 내용이다. 런치파일은 파이썬으로 작성할수도 있고 xml파일로 작성도 가능하다.

rplidar_scan_publisher는 라이다 측정데이터를 퍼블리시하는 노드이고 rviz2는 ROS2에서 제공하는 라이다데이터를 섭스크라이브하여 3차원 공간에 시각화해주는 패키지이다. 

*수정사항 : ROS2 Eloquent 버전에서는 런치파일 launch/view_rplidar_launch.py의 아래코드에서 executable를 node_executable 으로 수정해야함

$ ls /dev/ttyUSB* -> 장치인식확인

$ sudo chmod a+rw /dev/ttyUSB0 -> 접근권한 설정

$ source ~/ros2_ws/install/setup.bash -> 실행파일 환경설정

$ ros2 launch rplidar_ros2 view_rplidar_launch.py -> 런치파일실행, 런치파일은 다음에 공부할것임 일단 따라하기 바람

PC에서 Xserver에 rviz2가 실행됨

ros2에 내장된 rviz2가  rplidar_scan_publisher가 퍼블리시하는 /scan 토픽을 서브스크라이브하여 3차원 공간에 시각화한 결과임

rviz2의 화면설정은 런치파일에 기술된 파라미터들로 자동 설정되므로 사용자가 별도로 설정할 것은 없다.(rviz/rplidar_ros2.rviz)

패키지 프로그램을 종료할때는 Ctrl + c 를 누른다.

 

(4) 토픽, 서비스, 파라미터 목록 확인

rplidar 패키지는 토픽, 서비스 서버, 파라미터 서버를 제공한다.

 

새로운 터미널을 열고 다음을 실행한다.

토픽 목록 확인

$ ros2 topic list -> /scan 확인할것

/scan : rplidar패키지가 퍼블리시하는 스캔데이터 토픽

서비스 목록 확인 

$ ros2 service list

/start_motor : 라이더 모터를 회전시키는 서비스

/stop_motor : 라이더 모터를 정지시키는 서비스

모터를 정지 또는 회전시킬때 사용할 것

 

서비스 타입 확인

$ ros2 service type /start_motor

$ ros2 service type /stop_motor

서비스 호출

$ ros2 service call /stop_motor std_srvs/srv/Empty -> 모터가 정지하는지 확인

$ ros2 service call /start_motor std_srvs/srv/Empty -> 모터가 회전하는지 확인

파라미터 목록 확인

$ ros2 param list

실행중인 노드명과 사용가능한 파라미터목록을 출력해준다.

/rplidar_scan_publisher 노드아래에 여러개의 파라미터들이 정의되어 있음

 

파라미터 정보 확인

# ros2 param describe /rplidar_scan_publisher serial_port

파라미터 읽기

$ ros2 param get /rplidar_scan_publisher serial_port

파라미터 쓰기

쓰기 후 읽어서 반드시 확인한다.

$ ros2 param set /rplidar_scan_publisher angle_compensate true

$ ros2 param get /rplidar_scan_publisher angle_compensate

$ ros2 param set /rplidar_scan_publisher angle_compensate false

$ ros2 param get /rplidar_scan_publisher angle_compensate

토픽, 서비스, 파라미터 서버의 용도를 잘 기억할것

카메라와 다이나믹셀 패키지에 서비스, 파라미터 기능을 추가해볼 것

 

(5) 서비스 관련 소스코드분석

소스파일 : src/rplidar_scan_publisher.cpp -> 깃허브에서 ros2 브랜치에서 확인가능함

 

서비스 서버 코드

서비스 콜백함수정의 -> 서비스 클라이언트가 서비스 요청시 실행할 함수

서비스 /stop_motor, /start_motor 요청시 실행할 함수정의

 

서비스이름("stop_motor","start_motor"), 서비스 콜백(stop_motor,start_motor)을 인수로 전달하여 서비스를 생성한다.

서비스를 생성하는 함수 create_service 가 실행해주면 서비스가 사용가능해진다.

더 자세한 내용은 교재를 14장을 참고하라

 

서비스 클라이언트 코드

교재를 14장을 참고하라

 

 

(6) 파라미터 관련 소스코드 분석

소스파일 : src/rplidar_scan_publisher.cpp -> 깃허브에서 ros2 브랜치에서 확인가능함

ROS2의 모든 노드빌드시 자동으로 파라미터 서버를 생성해주고 파라미터 클라이언트에서 파라미터를 읽기, 쓰기 가능하다.

소스코드에서는 아래처럼 파라미터 선언만 해주면 된다.

 

3. Dynamixel 서버 구현

 

다음 기능을 갖는 dynamixel_server 패키지 작성

- 서비스 기능: stop_motor, start_motor

- 파라미터 서버 기능: motor_speed

- start_motor서비스는 motor_speed파라미터에 설정된 값으로 회전하도록 할것

- stop_motor서비스는 모터를 정지하도록 할것

 

(1) 패키지 생성

$ cd ~/ros2_ws/src

$ ros2 pkg create dynamixel_server --build-type ament_cmake --dependencies rclcpp

(2) 패키지 소스작성

서비스 서버기능은 소스코드에 직접 작성해줘야한다.

파라미터 서버기능(파라미터 set/get)은 구현하지 않아도 ROS2에서 자동으로 구현해준다. 소스코드에서 파라미터를 선언만 해주면 된다. 

src/dynamixel_server.cpp

src/dxl.cpp

include/dynamixel_server/dxl.hpp

CMakeLists.txt

package.xml

 

(3) 패키지 빌드

$ cd ~/ros2_ws -> 빌드명령어를 실행하는 위치 주의할 것, src 디렉토리가 아님

$ colcon build --symlink-install --packages-select dynamixel_server

(3) 패키지 실행

$ source ~/ros2_ws/install/setup.bash

$ ros2 run dynamixel_server dynamixel_server

(4) 서비스, 파라미터 테스트

먼저 생성된 서비스와 파라미터 리스트를 확인한다.-> /start_motor, /stop_motor, motor_speed

$ ros2 service list

$  ros2 param list

목록에서 보이는 소스에서 생성하지 않은 서비스나 파라미터는 ROS2가 자동으로 생성한 기능이다.

특히 파마리터 get/set/describe/list 기능은 ROS2가 모든 패키지에 대하여 자동으로 생성해준다.

 

먼저 motor_speed 파라미터를 200으로 설정한 후 확인한다.

$ ros2 param set dynamixel_server motor_speed 200

$ ros2 param get dynamixel_server motor_speed

설정한 파라미터를 이용하여 모터를 구동하는 서비스 /start_motor를 호출한다.

$ ros2 service call /start_motor std_srvs/srv/Empty -> 모터가 회전해야한다.

모터를 정지하려면  서비스 /stop_motor를 호출한다.

$ ros2 service call /stop_motor std_srvs/srv/Empty -> 모터가 정지해야한다.

서비스를 호출하는 동안 서버에서는 다음과 같은 메시지가 출력되어야 한다.

위에서는 클라이언트 기능은 ROS2명령어로 처리하였다 서비스 클라이언트, 파라미터 클라이언트 기능을 소스코드를 구현하여 위의 기능을 수행할수도 있다

클라이언트 코드 작성방법은 ros튜토리얼이나 교재를 참고하라

 

파라미터 저장

파라미터의 현재 설정값을 파일로 저장할수 있다.

$ ros2 param dump /dynamixel_server  -> 현재 디렉토리에 dynamixel_server.yaml 파일명으로 저장한다. 따라서 저장할 디렉토리로 이동후 저장할것

yaml 문법

https://github.com/ros2/rcl/tree/eloquent/rcl_yaml_param_parser

 

$ vi dynamixel_server.yaml -> 파일을 편집하여 파라미터 motor_speed 설정값을 400으로 변경해본다.

실행중인 노드를 종료하고 아래 처럼 다시 실행하여 파라미터 파일에 저장된 값으로 파라미터를 초기화할수 있다.

파라미터파일의 위치를 현재경로 기준으로 모두 적어줘야한다. 

$ ros2 run dynamixel_server dynamixel_server src/dynamixel_server/src/dynamixel_server.yaml

$ ros2 param get dynamixel_server motor_speed -> 파일의 값으로 변경되었음을 확인

 

패키지 실행시 명령행에서 파라미터의 값을 전달하는 방법

https://docs.ros.org/en/foxy/How-To-Guides/Node-arguments.html

 

4. 실습과제

 

위에서 만든 패키지에 다음 기능을 추가하라.

- 서비스 서버기능: goforward(전진), gobackward(후진), turnleft(좌회전), turnright(우회전)

- 파라미터 서버 기능: left_speed, right_speed

- goforward, gobackward, turnleft, turnright서비스는 left_speed, right_speed 파라미터에 설정된 값으로 회전하도록 할것

- 파라미터의 초기값을 파일(yaml)에 저장하고 노드 실행시 불러오도록 해라

소스코드, 빌드설정파일, 패키지 설정파일, 실행결과를 첨부하시오.

 

 

다음검색
현재 게시글 추가 기능 열기
  • 북마크
  • 신고 센터로 신고

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼