SlideShare a Scribd company logo
1 of 119
실습으로 알아보는
ROS의 다양한 개발도구
2016. 04. 20
Yoonseok Pyo
Open Source Team
1
Index
I. Command-Line Tools
II. Visualization Tool: RViz
III. GUI Tool Box: RQT
2
Index
I. Command-Line Tools
II. Visualization Tool: RViz
III. GUI Tool Box: RQT
3
ROS의 다양한 개발 도구
 로봇 개발에 필요한 다양한 개발 도구를 제공
 로봇 개발의 효율성 향상
 Command-Line Tools
• GUI 없이 ROS에서 제공되는 명령어로만으로도 로봇 제어 및 거의 모든 ROS 기능 소화 가능
 RViz
• 강력한 3D 시각화툴
• 레이저, 카메라, IMU 등의 센서 데이터를 시각화
• 로봇 외형과 계획된 동작을 표현
 RQT
• 그래픽 인터페이스 개발을 위한 Qt 기반 프레임 워크 제공
• 노드와 그들 사이의 연결 정보 표시(rqt_graph)
• 인코더, 전압, 또는 시간이 지남에 따라 변화하는 숫자를 플로팅(rqt_plot)
• 데이터를 메시지 형태로 기록하고 재생(rqt_bag)
4http://www.ros.org/core-components/
아래의 Command-Line Tools 는 ROS 강의 전반에
걸쳐서 지속적으로 사용됩니다.
rospack, roscd, rospd, rosls, rosed, roscp, rosdep,
roswf, catkin_create_pkg, wstool, catkin_make,
roscore, rosrun, roslaunch, rosnode, rostopic,
rosservice, rosparam, rosmsg, rossrv, rosbag, tf_echo
배부한 ROS Cheatsheet 를 참고해주시구요.
이 부분은 생략!
https://github.com/oroca/oroca_ros_tutorials/raw/master/ROScheatsheet_indigo_catkin.pdf
Command-Line Tools
Index
I. Command-Line Tools
II. Visualization Tool: RViz
III. GUI Tool Box: RQT
6
RViz (ROS Visualization Tool)
• ROS의 3D 시각화툴
• 센서 데이터의 시각화
• 레이저 레인지 파인더(LRF)센서의 거리 데이터
• Kinect, Xtion, RealSense 등의 Depth Camera의 포인트 클라우드 데이터
• 카메라의 영상 데이터
• IMU 센서의 관성 데이터 등..
• 로봇 외형의 표시와 계획된 동작을 표현
• URDF(Unified Robot Description Format)
• 내비게이션
• 매니퓰레이션
• 원격 제어
Rviz의 사용예
• Kinect의 Point Cloud Data https://youtu.be/OqOkpZBOpxY
• LRF의 거리 값 https://youtu.be/qtoAJ1wzB6s
• LEGO Mindstorm 의 초음파 센서 https://youtu.be/6afrMnEmXFI
• IMU센서의 관성 값 https://youtu.be/j5v5fKppcQo
• RealSense의 Point Cloud와 Color, Depth 영상
https://youtu.be/Jf4kgPEzY4s
• 사람의 골격과 지시 방향 표시 https://youtu.be/ath8uNv9c_Q
• 로봇 및 환경 모델, 경로까지 https://youtu.be/9lbuLAD1c_4
• 지도 표시, 내비게이션, 목적지 지정 https://youtu.be/xCRsszVAP1E
• 인터렉티브 마커를 이용한 IK 목표 위치 지정 및 경로 표시
https://youtu.be/5rMv3ZDyFwQ
• 재난구조로봇의 경우 (2015 DARPA Robotics Challenge)
https://www.youtube.com/user/DARPAtv
8
RViz를 이용하면
센서 및 로봇 관련
데이터 시각화가 간단!
9
RViz 설치 및 실행
• RViz 설치
* ros-indigo-desktop-full를 설치하였다면 기본 설치됨
• RViz 실행
또는
10http://wiki.ros.org/rviz
$ sudo apt-get install ros-indigo-rviz
$ rosrun rviz rviz
$ rviz
RViz 초기 모습 (미설정)
11
RViz 의 화면 구성 (LRF 센서의 경우)
12
①
②
③ ④ ⑤
⑥
1. 3D 뷰
2. 디스플레이
3. 메뉴
4. 툴
5. 뷰 형태
6. 시간
RViz 의 디스플레이 종류 (②의 ‘ADD’를 클릭)
13
xyz 축
카메라 영상 오버레이
거리영상에 카메라 영상을 입힘
회전 관절의 힘
유체 압력
그리드
그리드 셀 (지도에 이용)
그룹
조도
영상
인터랙티브 마커
레이저 스캔
지도
마커
마커 배열
오도메트리
경로
포인트 클라우드
포인트 클라우드2
점
폴리곤
포즈
포즈 배열
범위
상대 온도
로봇 모델
좌표 변환 값 (TF)
상대 습도
쥐어 돌림
14
실습 시간
‘LRF, IMU, USB Camera,
Depth Camera, Robot Model
을 Rviz를 통해 확인해보자.’
나눠 드린 센서들을
각자 PC의 Rviz를 이용해 데이터를 확인해보세요.
15
오늘의 실습 준비물
RViz 실습 #1 (LRF)
* Rviz의 Displays 옵션 변경
1) Fixed Frame 변경
Global Options > Fixed Frame = laser
2) Axes 추가 및 설정
rviz 좌측 하단의 Add 클릭한 후, Axes 선택하여 추가한다. (Length 및 Radius 변경은 옵션)
3) LaserScan 추가 및 설정
rviz 좌측 하단의 Add 클릭한 후, LaserScan 선택하여 추가한다.
(Topic 지정은 필수, Color Transformer, Color 등은 옵션)
16
$ sudo apt-get install ros-indigo-rplidar-ros
$ sudo chmod a+rw /dev/ttyUSB0
$ roslaunch rplidar_ros rplidar.launch
$ sudo apt-get install ros-indigo-urg-node
$ sudo chmod a+rw /dev/ttyACM0
$ rosrun urg_node urg_node
(RPLiDAR의 경우)
(HOKUYO의 경우)
RViz 실습 #1 (LRF)
17
RViz 실습 #2 (IMU)
18
$ sudo apt-get install ros-indigo-myahrs-driver
$ rosrun myahrs_driver myahrs_driver _port:=/dev/ttyACM0
$ roslaunch myahrs_driver myahrs_driver.launch
(withrobot사의 myAHRS+)
RViz 실습 #3 (USB Camera)
19
$ sudo apt-get install ros-indigo-uvc-camera
$ sudo apt-get install ros-indigo-image-*
$ rosrun uvc_camera uvc_camera_node
$ rosrun uvc_camera uvc_camera_node _device:=/dev/video?
* Rviz의 Displays 옵션 변경
1) Fixed Frame 변경
Global Options > Fixed Frame = camera
2) 이미지 디스플레이 추가
rviz 좌측 하단의 Add 클릭한 후, Image 선택하여 추가한다.
(Add > by display > rviz > Image)
3) 토픽 값 변경
Image > Image Topic 의 값을 "/image_raw" 로 변경한다.
카메라가 2대 이상일 경우,
물음표 대신 사용하기 원하는
디바이스 번호를 입력 (특히, 노트북의 경우)
RViz 실습 #3 (USB Camera)
20
RViz 실습 #4 (Depth Camera)
21
$ cd ~/Downloads/
$ git clone https://github.com/PercATI/RealSense_ROS.git
$ cd RealSense_ROS/r200_install/
$ sh install.sh
$ cd ~/Downloads/RealSense_ROS/realsense_dist/2.3/
$ sh install_realsense_ros.sh
$ roslaunch realsense realsense_r200_launch.launch
* Rviz의 Displays 옵션 변경
1) Fixed Frame 변경
Global Options > Fixed Frame 을 "camera_depth_frame" 로 변경한다.
2) PointCloud2 추가 및 설정
rviz 좌측 하단의 Add 클릭한 후, PointCloud2를 선택하여 추가한다.
3) Topic 이름 및 세부 설정 변경
(RealSense의 경우)
RViz 실습 #4 (Depth Camera)
22
$ sudo apt-get install ros-indigo-openni2-camera ros-indigo-openni2-launch
$ tar -xvf Sensor-Bin-Linux-x64-v5.1.0.41.tar.bz2
$ cd Sensor-Bin-Linux-x64-v5.1.0.41/
$ sudo sh install.sh
$ roslaunch openni2_launch openni2.launch
* Rviz의 Displays 옵션 변경
1) Fixed Frame 변경
Global Options > Fixed Frame 을 "camera_depth_frame" 로 변경한다.
2) PointCloud2 추가 및 설정
rviz 좌측 하단의 Add 클릭한 후, PointCloud2를 선택하여 추가한다.
3) Topic 이름 및 세부 설정 변경
(*Xtion 구매시 CD안에 있음)
(ASUS사의 Xtion의 경우)
RViz 실습 #4 (Depth Camera)
23
RViz 실습 #5 (Robot Model)
• R2-D2 모델
24
$ sudo apt-get install ros-indigo-urdf-tutorial
$ roslaunch urdf_tutorial display.launch model:='$(find urdf_tutorial)'urdf/05-visual.urdf
RViz 실습 #6 (Navigation)
• 내비게이션 강의에서 진행
25
Xtion 을 구입하게 되면 동봉된 CD에 Xtion
드라이브
RViz 실습 #7 (Interactive Marker)
• 매니퓰레이션 강의에서 진행
26
Xtion 을 구입하게 되면 동봉된 CD에 Xtion
드라이브
Index
I. Command-Line Tools
II. Visualization Tool: RViz
III. GUI Tool Box: RQT
27
RQT: 플러그인 방식의 ROS의 종합 GUI 툴
• ROS Fuerte 버전부터는 rqt 라는 이름으로 기존의 rxbag, rxplot, rxgraph 등이 통폐합되어
rqt_bag, rqt_plot, rqt_graph 등을 플러그인으로 하는 ROS의 종합 GUI 툴로써 사용 가능해졌다.
• rqt는 Qt로 개발되어 있기 때문에 유저들이 자유롭게 플러그인을 개발하여 추가할 수도 있다.
• rqt의 대표적인 플러그인인 rqt_image_view, rqt_graph, rqt_plot, rqt_bag에 대해서 알아보도
록 하자.
• 참고로, 그 이외에도
• rqt_action, rqt_gui, rqt_plot, rqt_runtime_monitorrqt_bag, rqt_gui_cpp, rqt_pose_view,
rqt_rvizrqt_bag_plugins, rqt_gui_py, rqt_publisher, rqt_service_callerrqt_capabilities,
rqt_image_view, rqt_py_common, rqt_shellrqt_console, rqt_launch, rqt_py_console,
rqt_srvrqt_controller_manager, rqt_logger_level, rqt_reconfigure, rqt_tf_treerqt_dep, rqt_moveit,
rqt_robot_dashboard, rqt_toprqt_ez_publisher, rqt_msg, rqt_robot_monitor, rqt_topicrqt_graph,
rqt_nav_view, rqt_robot_steering, rqt_web
• 등의 플러그인이 존재한다. (헐 ㅡㅡ;;)
RQT 설치 및 실행
• RQT 설치
• RQT 실행
$ sudo apt-get install ros-indigo-rqt ros-indigo-rqt-common-plugins
$ rqt
RQT 플러그인 #1
1. 액션 (Action)
• Action Type Browser | Action 타입의 데이터 구조를 확인
2. 구성 (Configuration)
• Dynamic Reconfigure | 노드들에서 제공하는 설정값 변경을 위한 GUI 설정값 변경
• Launch | roslaunch 의 GUI 버전
3. 내성 (Introspection)
• Node Graph | 구동중인 노드들의 관계도 및 메시지의 흐름을 확인 가능한 그래프 뷰
• Package Graph | 노드의 의존 관계를 표시하는 그래프 뷰
• Process Monitor | 실행중인 노드들의 CPU사용률, 메모리사용륭, 스레드수 등을 확인
4. 로깅 (Logging)
• Bag | ROS 데이터 로깅
• Console | 노드들에서 발생되는 경고(Warning), 에러(Error) 등의 메시지를 확인
• Logger Level | ROS의 Debug, Info, Warn, Error, Fatal 로거 정보를 선택하여 표시
30
RQT 플러그인 #2
5. 다양한 툴 (Miscellaneous Tools)
• Python Console | 파이썬 콘솔 화면
• Shell | 쉘(shell)을 구동
• Web | 웹 브라우저를 구동
6. 로봇 (Robot)
• 사용하는 로봇에 따라 계기판(dashboard) 등의 플러그인을 이곳에 추가
7. 로봇툴 (Robot Tools)
• Controller Manager | 컨트롤러 제어에 필요한 플로그인
• Diagnostic Viewer | 로봇 디바이스 및 에러 확인
• Moveit! Monitor | 로봇 팔 계획에 사용되는 Moveit! 데이터를 확인
• Robot Steering | 로봇 조정 GUI 툴, 원격 조정에서 이 GUI 툴을 이용하여 로봇 조종
• Runtime Monitor | 실시간으로 노드들에서 발생되는 에러 및 경고를 확인
31
RQT 플러그인 #3
8. 서비스 (Services)
• Service Caller | 구동중인 서비스 서버에 접속하여 서비스를 요청
• Service Type Browser | 서비스 타입의 데이터 구조를 확인
9. 토픽 (Topics)
• Easy Message Publisher | 토픽을 GUI 환경에서 발행
• Topic Publisher | 토픽을 생성하여 발행
• Topic Type Browser | 토픽 타입의 데이터 구조 확인
• Topic Monitor | 사용자가 선택한 토픽의 정보를 확인
10. 시각화 (Visualization)
• Image View | 카메라의 영상 데이터를 확인
• Navigation Viewer | 로봇 네비게이션의 위치 및 목표지점 확인
• Plot | 2차원 데이터 플롯 GUI 플러그인, 2차원 데이터의 도식화
• Pose View | 현재 TF의 위치 및 모델의 위치 표시
• RViz | 3차원 시각화 툴인 RViz 플러그인
• TF Tree | tf 관계를 트리로 나타내는 그래프 뷰
32
RQT의 사용 예시
33http://www.ros.org/core-components/
RQT를 이용하면
1. GUI 형태로 ROS 이용 가능
2. GUI Tool 제작이 간단!
34
35
실습 시간
rqt_image_view
rqt_graph
rqt_plot
rqt_bag
RQT 실습 #1: rqt_image_view
36
$ rosrun uvc_camera uvc_camera_node
$ rqt (메뉴에서 [Plugins] → [Visualization] → [Image View] 를 선택한다.)
또는
$ rqt_image_view
RQT 실습 #2: rqt_graph
37
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
$ rosrun uvc_camera uvc_camera_node
$ rqt (메뉴에서 [Plugins] → [Introspection] → [Node_Graph] 를 선택한다.)
또는
$ rqt_graph
RQT 실습 #3: rqt_plot
38
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
$ rqt (메뉴에서 [Plugins] → [Visualization] → [Plot] 를 선택한다.)
또는
$ rqt_plot /turtle1/pose/
RQT 실습 #4: rqt_bag
39
$ rosrun uvc_camera uvc_camera_node
$ rosbag record /image_raw
$ rqt (메뉴에서 [Plugins] → [Logging] → [Bag] 를 선택한다.)
또는
$ rqt_bag
40
질문
대환영!
“hello world!”
[복습]
2016. 04. 20
Yoonseok Pyo
Open Source Team
42
무조건 따라하기 “hello world!”
• ROS판 “hello world!” 작성
• 메시지 통신 중 토픽을 이용하는 퍼블리셔 노드 작성
1) 패키지 생성
• 사용자가 패키지를 작성할 때 캐킨 빌드 시스템에 꼭 필요한 CMakeLists.txt
와 package.xml을 포함한 패키지 폴더를 생성한다.
43
$ catkin_create_pkg [패키지이름] [의존하는패키지1] [의존하는패키지n]
$ cd ~/catkin_ws/src
$ catkin_create_pkg my_first_ros_pkg std_msgs roscpp
$ cd ~/catkin_ws/src/my_first_ros_pkg
무조건 따라하기 “hello world!”
44
2) 패키지 설정 파일(package.xml) 수정
• 패키지 이름, 저작자, 라이선스, 의존성 패키지 등의 패키지 관련 정보
$ cd ~/catkin_ws/src/my_first_ros_pkg
$ gedit ./package.xml
<?xml version="1.0"?>
<package>
<name>my_first_ros_pkg</name>
<version>0.0.1</version>
<description>The my_first_ros_pkg package</description>
<maintainer email="pyo@robotis.com">Yoonseok Pyo</maintainer>
<license>BSD</license>
<url type="website">http://robotis.com</url>
<url type="repository">https://github.com/oroca/oroca_ros_tutorials.git</url>
<author email="pyo@robotis.com">Yoonseok Pyo</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>std_msgs</build_depend>
<build_depend>roscpp</build_depend>
<run_depend>std_msgs</run_depend>
<run_depend>roscpp</run_depend>
<export></export>
</package>
무조건 따라하기 “hello world!”
45
3) 빌드 설정 파일(CMakeLists.txt) 수정
• 실행 파일 생성, 의존성 패키지 우선 빌드, 링크 생성 등의 빌드 환경 정보
$ cd ~/catkin_ws/src/my_first_ros_pkg
$ gedit ./CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(my_first_ros_pkg)
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
catkin_package(
INCLUDE_DIRS include
CATKIN_DEPENDS roscpp std_msgs
DEPENDS system_lib
)
include_directories(${catkin_INCLUDE_DIRS})
add_executable(hello_world_node src/hello_world_node.cpp)
add_dependencies(hello_world_node my_first_ros_pkg_generate_messages_cpp)
target_link_libraries(hello_world_node ${catkin_LIBRARIES})
무조건 따라하기 “hello world!”
46
4) 소스 코드 작성
$ cd ~/catkin_ws/src/my_first_ros_pkg/src
$ gedit ./hello_world_node.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "hello_world_node");
ros::NodeHandle nh;
ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("say_hello_world", 1000);
ros::Rate loop_rate(10);
int count = 0;
무조건 따라하기 “hello world!”
47
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world!" << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
무조건 따라하기 “hello world!”
48
5) 패키지 빌드
6) roscore 실행
7) 노드 실행
$ rospack profile
$ cd ~/catkin_ws
$ catkin_make
(혹은 다음과 같이 함께 사용하여 1라인으로 처리)
$ cd ~/catkin_ws && catkin_make
$ roscore
(이미 실행되어 있다면 생략)
$ rosrun my_first_ros_pkg hello_world_node
[INFO] [1423443540.131775283]: hello world! 0
[INFO] [1423443540.231826916]: hello world! 1
[INFO] [1423443540.331798085]: hello world! 2
[INFO] [1423443540.431796634]: hello world! 3
…
무조건 따라하기 “hello world!”
• rqt_graph
• rostopic
49
$ rosrun rqt_graph rqt_graph
$ rostopic list
/rosout
/rosout_agg
/say_hello_world
$ rostopic info /say_hello_world
Type: std_msgs/String
Publishers:
* /hello_world_node (http://localhost:51083/)
Subscribers: None
$ rostopic hz /say_hello_world
subscribed to [/say_hello_world]
average rate: 9.999 min: 0.100s max: 0.100s std dev: 0.00001s window: 10
무조건 따라하기 “hello world!”
• rqt_topic
• 송/수신 테스트
50
$ rosrun rqt_topic rqt_topic
$ rostopic echo /say_hello_world
data: hello world!109
---
data: hello world!110
---
data: hello world!111
---
…
$ rosrun rqt_graph rqt_graph
ctrl + c
51
질문
대환영!
ROS 기본 프로그래밍
2016. 04. 20
Yoonseok Pyo
Open Source Team
53
자~ 오늘은
Topic: 퍼블리셔, 서브스크라이버
Service: 서비스 서버, 서비스 클라이언트
작성에 들어갑니다.
54
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
55
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
56
ROS 메시지 통신
57
토픽(Topic)
58
서비스(Service)
59
매개변수(Parameter)
60
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
61
Topic / Publisher / Subscriber
• ROS에서는 단방향 통신일때 ‘Topic’ 이라는 메시지 통신을 사용한다.
이때 송신 측을 ‘Publisher’, 수신 측을 ‘Subscriber’라고 부른다.
1) 패키지 생성
62
$ cd ~/catkin_ws/src
$ catkin_create_pkg oroca_ros_tutorials std_msgs roscpp
$ cd ~/catkin_ws/src/oroca_ros_tutorials
$ ls
include → 헤더 파일 폴더
src → 소스 코드 폴더
CMakeLists.txt → 빌드 설정 파일
package.xml → 패키지 설정 파일
Topic / Publisher / Subscriber
2) 패키지 설정 파일(package.xml) 수정
• ROS의 필수 설정 파일 중 하나인 package.xml은 패키지 정보를 담은 XML 파일로서 패키지 이름, 저작자,
라이선스, 의존성 패키지 등을 기술하고 있다.
63
$ gedit package.xml
<?xml version="1.0"?>
<package>
<name>oroca_ros_tutorials</name>
<version>0.1.0</version>
<description>The oroca_ros_tutorials package</description>
<maintainer email="passionvirus@gmail.com">Yoonseok Pyo</maintainer>
<url type="website">http://oroca.org</url>
<url type="repository">https://github.com/oroca/oroca_ros_tutorials.git</url>
<author email="passionvirus@gmail.com">Yoonseok Pyo</author>
<license>BSD</license>
Topic / Publisher / Subscriber
64
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>message_runtime</run_depend>
<export></export>
</package>
Topic / Publisher / Subscriber
3) 빌드 설정 파일(CMakeLists.txt) 수정
65
$ gedit CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(oroca_ros_tutorials)
## 캐킨 빌드를 할 때 요구되는 구성요소 패키지이다.
## 의존성 패키지로 roscpp, std_msgs, message_generation이며 이 패키지들이 존재하지 않으면 빌드 도중에 에러가 난다.
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation)
## 메시지 선언: msgTutorial.msg
add_message_files(FILES msgTutorial.msg)
## 의존하는 메시지를 설정하는 옵션이다.
## std_msgs가 설치되어 있지 않다면 빌드 도중에 에러가 난다.
generate_messages(DEPENDENCIES std_msgs)
## 캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다.
catkin_package(
#INCLUDE_DIRS include
LIBRARIES oroca_ros_tutorials
CATKIN_DEPENDS roscpp std_msgs
DEPENDS system_lib
)
Topic / Publisher / Subscriber
66
## 인클루드 디렉터리를 설정한다.
include_directories(include ${catkin_INCLUDE_DIRS})
## ros_tutorial_msg_publisher 노드에 대한 빌드 옵션이다.
## 실행 파일, 타겟 링크 라이브러리, 추가 의존성 등을 설정한다.
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp)
## ros_tutorial_msg_subscriber 노드에 대한 빌드 옵션이다.
add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp)
Topic / Publisher / Subscriber
4) 메시지 파일 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 옵션을 넣었다.
• 노드에서 사용할 메시지인 msgTutorial.msg를 빌드할 때 포함하라는 이야기
• int32 (메시지 형식), data (메시지 이름)
• 메시지 타입은 int32 이외에도 bool, int8, int16, float32, string, time, duration
등의 메시지 기본 타입과 ROS 에서 많이 사용되는 메시지를 모아놓은
common_msgs 등도 있다. 여기서는 간단한 예제를 만들어 보기 위한 것으로
int32를 이용하였다.
67
$ roscd oroca_ros_tutorials → 패키지 폴더로 이동
$ mkdir msg → 패키지에 msg라는 메시지 폴더를 신규 작성
$ cd msg → 작성한 msg 폴더로 이동
$ gedit msgTutorial.msg → msgTutorial.msg 파일 신규 작성 및 내용 수정
int32 data
add_message_files(FILES msgTutorial.msg)
Topic / Publisher / Subscriber
5) 퍼블리셔 노드 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다.
• src 폴더의 ros_tutorial_msg_publisher.cpp라는 파일을 빌드하여
ros_tutorial_msg_publisher라는 실행 파일을 만들라는 이야기
68
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
$ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동
$ gedit ros_tutorial_msg_publisher.cpp → 소스 파일 신규 작성 및 내용 수정
#include "ros/ros.h" // ROS 기본 헤더파일
#include "oroca_ros_tutorials/msgTutorial.h“ // msgTutorial 메시지 파일 헤더 (빌드후 자동 생성됨)
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "ros_tutorial_msg_publisher"); // 노드명 초기화
ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언
Topic / Publisher / Subscriber
69
// 발행자 선언, oroca_ros_tutorials 패키지의 msgTutorial 메시지 파일을 이용한
// 발행자 ros_tutorial_pub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,
// 발행자 큐(queue) 사이즈를 100개로 설정한다는 것이다
ros::Publisher ros_tutorial_pub = nh.advertise<oroca_ros_tutorials::msgTutorial>("ros_tutorial_msg", 100);
ros::Rate loop_rate(10); // 루프 주기를 설정한다. "10" 이라는 것은 10Hz를 말하는 것으로 0.1초 간격으로 반복된다
int count = 0; // 메시지에 사용될 변수 선언
while (ros::ok())
{
oroca_ros_tutorials::msgTutorial msg; // msgTutorial 메시지 파일 형식으로 msg 라는 메시지를 선언
msg.data = count; // count 라는 변수를 이용하여 메시지 값을 정한다
ROS_INFO("send msg = %d", count); // ROS_INFO 라는 ROS 함수를 이용하여 count 변수를 표시한다
ros_tutorial_pub.publish(msg); // 메시지를 발행한다. 약 0.1초 간격으로 발행된다
loop_rate.sleep(); // 위에서 정한 루프 주기에 따라 슬립에 들어간다
++count; // count 변수 1씩 증가
}
return 0;
}
Topic / Publisher / Subscriber
6) 서브스크라이버 노드 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다.
• 즉, ros_tutorial_msg_subscriber.cpp라는 파일을 빌드하여
ros_tutorial_msg_subscriber라는 실행 파일을 만들라는 이야기
70
add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
$ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동
$ gedit ros_tutorial_msg_subscriber.cpp → 소스 파일 신규 작성 및 내용 수정
#include "ros/ros.h" // ROS 기본 헤더파일
#include "oroca_ros_tutorials/msgTutorial.h" // msgTutorial 메시지 파일 헤더 (빌드후 자동 생성됨)
// 메시지 콜백함수로써, ros_tutorial_sub 구독자에 해당되는 메시지를 수신하였을 때 동작하는 함수이다
// 입력 메시지로는 oroca_ros_tutorial 패키지의 msgTutorial 메시지를 받도록 되어있다
void msgCallback(const oroca_ros_tutorials::msgTutorial::ConstPtr& msg)
{
ROS_INFO("recieve msg: %d", msg->data); // 수신된 메시지를 표시하는 함수
}
Topic / Publisher / Subscriber
71
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "ros_tutorial_msg_subscriber"); // 노드명 초기화
ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언
// 구독자 선언, oroca_ros_tutorials 패키지의 msgTutorial 메시지 파일을 이용한
// 구독자 ros_tutorial_sub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며,
// 구독자 큐(queue) 사이즈를 100개로 설정한다는 것이다
ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 100, msgCallback);
// 콜백함수 호출을 위한 함수로써, 메시지가 수신되기를 대기, 수신되었을 경우 콜백함수를 실행한다
ros::spin();
return 0;
}
Topic / Publisher / Subscriber
7) ROS 노드 빌드
• 다음 명령어로 oroca_ros_tutorials 패키지의 메시지 파일, 퍼블리셔 노드, 서브스
크라이버 노드를 빌드하자.
• [참고] 파일시스템
• oroca_ros_tutorials 패키지의 소스 코드 파일: ~/catkin_ws/src/oroca_ros_tutorials/src
• oroca_ros_tutorials 패키지의 메시지 파일: ~/catkin_ws/src/oroca_ros_tutorials/msg
• 빌드된 결과물은 /catkin_ws의 /build와 /devel 폴더에 각각 생성
• /build 폴더에는 캐킨 빌드에서 사용된 설정 내용이 저장
• /devel/lib/oroca_ros_tutorials 폴더에는 실행 파일이 저장
• /devel/include/oroca_ros_tutorials 폴더에는 메시지 파일로부터 자동 생성된 메시지 헤더 파일이 저장
72
$ cd ~/catkin_ws → catkin 폴더로 이동
$ catkin_make → catkin 빌드 실행
Topic / Publisher / Subscriber
8) 퍼블리셔 실행
• ROS 노드 실행 명령어인 rosrun을 이용하여, oroca_ros_tutorials 패
키지의 ros_tutorial_msg_publisher 노드를 구동하라는 명령어
73
$ rosrun oroca_ros_tutorials ros_tutorial_msg_publisher
[참고로 노드 실행에 앞서 roscore를 실행하는 것을 잊지 말자.]
Topic, Publisher, Subscriber
• [참고] rostopic
• rostopic 명령어를 이용하여 현재 ROS 네트워크에서 사용 중인 토픽 목록,
주기, 데이터 대역폭, 내용 확인 등이 가능하다.
74
$ rostopic list
/ros_tutorial_msg
/rosout
/rosout_agg
$ rostopic echo /ros_tutorial_msg
Topic / Publisher / Subscriber
9) 서브스크라이버 실행
• ROS 노드 실행 명령어인 rosrun을 이용하여, oroca_ros_tutorials 패
키지의 ros_tutorial_msg_subscriber 노드를 구동하라는 명령어
75
$ rosrun oroca_ros_tutorials ros_tutorial_msg_subscriber
Topic / Publisher / Subscriber
10) 실행된 노드들의 통신 상태 확인
76
$ rqt_graph
$ rqt [플러그인(Plugins)] → [인트로스펙션(Introspection)] → [노드 그래프(Node Graph)
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
77
Service / Service server / Service client
• 서비스는 요청(request)이 있을 때만 응답(response)하는 서비스 서버
(service server)와 요청하고 응답받는 서비스 클라이언트(service client)로
나뉜다. 서비스는 토픽과는 달리 일회성 메시지 통신이다. 따라서 서비스
의 요청과 응답이 완료되면 연결된 두 노드는 접속이 끊긴다.
• 이러한 서비스는 로봇에 특정 동작을 수행하도록 요청할 때에 명령어로써
많이 사용된다. 혹은 특정 조건에 따라 이벤트를 발생해야 할 노드에 사용
된다. 또한, 일회성 통신 방식이라서 네트워크에 부하가 적기 때문에 토픽
을 대체하는 수단으로도 사용되는 등 매우 유용한 통신수단이다.
• 이번 강의에서는 간단한 서비스 파일을 작성해보고, 서비스 서버(server)
노드와 서비스 클라이언트(client) 노드를 작성하고 실행하는 것을 목적으
로 한다.
• 참고로 앞 절에서 이미 oroca_ros_tutorials라는 패키지를 생성하였으므로
패키지 생성은 생략하며, 패키지 정보를 담은 package.xml 파일도 수정할
부분이 없으므로 생략한다.
78
Service / Service server / Service client
1) 빌드 설정 파일(CMakeLists.txt) 수정
• 이전에 작성한 oroca_ros_tutorials 패키지에 새로운 서비스 서버 노
드, 서비스 클라이언트 노드, 서비스 파일(*.srv)을 추가하기 위하여
다음 예제와 같이 oroca_ros_tutorials 패키지로 이동한 후에
CMakeLists.txt 파일을 수정하도록 하자.
79
$ roscd oroca_ros_tutorials
$ gedit CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(oroca_ros_tutorials)
## 캐킨 빌드를 할 때 요구되는 구성요소 패키지이다.
## 의존성 패키지로 roscpp, std_msgs, message_generation이며 이 패키지들이 존재하지 않으면 빌드
도중에 에러가 난다.
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation)
Service / Service server / Service client
80
## 메시지 선언: msgTutorial.msg
## 서비스 선언: srvTutorial.srv
add_message_files(FILES msgTutorial.msg)
add_service_files(FILES srvTutorial.srv)
## 의존하는 메시지를 설정하는 옵션이다.
## std_msgs가 설치되어 있지 않다면 빌드 도중에 에러가 난다.
generate_messages(DEPENDENCIES std_msgs)
## 캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다.
catkin_package(
INCLUDE_DIRS include
LIBRARIES oroca_ros_tutorials
CATKIN_DEPENDS roscpp std_msgs
DEPENDS system_lib
)
Service / Service server / Service client
81
## 인클루드 디렉터리를 설정한다.
include_directories(include ${catkin_INCLUDE_DIRS})
## ros_tutorial_msg_publisher 노드에 대한 빌드 옵션이다.
## 실행 파일, 타겟 링크 라이브러리, 추가 의존성 등을 설정한다.
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp)
## ros_tutorial_msg_subscriber 노드에 대한 빌드 옵션이다.
add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp)
# ros_tutorial_srv_server 노드에 대한 빌드 옵션이다.
add_executable(ros_tutorial_srv_server src/ros_tutorial_srv_server.cpp)
target_link_libraries(ros_tutorial_srv_server ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_srv_server oroca_ros_tutorials_generate_messages_cpp)
# ros_tutorial_srv_client 노드에 대한 빌드 옵션이다.
add_executable(ros_tutorial_srv_client src/ros_tutorial_srv_client.cpp)
target_link_libraries(ros_tutorial_srv_client ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_srv_client oroca_ros_tutorials_generate_messages_cpp)
Service / Service server / Service client
2) 서비스 파일 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 옵션을 넣었다.
• 노드에서 사용할 메시지인 srvTutorial.srv를 빌드할 때 포함하라는 이야기
• int64 (메시지 형식), a, b (서비스 요청: request), result (서비스 응답: response),
‘---’ (요청과 응답을 구분하는 구분자)
82
$ roscd oroca_ros_tutorials → 패키지 폴더로 이동
$ mkdir srv → 패키지에 srv라는 서비스 폴더를 신규 작성
$ cd srv → 작성한 srv 폴더로 이동
$ gedit srvTutorial.srv → srvTutorial.srv 파일 신규 작성 및 내용 수정
int64 a
int64 b
---
int64 result
add_service_files(FILES srvTutorial.srv)
Service / Service server / Service client
3) 서비스 서버 노드 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다.
• src 폴더의 ros_tutorial_srv_server.cpp라는 파일을 빌드하여
ros_tutorial_srv_server라는 실행 파일을 만들라는 이야기
83
add_executable(ros_tutorial_srv_server src/ros_tutorial_srv_server.cpp)
$ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동
$ gedit ros_tutorial_srv_server.cpp → 소스 파일 신규 작성 및 내용 수정
#include "ros/ros.h" // ROS 기본 헤더 파일
#include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더
Service / Service server / Service client
84
// 서비스 요청이 있을 경우, 아래의 처리를 수행한다.
// 서비스 요청은 req, 서비스 응답은 res로 설정하였다.
bool calculation(oroca_ros_tutorials::srvTutorial::Request &req,
oroca_ros_tutorials::srvTutorial::Response &res)
{
// 서비스 요청시 받은 a와 b 값을 더하여 서비스 응답값에 저장한다.
res.result = req.a + req.b;
// 서비스 요청에 사용된 a, b 값의 표시 및 서비스 응답에 해당되는 result 값을 출력한다.
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.result);
return true;
}
Service / Service server / Service client
85
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "ros_tutorial_srv_server"); // 노드명 초기화
ros::NodeHandle nh; // 노드 핸들 선언
// 서비스 서버 선언,
// oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한
// 서비스 서버 ros_tutorial_service_server를 작성한다.
// 서비스명은 ros_tutorial_srv이며 서비스 요청이 있을 때,
// calculation라는 함수를 실행하라는 설정이다.
ros::ServiceServer ros_tutorial_service_server = nh.advertiseService("ros_tutorial_srv", calculation);
ROS_INFO("ready srv server!");
ros::spin(); // 서비스 요청을 대기한다
return 0;
}
Service / Service server / Service client
4) 서비스 클라이언트 노드 작성
• 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다.
• src 폴더의 ros_tutorial_srv_client.cpp라는 파일을 빌드하여
ros_tutorial_srv_client라는 실행 파일을 만들라는 이야기
86
add_executable(ros_tutorial_srv_client src/ros_tutorial_srv_client.cpp)
$ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동
$ gedit ros_tutorial_srv_client.cpp → 소스 파일 신규 작성 및 내용 수정
#include "ros/ros.h" // ROS 기본 헤더 파일
#include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더
#include <cstdlib> // atoll 함수 사용을 위한 라이브러리
Service / Service server / Service client
87
// 노드 메인 함수
int main(int argc, char **argv)
{
// 노드명 초기화
ros::init(argc, argv, "ros_tutorial_srv_client");
// 입력값 오류 처리
if (argc != 3)
{
ROS_INFO("cmd : rosrun ros_tutorial ros_tutorial_service_client arg0 arg1");
ROS_INFO("arg0: double number, arg1: double number");
return 1;
}
// ROS 시스템과 통신을 위한 노드 핸들 선언
ros::NodeHandle nh;
// 서비스 클라이언트 선언, oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한
// 서비스 클라이언트 ros_tutorial_service_client를 작성한다.
// 서비스명은 "ros_tutorial_srv"이다
ros::ServiceClient ros_tutorial_service_client = nh.serviceClient<oroca_ros_
tutorials::srvTutorial>("ros_tutorial_srv");
Service / Service server / Service client
88
// srv라는 이름으로 srvTutorial 서비스 파일을 이용하는 서비스 파일을 선언한다.
oroca_ros_tutorials::srvTutorial srv;
// 서비스 요청 값으로 노드가 실행될 때 입력으로 사용된 매개변수를 각각의 a, b에 저장한다.
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
// 서비스를 요청하고, 요청이 받아들여졌을 경우, 응답 값을 표시한다.
if (ros_tutorial_service_client.call(srv))
{
ROS_INFO("send srv, srv.Request.a and b: %ld, %ld", (long int)srv.request.a, (long int)srv.request.b);
ROS_INFO("receive srv, srv.Response.result: %ld", (long int)srv.response.result);
}
else
{
ROS_ERROR("Failed to call service ros_tutorial_srv");
return 1;
}
return 0;
}
Service / Service server / Service client
5) ROS 노드 빌드
• 다음 명령어로 oroca_ros_tutorials 패키지의 서비스 파일, 서비스 서버 노
드와 클라이언트 노드를 빌드한다.
• [참고] 파일시스템
• oroca_ros_tutorials 패키지의 소스 코드 파일: ~/catkin_ws/src/oroca_ros_tutorials/src
• oroca_ros_tutorials 패키지의 메시지 파일: ~/catkin_ws/src/oroca_ros_tutorials/msg
• 빌드된 결과물은 /catkin_ws의 /build와 /devel 폴더에 각각 생성
• /build 폴더에는 캐킨 빌드에서 사용된 설정 내용이 저장
• /devel/lib/oroca_ros_tutorials 폴더에는 실행 파일이 저장
• /devel/include/oroca_ros_tutorials 폴더에는 메시지 파일로부터 자동 생성된 메시지 헤
더 파일이 저장
89
$ cd ~/catkin_ws && catkin_make → catkin 폴더로 이동 후 catkin 빌드 실행
Service / Service server / Service client
6) 서비스 서버 실행
• 서비스 서버는 서비스 요청이 있기 전까지 아무런 처리를 하지 않고
기다리도록 프로그래밍하였다. 그러므로 다음 명령어를 실행하면 서
비스 서버는 서비스 요청을 기다린다.
90
[참고로 노드 실행에 앞서 roscore를 실행하는 것을 잊지 말자.]
$ rosrun oroca_ros_tutorials ros_tutorial_srv_server
[INFO] [1423118250.6704810023]: ready srv server!
Service / Service server / Service client
7) 서비스 클라이언트 실행
• 서비스 서버를 실행했으면 이어서 다음 명령어로 서비스 클라이언트를 실행한다.
• 서비스 클라이언트를 실행하면서 입력해준 실행 매개변수 2와 3을 서비스 요청 값으로
전송하도록 프로그래밍하였다.
• 2와 3은 각각 a, b 값으로 서비스를 요청하게 되고, 결괏값으로 둘의 합인 5를 응답값으
로 전송받았다.
• 여기서는 단순하게 실행 매개변수로 이를 이용하였으나, 실제 활용에서는 명령어로 대
체해도 되고, 계산되어야 할 값, 트리거용 변수 등을 서비스 요청 값으로 사용할 수도
있다.
91
$ rosrun oroca_ros_tutorials ros_tutorial_srv_client 2 3
[INFO] [1423118255.156345643]: send srv, srv.Request.a and b: 2, 3
[INFO] [1423118255.156345021]: recieve srv, srv.Response.result: 5
Service / Service server / Service client
[참고] rqt_graph
• 서비스는 아래 그림의 토픽과는 달리 일회성이므로 rqt_graph 등에
서 확인할 수 없다.
92
Service / Service server / Service client
[참고] rosservice call 명령어 사용 방법
• 서비스 요청은 서비스 클라이언트 노드를 실행하는 방법도 있지만
“rosservice call”이라는 명령어나 rqt의 ServiceCaller를 이용하는 방
법도 있다.
• 그 중 우선, rosservice call를 사용하는 방법에 대해서 알아보자.
93
$ rosservice call /ros_tutorial_srv 3 4
result: 7
$ rosservice call /ros_tutorial_srv 5 15
result: 20
Service / Service server / Service client
[참고] GUI 도구인 Service Caller 사용 방법
• ROS의 GUI 도구인 rqt를 실행하자.
• rqt 프로그램의 메뉴에서 [플러그인(Plugins)] → [서비스(Service)] →
[Service Caller]를 선택하면 다음과 같은 화면이 나온다.
(1) servic에 /ros_tutorial_srv 입력
(2) a = 10, b = 5 입력
(3) Call 버튼을 누른다.
(4) Result에 15라는 값이 표시된다.
94
$ rqt
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
95
Parameter
1) 매개변수를 활용한 노드 작성
• 이전 강의에서는 작성한 서비스 서버와 클라이언트 노드에서 ros_tutorial_srv_server.cpp 소스를
수정하여 서비스 요청으로 입력된 a와 b를 단순히 덧셈하는 것이 아니라, 사칙연산을 할 수 있
도록 매개변수를 활용해 볼 것이다.
• 다음 순서대로 ros_tutorial_srv_server.cpp 소스를 수정해보자.
96
$ roscd oroca_ros_tutorials/src → 패키지의 소스 코드 폴더인 src 폴더로 이동
$ gedit ros_tutorial_srv_server.cpp → 소스 파일 내용 수정
#include "ros/ros.h" // ROS 기본 헤더파일
#include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더 (빌드 후 자동 생성됨)
#define PLUS 1 // 덧셈
#define MINUS 2 // 빼기
#define MULTIPLICATION 3 // 곱하기
#define DIVISION 4 // 나누기
int g_operator = PLUS;
Parameter
97
// 서비스 요청이 있을 경우, 아래의 처리를 수행한다
// 서비스 요청은 req, 서비스 응답은 res로 설정하였다
bool calculation(oroca_ros_tutorials::srvTutorial::Request &req,
oroca_ros_tutorials::srvTutorial::Response &res)
{
// 서비스 요청시 받은 a와 b 값을 파라미터 값에 따라 연산자를 달리한다.
// 계산한 후 서비스 응답 값에 저장한다
switch(g_operator){
case PLUS:
res.result = req.a + req.b; break;
case MINUS:
res.result = req.a - req.b; break;
case MULTIPLICATION:
res.result = req.a * req.b; break;
Parameter
98
case DIVISION:
if(req.b == 0){
res.result = 0; break;
}
else{
res.result = req.a / req.b; break;
}
default:
res.result = req.a + req.b; break;
}
// 서비스 요청에 사용된 a, b값의 표시 및 서비스 응답에 해당되는 result 값을 출력한다
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.result);
return true;
}
Parameter
99
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "ros_tutorial_srv_server"); // 노드명 초기화
ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언
nh.setParam("calculation_method", PLUS); // 매개변수 초기설정
// 서비스 서버 선언, oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한
// 서비스 서버 ros_tutorial_service_server 를 작성한다. 서비스명은 "ros_tutorial_srv" 이며,
// 서비스 요청이 있을경우, calculation 라는 함수를 실행하라는 설정이다
ros::ServiceServer ros_tutorial_service_server = nh.advertiseService("ros_tutorial_srv", calculation);
ROS_INFO("ready srv server!");
Parameter
• Parameter 관련하여 설정(setParam) 및 읽기(getParam) 사용법에 주목 할 것!
[참고] 매개변수로 사용 가능 형태
• 매개변수는 integers, floats, boolean, string, dictionaries, list 등으로 설정할 수 있다.
• 간단히 예를 들자면, 1은 integer, 1.0은 floats, “internetofthings”은 string, true는
boolean, [1,2,3]은 integers의 list, a: b, c: d는 dictionary이다.
100
ros::Rate r(10); // 10 hz
while (1)
{
nh.getParam("calculation_method", g_operator); // 연산자를 매개변수로부터 받은 값으로 변경한다
ros::spinOnce(); // 콜백함수 처리루틴
r.sleep(); // 루틴 반복을 위한 sleep 처리
}
return 0;
}
Parameter
2) 노드 빌드 및 실행
3) 매개변수 목록 보기
• “rosparam list” 명령어로 현재 ROS 네트워크에 사용된 매개변수의
목록을 확인할 수 있다. /calculation_method가 우리가 사용한 매개
변수이다.
101
$ cd ~/catkin_ws && catkin_make
$ rosrun oroca_ros_tutorials ros_tutorial_srv_server
[INFO] [1423118250.6704810023]: ready srv server!
$ rosparam list
/calculation_method
/rosdistro
/rosversion
/run_id
Parameter
4) 매개변수 사용 예
• 다음 명령어대로 매개변수를 설정하여, 매번 같은 서비스 요청을 하여 서비스 처리가 달라짐을 확인해보자.
• ROS에서 매개변수는 노드 외부로부터 노드의 흐름이나 설정, 처리 등을 을 바꿀 수 있다. 매우 유용한 기
능이므로 지금 당장 쓰지 않더라도 꼭 알아두도록 하자.
102
$ rosservice call /ros_tutorial_srv 10 5 → 사칙연산의 변수 a, b 입력
result: 15 → 디폴트 사칙연산인 덧셈 결괏값
$ rosparam set /calculation_method 2 → 뺄셈
$ rosservice call /ros_tutorial_srv 10 5
result: 5
$ rosparam set /calculation_method 3 → 곱셈
$ rosservice call /ros_tutorial_srv 10 5
result: 50
$ rosparam set /calculation_method 4 → 나눗셈
$ rosservice call /ros_tutorial_srv 10 5
result: 2
Index
I. 메시지, 토픽, 서비스, 매개변수
II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행
III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행
IV. 매개변수 사용법
V. roslaunch 사용법
103
roslaunch 사용법
• rosrun이 하나의 노드를 실행하는 명령어하는 명령어 이다.
• roslaunch는 하나 이상의 정해진 노드를 실행시킬 수 있다.
• 그 밖의 기능으로 노드를 실행할 때 패키지의 매개변수나 노드 이름
변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH
설정, 환경 변수 변경 등의 옵션을 붙일 수 있는 ROS 명령어이다.
• roslaunch는 ‘*.launch’라는 파일을 사용하여 실행 노드를 설정하는데
이는 XML 기반이며, 태그별 옵션을 제공한다.
• 실행 명령어는 “roslaunch [패키지명] [roslaunch 파일]”이다.
104
roslaunch 사용법
1) roslaunch의 활용
• 이전에 작성한 ros_tutorial_msg_publisher와 ros_tutorial_msg_subscriber 노드
의 이름을 바꾸어서 실행해 보자. 이름만 바꾸면 의미가 없으니, 퍼블리쉬 노드
와 서브스크라이버 노드를 각각 두 개씩 구동하여 서로 별도의 메시지 통신을
해보자.
• 우선, *.launch 파일을 작성하자. roslaunch에 사용되는 파일은 *.launch라는 파
일명을 가지며 해당 패키지 폴더에 launch라는 폴더를 생성하고 그 폴더 안에
넣어야 한다. 다음 명령어대로 폴더를 생성하고 union.launch라는 새 파일을 생
성해보자.
105
$ roscd oroca_ros_tutorials
$ mkdir launch
$ cd launch
$ gedit union.launch
roslaunch 사용법
• <launch> 태그 안에는 roslaunch 명령어로 노드를 실행할 때 필요
한 태그들이 기술된다. <node>는 roslaunch로 실행할 노드를 기술
하게 된다. 옵션으로는 pkg, type, name이 있다.
• pkg 패키지의 이름
• type 실제 실행할 노드의 이름(노드명)
• name 위 type에 해당하는 노드가 실행될 때 붙여지는 이름(실행명), 일반
적으로는 type과 같게 설정하지만 필요에 따라 실행할 때 이름을 변경하도록
설정할 수 있다.
106
<launch>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher1"/>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber1"/>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher2"/>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber2"/>
</launch>
roslaunch 사용법
• roslaunch 파일을 작성하였으면 다음처럼 union.launch를 실행하자.
• [참고] roslaunch 사용시에 상태 출력 방법
• roslaunch 명령어로여럿의 노드가 실행될 때는 실행되는 노드들의 출력(info,
error 등)이 터미널 스크린에 표시되지 않아 디버깅하기 어렵게 된다. 이때에
--screen 옵션을 추가해주면 해당 터미널에 실행되는 모든 노드들의 출력들
이 터미널 스크린에 표시된다.
107
$ roslaunch oroca_ros_tutorials union.launch --screen
roslaunch 사용법
• 실행 결과?
• 결과적으로 ros_tutorial_msg_publisher 노드가 msg_publisher1와
msg_publisher2로 이름이 바뀌어 두 개의 노드가 실행되었다.
• ros_tutorial_msg_subscriber 노드도 msg_subscriber1와
msg_subscriber2로 이름이 바뀌어 실행되었다.
108
$ rosnode list
/msg_publisher1
/msg_publisher2
/msg_subscriber1
/msg_subscriber2
/rosout
roslaunch 사용법
• 문제는 “퍼블리쉬 노드와 서브스크라이버 노드를 각각 두 개씩 구동하여 서로
별도의 메시지 통신하게 한다”는 처음 의도와는 다르게 rqt_graph를 통해 보면
서로의 메시지를 모두 서브스크라이브하고 있다는 것이다.
• 이는 단순히 실행되는 노드의 이름만을 변경해주었을 뿐 사용되는 메시지의 이
름을 바꿔주지 않았기 때문이다.
• 이 문제를 다른 roslaunch 네임스페이스 태그를 사용하여 해결해보자.
109
roslaunch 사용법
• union.launch을 수정하자.
110
$ roscd oroca_ros_tutorials/launch
$ gedit union.launch
<launch>
<group ns="ns1">
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher"/>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber"/>
</group>
<group ns="ns2">
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher"/>
<node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber"/>
</group>
</launch>
roslaunch 사용법
• 변경 후의 실행된 노드들의 모습
111
roslaunch 사용법
2) launch 태그
<launch> roslaunch 구문의 시작과 끝을 가리킨다.
<node> 노드 실행에 대한 태그이다. 패키지, 노드명, 실행명을 변경할 수 있다.
<machine> 노드를 실행하는 PC의 이름, address, ros-root, ros-package-path 등을
설정할 수 있다.
<include> 다른 패키지나 같은 패키지에 속해 있는 다른 launch를 불러와
하나의 파일처럼 실행할 수 있다.
<remap> 토픽 이름 등의 노드에서 사용 중인 ROS 변수의 이름을 변경할 수 있다.
<env> 환경 변수를 변경한다.
<param> ROS 매개변수를 변경한다
<rosparam> 파라미터를 설정한다.
<group> 실행되는 노드를 그룹화할 때 사용한다.
<test> 노드를 테스트할 때 사용한다.
<node>와 비슷하지만 테스트에 사용할 수 있는 옵션들이 추가되어 있다.
<arg> 변수를 정의할 수 있어서 주소 및 대체 이름 등에 사용한다.
112
이번 강좌의 리포지토리
• Example 리포지토리
• https://github.com/oroca/oroca_ros_tutorials
• 웹에서 바로 보거나 다운로드도 가능하지만 바로 적용해 보고 싶다
면 다음 명령어로 리포지토리를 복사하여 빌드하면 된다.
• 참고로 본 강의의 최종판 소스코드가 업로드 되어 있기에 강의 진행
을 위해 도중에 수정된 소스코드는 최종 버전만 확인 할 수 있다.
113
$ cd ~/catkin_ws/src
$ git clone https://github.com/oroca/oroca_ros_tutorials.git
$ cd ~/catkin_ws
$ catkin_make
114
질문
대환영!
국내 유일! 최초! ROS 책
비 영어권 최고의 책
인세 전액 기부
여기서! 광고 하나 나가요~
여기서! 광고 둘 나가요~
• 오로카
• www.oroca.org
• 오픈 로보틱스 지향
• 풀뿌리 로봇공학의 저변 활성화
• 열린 강좌, 세미나, 프로젝트 진행
• 로봇공학을 위한 열린 모임 (KOS-ROBOT)
• www.facebook.com/groups/KoreanRobotics
• 로봇공학 통합 커뮤니티 지향
• 일반인과 전문가가 어울러지는 한마당
• 로봇공학 소식 공유
• 연구자 간의 협력
혼자 하기에 답답하시다고요?
커뮤니티에서 함께 해요~
Yoonseok Pyo
pyo@robotis.com
www.robotpilot.net
표윤석
www.facebook.com/yoonseok.pyo
또~ 봬요!
*^^*
끝.
Thanks for your attention!
표윤석
119
Yoonseok Pyo
pyo@robotis.com
www.robotpilot.net
표윤석
www.facebook.com/yoonseok.pyo

More Related Content

What's hot

Robot Control using ROS: an Introduction
Robot Control using ROS: an IntroductionRobot Control using ROS: an Introduction
Robot Control using ROS: an IntroductionJago Robotika Indonesia
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D흥배 최
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
Stefano Cordibella - An introduction to Yocto Project
Stefano Cordibella - An introduction to Yocto ProjectStefano Cordibella - An introduction to Yocto Project
Stefano Cordibella - An introduction to Yocto Projectlinuxlab_conf
 
Enable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunEnable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunheut2008
 
RISC-V Boot Process: One Step at a Time
RISC-V Boot Process: One Step at a TimeRISC-V Boot Process: One Step at a Time
RISC-V Boot Process: One Step at a TimeAtish Patra
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shelljaguardesignstudio
 
ROS+GAZEBO
ROS+GAZEBOROS+GAZEBO
ROS+GAZEBOicmike
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법Open Source Consulting
 
Introduction to ROS (Robot Operating System)
Introduction to ROS (Robot Operating System) Introduction to ROS (Robot Operating System)
Introduction to ROS (Robot Operating System) hvcoup
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
openQRM how-to: Setup UEC and openQRM cloud
openQRM how-to: Setup UEC and openQRM cloudopenQRM how-to: Setup UEC and openQRM cloud
openQRM how-to: Setup UEC and openQRM cloudopenQRM Enterprise GmbH
 
Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Jiho Choi
 
Analyzing OS X Systems Performance with the USE Method
Analyzing OS X Systems Performance with the USE MethodAnalyzing OS X Systems Performance with the USE Method
Analyzing OS X Systems Performance with the USE MethodBrendan Gregg
 
락플레이스 OpenShift Q&A 토크쇼 발표자료
락플레이스 OpenShift Q&A 토크쇼 발표자료락플레이스 OpenShift Q&A 토크쇼 발표자료
락플레이스 OpenShift Q&A 토크쇼 발표자료rockplace
 
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개CURVC Corp
 

What's hot (20)

Robot Control using ROS: an Introduction
Robot Control using ROS: an IntroductionRobot Control using ROS: an Introduction
Robot Control using ROS: an Introduction
 
Robotics and ROS
Robotics and  ROSRobotics and  ROS
Robotics and ROS
 
Ros platform overview
Ros platform overviewRos platform overview
Ros platform overview
 
[0602 박민근] Direct2D
[0602 박민근] Direct2D[0602 박민근] Direct2D
[0602 박민근] Direct2D
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
Stefano Cordibella - An introduction to Yocto Project
Stefano Cordibella - An introduction to Yocto ProjectStefano Cordibella - An introduction to Yocto Project
Stefano Cordibella - An introduction to Yocto Project
 
Enable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zunEnable DPDK and SR-IOV for containerized virtual network functions with zun
Enable DPDK and SR-IOV for containerized virtual network functions with zun
 
RISC-V Boot Process: One Step at a Time
RISC-V Boot Process: One Step at a TimeRISC-V Boot Process: One Step at a Time
RISC-V Boot Process: One Step at a Time
 
Why Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your ShellWhy Zsh is Cooler than Your Shell
Why Zsh is Cooler than Your Shell
 
Qemu Introduction
Qemu IntroductionQemu Introduction
Qemu Introduction
 
ROS+GAZEBO
ROS+GAZEBOROS+GAZEBO
ROS+GAZEBO
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교  및 구축 방법
[오픈소스컨설팅] 쿠버네티스와 쿠버네티스 on 오픈스택 비교 및 구축 방법
 
Introduction to ROS (Robot Operating System)
Introduction to ROS (Robot Operating System) Introduction to ROS (Robot Operating System)
Introduction to ROS (Robot Operating System)
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
openQRM how-to: Setup UEC and openQRM cloud
openQRM how-to: Setup UEC and openQRM cloudopenQRM how-to: Setup UEC and openQRM cloud
openQRM how-to: Setup UEC and openQRM cloud
 
Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개Ndc2012 최지호 텍스쳐 압축 기법 소개
Ndc2012 최지호 텍스쳐 압축 기법 소개
 
Analyzing OS X Systems Performance with the USE Method
Analyzing OS X Systems Performance with the USE MethodAnalyzing OS X Systems Performance with the USE Method
Analyzing OS X Systems Performance with the USE Method
 
락플레이스 OpenShift Q&A 토크쇼 발표자료
락플레이스 OpenShift Q&A 토크쇼 발표자료락플레이스 OpenShift Q&A 토크쇼 발표자료
락플레이스 OpenShift Q&A 토크쇼 발표자료
 
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개
SonarQube와 함께하는 소프트웨어 품질 세미나 - SonarQube 소개
 

Similar to 20160420 ROS 3차 강의 (for 아스라다 팀)

2nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 22nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 2Yoonseok Pyo
 
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신WooSangHwang
 
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...Ted Won
 
라즈베리파이로 슬랙 봇 개발하기
라즈베리파이로 슬랙 봇 개발하기라즈베리파이로 슬랙 봇 개발하기
라즈베리파이로 슬랙 봇 개발하기YunSeop Song
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스Sungik Kim
 
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링Ted Won
 
RHQ 공감 Seminar 6th
RHQ 공감 Seminar 6thRHQ 공감 Seminar 6th
RHQ 공감 Seminar 6thTed Won
 
Customizing Gis Programs
Customizing Gis ProgramsCustomizing Gis Programs
Customizing Gis ProgramsMinPa Lee
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장MinPa Lee
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석Tommy Lee
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명Peter YoungSik Yun
 
공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발MinPa Lee
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypiYeonah Ki
 
Cloud life seminar open shift,이준영(배포용)
Cloud life seminar   open shift,이준영(배포용)Cloud life seminar   open shift,이준영(배포용)
Cloud life seminar open shift,이준영(배포용)Software in Life
 

Similar to 20160420 ROS 3차 강의 (for 아스라다 팀) (20)

2nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 22nd ROS Tutorial Seminar Section 2
2nd ROS Tutorial Seminar Section 2
 
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
제3회 오픈 로보틱스 세미나 1일차 1세션 안드로이드 App 통신
 
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
Red Hat Forum 2012 - JBoss RHQ - Java Application Monitoring & Management Pla...
 
라즈베리파이로 슬랙 봇 개발하기
라즈베리파이로 슬랙 봇 개발하기라즈베리파이로 슬랙 봇 개발하기
라즈베리파이로 슬랙 봇 개발하기
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링
JBoss RHQ와 Byteman을 이용한 오픈소스 자바 애플리케이션 모니터링
 
RHQ 공감 Seminar 6th
RHQ 공감 Seminar 6thRHQ 공감 Seminar 6th
RHQ 공감 Seminar 6th
 
Customizing Gis Programs
Customizing Gis ProgramsCustomizing Gis Programs
Customizing Gis Programs
 
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장PyQGIS와 PyQt를 이용한 QGIS 기능 확장
PyQGIS와 PyQt를 이용한 QGIS 기능 확장
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
[개방형 클라우드 플랫폼 오픈세미나 오픈클라우드 Pub] 3.open shift 분석
 
안드로이드 플랫폼 설명
안드로이드 플랫폼 설명안드로이드 플랫폼 설명
안드로이드 플랫폼 설명
 
공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발공간정보거점대학 - PyQGIS 및 플러그인 개발
공간정보거점대학 - PyQGIS 및 플러그인 개발
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypi
 
Cloud life seminar open shift,이준영(배포용)
Cloud life seminar   open shift,이준영(배포용)Cloud life seminar   open shift,이준영(배포용)
Cloud life seminar open shift,이준영(배포용)
 

More from Yoonseok Pyo

제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기
제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기
제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기Yoonseok Pyo
 
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇Yoonseok Pyo
 
ROS SERIAL and OpenCR
ROS SERIAL and OpenCRROS SERIAL and OpenCR
ROS SERIAL and OpenCRYoonseok Pyo
 
DYNAMIXEL ROS Package
DYNAMIXEL ROS PackageDYNAMIXEL ROS Package
DYNAMIXEL ROS PackageYoonseok Pyo
 
공돌이에게도 전략은 필요하다
공돌이에게도 전략은 필요하다공돌이에게도 전략은 필요하다
공돌이에게도 전략은 필요하다Yoonseok Pyo
 
BLDC 모터 돌려보기
BLDC 모터 돌려보기BLDC 모터 돌려보기
BLDC 모터 돌려보기Yoonseok Pyo
 
Open Source License
Open Source LicenseOpen Source License
Open Source LicenseYoonseok Pyo
 
4th Open Robotics Seminar
4th Open Robotics Seminar4th Open Robotics Seminar
4th Open Robotics SeminarYoonseok Pyo
 
2nd ROS Tutorial Seminar Section 4
2nd ROS Tutorial Seminar Section 42nd ROS Tutorial Seminar Section 4
2nd ROS Tutorial Seminar Section 4Yoonseok Pyo
 
2nd ROS Tutorial Seminar
2nd ROS Tutorial Seminar2nd ROS Tutorial Seminar
2nd ROS Tutorial SeminarYoonseok Pyo
 
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션Yoonseok Pyo
 
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론Yoonseok Pyo
 
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)Yoonseok Pyo
 
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)Yoonseok Pyo
 
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)Yoonseok Pyo
 

More from Yoonseok Pyo (15)

제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기
제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기
제6회 오픈 로보틱스 세미나 4세션 공학으로 콘텐츠 만들기
 
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇
제6회 오픈 로보틱스 세미나 1세션 임의의 어떤 로봇
 
ROS SERIAL and OpenCR
ROS SERIAL and OpenCRROS SERIAL and OpenCR
ROS SERIAL and OpenCR
 
DYNAMIXEL ROS Package
DYNAMIXEL ROS PackageDYNAMIXEL ROS Package
DYNAMIXEL ROS Package
 
공돌이에게도 전략은 필요하다
공돌이에게도 전략은 필요하다공돌이에게도 전략은 필요하다
공돌이에게도 전략은 필요하다
 
BLDC 모터 돌려보기
BLDC 모터 돌려보기BLDC 모터 돌려보기
BLDC 모터 돌려보기
 
Open Source License
Open Source LicenseOpen Source License
Open Source License
 
4th Open Robotics Seminar
4th Open Robotics Seminar4th Open Robotics Seminar
4th Open Robotics Seminar
 
2nd ROS Tutorial Seminar Section 4
2nd ROS Tutorial Seminar Section 42nd ROS Tutorial Seminar Section 4
2nd ROS Tutorial Seminar Section 4
 
2nd ROS Tutorial Seminar
2nd ROS Tutorial Seminar2nd ROS Tutorial Seminar
2nd ROS Tutorial Seminar
 
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션
제3회 오픈 로보틱스 세미나 (제9세션) : ROS를 활용한 SLAM과 내비게이션
 
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론
제3회 오픈 로보틱스 세미나 (제7세션) : 로봇운영체제ROS 개론
 
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)
제2회 오픈 로보틱스 세미나 (제10세션 ROS를 활용한 SLAM과 내비게이션)
 
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)
제2회 오픈 로보틱스 세미나 (제8세션 로봇 운영체제 ROS 개론)
 
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)
제1회 오픈 로보틱스 세미나 (제6세션:로봇 운영체제 ROS 개론)
 

20160420 ROS 3차 강의 (for 아스라다 팀)

  • 1. 실습으로 알아보는 ROS의 다양한 개발도구 2016. 04. 20 Yoonseok Pyo Open Source Team 1
  • 2. Index I. Command-Line Tools II. Visualization Tool: RViz III. GUI Tool Box: RQT 2
  • 3. Index I. Command-Line Tools II. Visualization Tool: RViz III. GUI Tool Box: RQT 3
  • 4. ROS의 다양한 개발 도구  로봇 개발에 필요한 다양한 개발 도구를 제공  로봇 개발의 효율성 향상  Command-Line Tools • GUI 없이 ROS에서 제공되는 명령어로만으로도 로봇 제어 및 거의 모든 ROS 기능 소화 가능  RViz • 강력한 3D 시각화툴 • 레이저, 카메라, IMU 등의 센서 데이터를 시각화 • 로봇 외형과 계획된 동작을 표현  RQT • 그래픽 인터페이스 개발을 위한 Qt 기반 프레임 워크 제공 • 노드와 그들 사이의 연결 정보 표시(rqt_graph) • 인코더, 전압, 또는 시간이 지남에 따라 변화하는 숫자를 플로팅(rqt_plot) • 데이터를 메시지 형태로 기록하고 재생(rqt_bag) 4http://www.ros.org/core-components/
  • 5. 아래의 Command-Line Tools 는 ROS 강의 전반에 걸쳐서 지속적으로 사용됩니다. rospack, roscd, rospd, rosls, rosed, roscp, rosdep, roswf, catkin_create_pkg, wstool, catkin_make, roscore, rosrun, roslaunch, rosnode, rostopic, rosservice, rosparam, rosmsg, rossrv, rosbag, tf_echo 배부한 ROS Cheatsheet 를 참고해주시구요. 이 부분은 생략! https://github.com/oroca/oroca_ros_tutorials/raw/master/ROScheatsheet_indigo_catkin.pdf Command-Line Tools
  • 6. Index I. Command-Line Tools II. Visualization Tool: RViz III. GUI Tool Box: RQT 6
  • 7. RViz (ROS Visualization Tool) • ROS의 3D 시각화툴 • 센서 데이터의 시각화 • 레이저 레인지 파인더(LRF)센서의 거리 데이터 • Kinect, Xtion, RealSense 등의 Depth Camera의 포인트 클라우드 데이터 • 카메라의 영상 데이터 • IMU 센서의 관성 데이터 등.. • 로봇 외형의 표시와 계획된 동작을 표현 • URDF(Unified Robot Description Format) • 내비게이션 • 매니퓰레이션 • 원격 제어
  • 8. Rviz의 사용예 • Kinect의 Point Cloud Data https://youtu.be/OqOkpZBOpxY • LRF의 거리 값 https://youtu.be/qtoAJ1wzB6s • LEGO Mindstorm 의 초음파 센서 https://youtu.be/6afrMnEmXFI • IMU센서의 관성 값 https://youtu.be/j5v5fKppcQo • RealSense의 Point Cloud와 Color, Depth 영상 https://youtu.be/Jf4kgPEzY4s • 사람의 골격과 지시 방향 표시 https://youtu.be/ath8uNv9c_Q • 로봇 및 환경 모델, 경로까지 https://youtu.be/9lbuLAD1c_4 • 지도 표시, 내비게이션, 목적지 지정 https://youtu.be/xCRsszVAP1E • 인터렉티브 마커를 이용한 IK 목표 위치 지정 및 경로 표시 https://youtu.be/5rMv3ZDyFwQ • 재난구조로봇의 경우 (2015 DARPA Robotics Challenge) https://www.youtube.com/user/DARPAtv 8
  • 9. RViz를 이용하면 센서 및 로봇 관련 데이터 시각화가 간단! 9
  • 10. RViz 설치 및 실행 • RViz 설치 * ros-indigo-desktop-full를 설치하였다면 기본 설치됨 • RViz 실행 또는 10http://wiki.ros.org/rviz $ sudo apt-get install ros-indigo-rviz $ rosrun rviz rviz $ rviz
  • 11. RViz 초기 모습 (미설정) 11
  • 12. RViz 의 화면 구성 (LRF 센서의 경우) 12 ① ② ③ ④ ⑤ ⑥ 1. 3D 뷰 2. 디스플레이 3. 메뉴 4. 툴 5. 뷰 형태 6. 시간
  • 13. RViz 의 디스플레이 종류 (②의 ‘ADD’를 클릭) 13 xyz 축 카메라 영상 오버레이 거리영상에 카메라 영상을 입힘 회전 관절의 힘 유체 압력 그리드 그리드 셀 (지도에 이용) 그룹 조도 영상 인터랙티브 마커 레이저 스캔 지도 마커 마커 배열 오도메트리 경로 포인트 클라우드 포인트 클라우드2 점 폴리곤 포즈 포즈 배열 범위 상대 온도 로봇 모델 좌표 변환 값 (TF) 상대 습도 쥐어 돌림
  • 14. 14 실습 시간 ‘LRF, IMU, USB Camera, Depth Camera, Robot Model 을 Rviz를 통해 확인해보자.’ 나눠 드린 센서들을 각자 PC의 Rviz를 이용해 데이터를 확인해보세요.
  • 16. RViz 실습 #1 (LRF) * Rviz의 Displays 옵션 변경 1) Fixed Frame 변경 Global Options > Fixed Frame = laser 2) Axes 추가 및 설정 rviz 좌측 하단의 Add 클릭한 후, Axes 선택하여 추가한다. (Length 및 Radius 변경은 옵션) 3) LaserScan 추가 및 설정 rviz 좌측 하단의 Add 클릭한 후, LaserScan 선택하여 추가한다. (Topic 지정은 필수, Color Transformer, Color 등은 옵션) 16 $ sudo apt-get install ros-indigo-rplidar-ros $ sudo chmod a+rw /dev/ttyUSB0 $ roslaunch rplidar_ros rplidar.launch $ sudo apt-get install ros-indigo-urg-node $ sudo chmod a+rw /dev/ttyACM0 $ rosrun urg_node urg_node (RPLiDAR의 경우) (HOKUYO의 경우)
  • 17. RViz 실습 #1 (LRF) 17
  • 18. RViz 실습 #2 (IMU) 18 $ sudo apt-get install ros-indigo-myahrs-driver $ rosrun myahrs_driver myahrs_driver _port:=/dev/ttyACM0 $ roslaunch myahrs_driver myahrs_driver.launch (withrobot사의 myAHRS+)
  • 19. RViz 실습 #3 (USB Camera) 19 $ sudo apt-get install ros-indigo-uvc-camera $ sudo apt-get install ros-indigo-image-* $ rosrun uvc_camera uvc_camera_node $ rosrun uvc_camera uvc_camera_node _device:=/dev/video? * Rviz의 Displays 옵션 변경 1) Fixed Frame 변경 Global Options > Fixed Frame = camera 2) 이미지 디스플레이 추가 rviz 좌측 하단의 Add 클릭한 후, Image 선택하여 추가한다. (Add > by display > rviz > Image) 3) 토픽 값 변경 Image > Image Topic 의 값을 "/image_raw" 로 변경한다. 카메라가 2대 이상일 경우, 물음표 대신 사용하기 원하는 디바이스 번호를 입력 (특히, 노트북의 경우)
  • 20. RViz 실습 #3 (USB Camera) 20
  • 21. RViz 실습 #4 (Depth Camera) 21 $ cd ~/Downloads/ $ git clone https://github.com/PercATI/RealSense_ROS.git $ cd RealSense_ROS/r200_install/ $ sh install.sh $ cd ~/Downloads/RealSense_ROS/realsense_dist/2.3/ $ sh install_realsense_ros.sh $ roslaunch realsense realsense_r200_launch.launch * Rviz의 Displays 옵션 변경 1) Fixed Frame 변경 Global Options > Fixed Frame 을 "camera_depth_frame" 로 변경한다. 2) PointCloud2 추가 및 설정 rviz 좌측 하단의 Add 클릭한 후, PointCloud2를 선택하여 추가한다. 3) Topic 이름 및 세부 설정 변경 (RealSense의 경우)
  • 22. RViz 실습 #4 (Depth Camera) 22 $ sudo apt-get install ros-indigo-openni2-camera ros-indigo-openni2-launch $ tar -xvf Sensor-Bin-Linux-x64-v5.1.0.41.tar.bz2 $ cd Sensor-Bin-Linux-x64-v5.1.0.41/ $ sudo sh install.sh $ roslaunch openni2_launch openni2.launch * Rviz의 Displays 옵션 변경 1) Fixed Frame 변경 Global Options > Fixed Frame 을 "camera_depth_frame" 로 변경한다. 2) PointCloud2 추가 및 설정 rviz 좌측 하단의 Add 클릭한 후, PointCloud2를 선택하여 추가한다. 3) Topic 이름 및 세부 설정 변경 (*Xtion 구매시 CD안에 있음) (ASUS사의 Xtion의 경우)
  • 23. RViz 실습 #4 (Depth Camera) 23
  • 24. RViz 실습 #5 (Robot Model) • R2-D2 모델 24 $ sudo apt-get install ros-indigo-urdf-tutorial $ roslaunch urdf_tutorial display.launch model:='$(find urdf_tutorial)'urdf/05-visual.urdf
  • 25. RViz 실습 #6 (Navigation) • 내비게이션 강의에서 진행 25 Xtion 을 구입하게 되면 동봉된 CD에 Xtion 드라이브
  • 26. RViz 실습 #7 (Interactive Marker) • 매니퓰레이션 강의에서 진행 26 Xtion 을 구입하게 되면 동봉된 CD에 Xtion 드라이브
  • 27. Index I. Command-Line Tools II. Visualization Tool: RViz III. GUI Tool Box: RQT 27
  • 28. RQT: 플러그인 방식의 ROS의 종합 GUI 툴 • ROS Fuerte 버전부터는 rqt 라는 이름으로 기존의 rxbag, rxplot, rxgraph 등이 통폐합되어 rqt_bag, rqt_plot, rqt_graph 등을 플러그인으로 하는 ROS의 종합 GUI 툴로써 사용 가능해졌다. • rqt는 Qt로 개발되어 있기 때문에 유저들이 자유롭게 플러그인을 개발하여 추가할 수도 있다. • rqt의 대표적인 플러그인인 rqt_image_view, rqt_graph, rqt_plot, rqt_bag에 대해서 알아보도 록 하자. • 참고로, 그 이외에도 • rqt_action, rqt_gui, rqt_plot, rqt_runtime_monitorrqt_bag, rqt_gui_cpp, rqt_pose_view, rqt_rvizrqt_bag_plugins, rqt_gui_py, rqt_publisher, rqt_service_callerrqt_capabilities, rqt_image_view, rqt_py_common, rqt_shellrqt_console, rqt_launch, rqt_py_console, rqt_srvrqt_controller_manager, rqt_logger_level, rqt_reconfigure, rqt_tf_treerqt_dep, rqt_moveit, rqt_robot_dashboard, rqt_toprqt_ez_publisher, rqt_msg, rqt_robot_monitor, rqt_topicrqt_graph, rqt_nav_view, rqt_robot_steering, rqt_web • 등의 플러그인이 존재한다. (헐 ㅡㅡ;;)
  • 29. RQT 설치 및 실행 • RQT 설치 • RQT 실행 $ sudo apt-get install ros-indigo-rqt ros-indigo-rqt-common-plugins $ rqt
  • 30. RQT 플러그인 #1 1. 액션 (Action) • Action Type Browser | Action 타입의 데이터 구조를 확인 2. 구성 (Configuration) • Dynamic Reconfigure | 노드들에서 제공하는 설정값 변경을 위한 GUI 설정값 변경 • Launch | roslaunch 의 GUI 버전 3. 내성 (Introspection) • Node Graph | 구동중인 노드들의 관계도 및 메시지의 흐름을 확인 가능한 그래프 뷰 • Package Graph | 노드의 의존 관계를 표시하는 그래프 뷰 • Process Monitor | 실행중인 노드들의 CPU사용률, 메모리사용륭, 스레드수 등을 확인 4. 로깅 (Logging) • Bag | ROS 데이터 로깅 • Console | 노드들에서 발생되는 경고(Warning), 에러(Error) 등의 메시지를 확인 • Logger Level | ROS의 Debug, Info, Warn, Error, Fatal 로거 정보를 선택하여 표시 30
  • 31. RQT 플러그인 #2 5. 다양한 툴 (Miscellaneous Tools) • Python Console | 파이썬 콘솔 화면 • Shell | 쉘(shell)을 구동 • Web | 웹 브라우저를 구동 6. 로봇 (Robot) • 사용하는 로봇에 따라 계기판(dashboard) 등의 플러그인을 이곳에 추가 7. 로봇툴 (Robot Tools) • Controller Manager | 컨트롤러 제어에 필요한 플로그인 • Diagnostic Viewer | 로봇 디바이스 및 에러 확인 • Moveit! Monitor | 로봇 팔 계획에 사용되는 Moveit! 데이터를 확인 • Robot Steering | 로봇 조정 GUI 툴, 원격 조정에서 이 GUI 툴을 이용하여 로봇 조종 • Runtime Monitor | 실시간으로 노드들에서 발생되는 에러 및 경고를 확인 31
  • 32. RQT 플러그인 #3 8. 서비스 (Services) • Service Caller | 구동중인 서비스 서버에 접속하여 서비스를 요청 • Service Type Browser | 서비스 타입의 데이터 구조를 확인 9. 토픽 (Topics) • Easy Message Publisher | 토픽을 GUI 환경에서 발행 • Topic Publisher | 토픽을 생성하여 발행 • Topic Type Browser | 토픽 타입의 데이터 구조 확인 • Topic Monitor | 사용자가 선택한 토픽의 정보를 확인 10. 시각화 (Visualization) • Image View | 카메라의 영상 데이터를 확인 • Navigation Viewer | 로봇 네비게이션의 위치 및 목표지점 확인 • Plot | 2차원 데이터 플롯 GUI 플러그인, 2차원 데이터의 도식화 • Pose View | 현재 TF의 위치 및 모델의 위치 표시 • RViz | 3차원 시각화 툴인 RViz 플러그인 • TF Tree | tf 관계를 트리로 나타내는 그래프 뷰 32
  • 34. RQT를 이용하면 1. GUI 형태로 ROS 이용 가능 2. GUI Tool 제작이 간단! 34
  • 36. RQT 실습 #1: rqt_image_view 36 $ rosrun uvc_camera uvc_camera_node $ rqt (메뉴에서 [Plugins] → [Visualization] → [Image View] 를 선택한다.) 또는 $ rqt_image_view
  • 37. RQT 실습 #2: rqt_graph 37 $ rosrun turtlesim turtlesim_node $ rosrun turtlesim turtle_teleop_key $ rosrun uvc_camera uvc_camera_node $ rqt (메뉴에서 [Plugins] → [Introspection] → [Node_Graph] 를 선택한다.) 또는 $ rqt_graph
  • 38. RQT 실습 #3: rqt_plot 38 $ rosrun turtlesim turtlesim_node $ rosrun turtlesim turtle_teleop_key $ rqt (메뉴에서 [Plugins] → [Visualization] → [Plot] 를 선택한다.) 또는 $ rqt_plot /turtle1/pose/
  • 39. RQT 실습 #4: rqt_bag 39 $ rosrun uvc_camera uvc_camera_node $ rosbag record /image_raw $ rqt (메뉴에서 [Plugins] → [Logging] → [Bag] 를 선택한다.) 또는 $ rqt_bag
  • 40. 40
  • 42. “hello world!” [복습] 2016. 04. 20 Yoonseok Pyo Open Source Team 42
  • 43. 무조건 따라하기 “hello world!” • ROS판 “hello world!” 작성 • 메시지 통신 중 토픽을 이용하는 퍼블리셔 노드 작성 1) 패키지 생성 • 사용자가 패키지를 작성할 때 캐킨 빌드 시스템에 꼭 필요한 CMakeLists.txt 와 package.xml을 포함한 패키지 폴더를 생성한다. 43 $ catkin_create_pkg [패키지이름] [의존하는패키지1] [의존하는패키지n] $ cd ~/catkin_ws/src $ catkin_create_pkg my_first_ros_pkg std_msgs roscpp $ cd ~/catkin_ws/src/my_first_ros_pkg
  • 44. 무조건 따라하기 “hello world!” 44 2) 패키지 설정 파일(package.xml) 수정 • 패키지 이름, 저작자, 라이선스, 의존성 패키지 등의 패키지 관련 정보 $ cd ~/catkin_ws/src/my_first_ros_pkg $ gedit ./package.xml <?xml version="1.0"?> <package> <name>my_first_ros_pkg</name> <version>0.0.1</version> <description>The my_first_ros_pkg package</description> <maintainer email="pyo@robotis.com">Yoonseok Pyo</maintainer> <license>BSD</license> <url type="website">http://robotis.com</url> <url type="repository">https://github.com/oroca/oroca_ros_tutorials.git</url> <author email="pyo@robotis.com">Yoonseok Pyo</author> <buildtool_depend>catkin</buildtool_depend> <build_depend>std_msgs</build_depend> <build_depend>roscpp</build_depend> <run_depend>std_msgs</run_depend> <run_depend>roscpp</run_depend> <export></export> </package>
  • 45. 무조건 따라하기 “hello world!” 45 3) 빌드 설정 파일(CMakeLists.txt) 수정 • 실행 파일 생성, 의존성 패키지 우선 빌드, 링크 생성 등의 빌드 환경 정보 $ cd ~/catkin_ws/src/my_first_ros_pkg $ gedit ./CMakeLists.txt cmake_minimum_required(VERSION 2.8.3) project(my_first_ros_pkg) find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) catkin_package( INCLUDE_DIRS include CATKIN_DEPENDS roscpp std_msgs DEPENDS system_lib ) include_directories(${catkin_INCLUDE_DIRS}) add_executable(hello_world_node src/hello_world_node.cpp) add_dependencies(hello_world_node my_first_ros_pkg_generate_messages_cpp) target_link_libraries(hello_world_node ${catkin_LIBRARIES})
  • 46. 무조건 따라하기 “hello world!” 46 4) 소스 코드 작성 $ cd ~/catkin_ws/src/my_first_ros_pkg/src $ gedit ./hello_world_node.cpp #include <ros/ros.h> #include <std_msgs/String.h> #include <sstream> int main(int argc, char **argv) { ros::init(argc, argv, "hello_world_node"); ros::NodeHandle nh; ros::Publisher chatter_pub = nh.advertise<std_msgs::String>("say_hello_world", 1000); ros::Rate loop_rate(10); int count = 0;
  • 47. 무조건 따라하기 “hello world!” 47 while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello world!" << count; msg.data = ss.str(); ROS_INFO("%s", msg.data.c_str()); chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }
  • 48. 무조건 따라하기 “hello world!” 48 5) 패키지 빌드 6) roscore 실행 7) 노드 실행 $ rospack profile $ cd ~/catkin_ws $ catkin_make (혹은 다음과 같이 함께 사용하여 1라인으로 처리) $ cd ~/catkin_ws && catkin_make $ roscore (이미 실행되어 있다면 생략) $ rosrun my_first_ros_pkg hello_world_node [INFO] [1423443540.131775283]: hello world! 0 [INFO] [1423443540.231826916]: hello world! 1 [INFO] [1423443540.331798085]: hello world! 2 [INFO] [1423443540.431796634]: hello world! 3 …
  • 49. 무조건 따라하기 “hello world!” • rqt_graph • rostopic 49 $ rosrun rqt_graph rqt_graph $ rostopic list /rosout /rosout_agg /say_hello_world $ rostopic info /say_hello_world Type: std_msgs/String Publishers: * /hello_world_node (http://localhost:51083/) Subscribers: None $ rostopic hz /say_hello_world subscribed to [/say_hello_world] average rate: 9.999 min: 0.100s max: 0.100s std dev: 0.00001s window: 10
  • 50. 무조건 따라하기 “hello world!” • rqt_topic • 송/수신 테스트 50 $ rosrun rqt_topic rqt_topic $ rostopic echo /say_hello_world data: hello world!109 --- data: hello world!110 --- data: hello world!111 --- … $ rosrun rqt_graph rqt_graph ctrl + c
  • 51. 51
  • 53. ROS 기본 프로그래밍 2016. 04. 20 Yoonseok Pyo Open Source Team 53
  • 54. 자~ 오늘은 Topic: 퍼블리셔, 서브스크라이버 Service: 서비스 서버, 서비스 클라이언트 작성에 들어갑니다. 54
  • 55. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 55
  • 56. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 56
  • 61. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 61
  • 62. Topic / Publisher / Subscriber • ROS에서는 단방향 통신일때 ‘Topic’ 이라는 메시지 통신을 사용한다. 이때 송신 측을 ‘Publisher’, 수신 측을 ‘Subscriber’라고 부른다. 1) 패키지 생성 62 $ cd ~/catkin_ws/src $ catkin_create_pkg oroca_ros_tutorials std_msgs roscpp $ cd ~/catkin_ws/src/oroca_ros_tutorials $ ls include → 헤더 파일 폴더 src → 소스 코드 폴더 CMakeLists.txt → 빌드 설정 파일 package.xml → 패키지 설정 파일
  • 63. Topic / Publisher / Subscriber 2) 패키지 설정 파일(package.xml) 수정 • ROS의 필수 설정 파일 중 하나인 package.xml은 패키지 정보를 담은 XML 파일로서 패키지 이름, 저작자, 라이선스, 의존성 패키지 등을 기술하고 있다. 63 $ gedit package.xml <?xml version="1.0"?> <package> <name>oroca_ros_tutorials</name> <version>0.1.0</version> <description>The oroca_ros_tutorials package</description> <maintainer email="passionvirus@gmail.com">Yoonseok Pyo</maintainer> <url type="website">http://oroca.org</url> <url type="repository">https://github.com/oroca/oroca_ros_tutorials.git</url> <author email="passionvirus@gmail.com">Yoonseok Pyo</author> <license>BSD</license>
  • 64. Topic / Publisher / Subscriber 64 <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>std_msgs</build_depend> <build_depend>message_generation</build_depend> <run_depend>roscpp</run_depend> <run_depend>std_msgs</run_depend> <run_depend>message_runtime</run_depend> <export></export> </package>
  • 65. Topic / Publisher / Subscriber 3) 빌드 설정 파일(CMakeLists.txt) 수정 65 $ gedit CMakeLists.txt cmake_minimum_required(VERSION 2.8.3) project(oroca_ros_tutorials) ## 캐킨 빌드를 할 때 요구되는 구성요소 패키지이다. ## 의존성 패키지로 roscpp, std_msgs, message_generation이며 이 패키지들이 존재하지 않으면 빌드 도중에 에러가 난다. find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation) ## 메시지 선언: msgTutorial.msg add_message_files(FILES msgTutorial.msg) ## 의존하는 메시지를 설정하는 옵션이다. ## std_msgs가 설치되어 있지 않다면 빌드 도중에 에러가 난다. generate_messages(DEPENDENCIES std_msgs) ## 캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다. catkin_package( #INCLUDE_DIRS include LIBRARIES oroca_ros_tutorials CATKIN_DEPENDS roscpp std_msgs DEPENDS system_lib )
  • 66. Topic / Publisher / Subscriber 66 ## 인클루드 디렉터리를 설정한다. include_directories(include ${catkin_INCLUDE_DIRS}) ## ros_tutorial_msg_publisher 노드에 대한 빌드 옵션이다. ## 실행 파일, 타겟 링크 라이브러리, 추가 의존성 등을 설정한다. add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp) target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp) ## ros_tutorial_msg_subscriber 노드에 대한 빌드 옵션이다. add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp) target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp)
  • 67. Topic / Publisher / Subscriber 4) 메시지 파일 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 옵션을 넣었다. • 노드에서 사용할 메시지인 msgTutorial.msg를 빌드할 때 포함하라는 이야기 • int32 (메시지 형식), data (메시지 이름) • 메시지 타입은 int32 이외에도 bool, int8, int16, float32, string, time, duration 등의 메시지 기본 타입과 ROS 에서 많이 사용되는 메시지를 모아놓은 common_msgs 등도 있다. 여기서는 간단한 예제를 만들어 보기 위한 것으로 int32를 이용하였다. 67 $ roscd oroca_ros_tutorials → 패키지 폴더로 이동 $ mkdir msg → 패키지에 msg라는 메시지 폴더를 신규 작성 $ cd msg → 작성한 msg 폴더로 이동 $ gedit msgTutorial.msg → msgTutorial.msg 파일 신규 작성 및 내용 수정 int32 data add_message_files(FILES msgTutorial.msg)
  • 68. Topic / Publisher / Subscriber 5) 퍼블리셔 노드 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다. • src 폴더의 ros_tutorial_msg_publisher.cpp라는 파일을 빌드하여 ros_tutorial_msg_publisher라는 실행 파일을 만들라는 이야기 68 add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp) $ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동 $ gedit ros_tutorial_msg_publisher.cpp → 소스 파일 신규 작성 및 내용 수정 #include "ros/ros.h" // ROS 기본 헤더파일 #include "oroca_ros_tutorials/msgTutorial.h“ // msgTutorial 메시지 파일 헤더 (빌드후 자동 생성됨) int main(int argc, char **argv) // 노드 메인 함수 { ros::init(argc, argv, "ros_tutorial_msg_publisher"); // 노드명 초기화 ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언
  • 69. Topic / Publisher / Subscriber 69 // 발행자 선언, oroca_ros_tutorials 패키지의 msgTutorial 메시지 파일을 이용한 // 발행자 ros_tutorial_pub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며, // 발행자 큐(queue) 사이즈를 100개로 설정한다는 것이다 ros::Publisher ros_tutorial_pub = nh.advertise<oroca_ros_tutorials::msgTutorial>("ros_tutorial_msg", 100); ros::Rate loop_rate(10); // 루프 주기를 설정한다. "10" 이라는 것은 10Hz를 말하는 것으로 0.1초 간격으로 반복된다 int count = 0; // 메시지에 사용될 변수 선언 while (ros::ok()) { oroca_ros_tutorials::msgTutorial msg; // msgTutorial 메시지 파일 형식으로 msg 라는 메시지를 선언 msg.data = count; // count 라는 변수를 이용하여 메시지 값을 정한다 ROS_INFO("send msg = %d", count); // ROS_INFO 라는 ROS 함수를 이용하여 count 변수를 표시한다 ros_tutorial_pub.publish(msg); // 메시지를 발행한다. 약 0.1초 간격으로 발행된다 loop_rate.sleep(); // 위에서 정한 루프 주기에 따라 슬립에 들어간다 ++count; // count 변수 1씩 증가 } return 0; }
  • 70. Topic / Publisher / Subscriber 6) 서브스크라이버 노드 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다. • 즉, ros_tutorial_msg_subscriber.cpp라는 파일을 빌드하여 ros_tutorial_msg_subscriber라는 실행 파일을 만들라는 이야기 70 add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp) $ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동 $ gedit ros_tutorial_msg_subscriber.cpp → 소스 파일 신규 작성 및 내용 수정 #include "ros/ros.h" // ROS 기본 헤더파일 #include "oroca_ros_tutorials/msgTutorial.h" // msgTutorial 메시지 파일 헤더 (빌드후 자동 생성됨) // 메시지 콜백함수로써, ros_tutorial_sub 구독자에 해당되는 메시지를 수신하였을 때 동작하는 함수이다 // 입력 메시지로는 oroca_ros_tutorial 패키지의 msgTutorial 메시지를 받도록 되어있다 void msgCallback(const oroca_ros_tutorials::msgTutorial::ConstPtr& msg) { ROS_INFO("recieve msg: %d", msg->data); // 수신된 메시지를 표시하는 함수 }
  • 71. Topic / Publisher / Subscriber 71 int main(int argc, char **argv) // 노드 메인 함수 { ros::init(argc, argv, "ros_tutorial_msg_subscriber"); // 노드명 초기화 ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언 // 구독자 선언, oroca_ros_tutorials 패키지의 msgTutorial 메시지 파일을 이용한 // 구독자 ros_tutorial_sub 를 작성한다. 토픽명은 "ros_tutorial_msg" 이며, // 구독자 큐(queue) 사이즈를 100개로 설정한다는 것이다 ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg", 100, msgCallback); // 콜백함수 호출을 위한 함수로써, 메시지가 수신되기를 대기, 수신되었을 경우 콜백함수를 실행한다 ros::spin(); return 0; }
  • 72. Topic / Publisher / Subscriber 7) ROS 노드 빌드 • 다음 명령어로 oroca_ros_tutorials 패키지의 메시지 파일, 퍼블리셔 노드, 서브스 크라이버 노드를 빌드하자. • [참고] 파일시스템 • oroca_ros_tutorials 패키지의 소스 코드 파일: ~/catkin_ws/src/oroca_ros_tutorials/src • oroca_ros_tutorials 패키지의 메시지 파일: ~/catkin_ws/src/oroca_ros_tutorials/msg • 빌드된 결과물은 /catkin_ws의 /build와 /devel 폴더에 각각 생성 • /build 폴더에는 캐킨 빌드에서 사용된 설정 내용이 저장 • /devel/lib/oroca_ros_tutorials 폴더에는 실행 파일이 저장 • /devel/include/oroca_ros_tutorials 폴더에는 메시지 파일로부터 자동 생성된 메시지 헤더 파일이 저장 72 $ cd ~/catkin_ws → catkin 폴더로 이동 $ catkin_make → catkin 빌드 실행
  • 73. Topic / Publisher / Subscriber 8) 퍼블리셔 실행 • ROS 노드 실행 명령어인 rosrun을 이용하여, oroca_ros_tutorials 패 키지의 ros_tutorial_msg_publisher 노드를 구동하라는 명령어 73 $ rosrun oroca_ros_tutorials ros_tutorial_msg_publisher [참고로 노드 실행에 앞서 roscore를 실행하는 것을 잊지 말자.]
  • 74. Topic, Publisher, Subscriber • [참고] rostopic • rostopic 명령어를 이용하여 현재 ROS 네트워크에서 사용 중인 토픽 목록, 주기, 데이터 대역폭, 내용 확인 등이 가능하다. 74 $ rostopic list /ros_tutorial_msg /rosout /rosout_agg $ rostopic echo /ros_tutorial_msg
  • 75. Topic / Publisher / Subscriber 9) 서브스크라이버 실행 • ROS 노드 실행 명령어인 rosrun을 이용하여, oroca_ros_tutorials 패 키지의 ros_tutorial_msg_subscriber 노드를 구동하라는 명령어 75 $ rosrun oroca_ros_tutorials ros_tutorial_msg_subscriber
  • 76. Topic / Publisher / Subscriber 10) 실행된 노드들의 통신 상태 확인 76 $ rqt_graph $ rqt [플러그인(Plugins)] → [인트로스펙션(Introspection)] → [노드 그래프(Node Graph)
  • 77. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 77
  • 78. Service / Service server / Service client • 서비스는 요청(request)이 있을 때만 응답(response)하는 서비스 서버 (service server)와 요청하고 응답받는 서비스 클라이언트(service client)로 나뉜다. 서비스는 토픽과는 달리 일회성 메시지 통신이다. 따라서 서비스 의 요청과 응답이 완료되면 연결된 두 노드는 접속이 끊긴다. • 이러한 서비스는 로봇에 특정 동작을 수행하도록 요청할 때에 명령어로써 많이 사용된다. 혹은 특정 조건에 따라 이벤트를 발생해야 할 노드에 사용 된다. 또한, 일회성 통신 방식이라서 네트워크에 부하가 적기 때문에 토픽 을 대체하는 수단으로도 사용되는 등 매우 유용한 통신수단이다. • 이번 강의에서는 간단한 서비스 파일을 작성해보고, 서비스 서버(server) 노드와 서비스 클라이언트(client) 노드를 작성하고 실행하는 것을 목적으 로 한다. • 참고로 앞 절에서 이미 oroca_ros_tutorials라는 패키지를 생성하였으므로 패키지 생성은 생략하며, 패키지 정보를 담은 package.xml 파일도 수정할 부분이 없으므로 생략한다. 78
  • 79. Service / Service server / Service client 1) 빌드 설정 파일(CMakeLists.txt) 수정 • 이전에 작성한 oroca_ros_tutorials 패키지에 새로운 서비스 서버 노 드, 서비스 클라이언트 노드, 서비스 파일(*.srv)을 추가하기 위하여 다음 예제와 같이 oroca_ros_tutorials 패키지로 이동한 후에 CMakeLists.txt 파일을 수정하도록 하자. 79 $ roscd oroca_ros_tutorials $ gedit CMakeLists.txt cmake_minimum_required(VERSION 2.8.3) project(oroca_ros_tutorials) ## 캐킨 빌드를 할 때 요구되는 구성요소 패키지이다. ## 의존성 패키지로 roscpp, std_msgs, message_generation이며 이 패키지들이 존재하지 않으면 빌드 도중에 에러가 난다. find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation)
  • 80. Service / Service server / Service client 80 ## 메시지 선언: msgTutorial.msg ## 서비스 선언: srvTutorial.srv add_message_files(FILES msgTutorial.msg) add_service_files(FILES srvTutorial.srv) ## 의존하는 메시지를 설정하는 옵션이다. ## std_msgs가 설치되어 있지 않다면 빌드 도중에 에러가 난다. generate_messages(DEPENDENCIES std_msgs) ## 캐킨 패키지 옵션으로 라이브러리, 캐킨 빌드 의존성, 시스템 의존 패키지를 기술한다. catkin_package( INCLUDE_DIRS include LIBRARIES oroca_ros_tutorials CATKIN_DEPENDS roscpp std_msgs DEPENDS system_lib )
  • 81. Service / Service server / Service client 81 ## 인클루드 디렉터리를 설정한다. include_directories(include ${catkin_INCLUDE_DIRS}) ## ros_tutorial_msg_publisher 노드에 대한 빌드 옵션이다. ## 실행 파일, 타겟 링크 라이브러리, 추가 의존성 등을 설정한다. add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp) target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_msg_publisher oroca_ros_tutorials_generate_messages_cpp) ## ros_tutorial_msg_subscriber 노드에 대한 빌드 옵션이다. add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp) target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_msg_subscriber oroca_ros_tutorials_generate_messages_cpp) # ros_tutorial_srv_server 노드에 대한 빌드 옵션이다. add_executable(ros_tutorial_srv_server src/ros_tutorial_srv_server.cpp) target_link_libraries(ros_tutorial_srv_server ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_srv_server oroca_ros_tutorials_generate_messages_cpp) # ros_tutorial_srv_client 노드에 대한 빌드 옵션이다. add_executable(ros_tutorial_srv_client src/ros_tutorial_srv_client.cpp) target_link_libraries(ros_tutorial_srv_client ${catkin_LIBRARIES}) add_dependencies(ros_tutorial_srv_client oroca_ros_tutorials_generate_messages_cpp)
  • 82. Service / Service server / Service client 2) 서비스 파일 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 옵션을 넣었다. • 노드에서 사용할 메시지인 srvTutorial.srv를 빌드할 때 포함하라는 이야기 • int64 (메시지 형식), a, b (서비스 요청: request), result (서비스 응답: response), ‘---’ (요청과 응답을 구분하는 구분자) 82 $ roscd oroca_ros_tutorials → 패키지 폴더로 이동 $ mkdir srv → 패키지에 srv라는 서비스 폴더를 신규 작성 $ cd srv → 작성한 srv 폴더로 이동 $ gedit srvTutorial.srv → srvTutorial.srv 파일 신규 작성 및 내용 수정 int64 a int64 b --- int64 result add_service_files(FILES srvTutorial.srv)
  • 83. Service / Service server / Service client 3) 서비스 서버 노드 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다. • src 폴더의 ros_tutorial_srv_server.cpp라는 파일을 빌드하여 ros_tutorial_srv_server라는 실행 파일을 만들라는 이야기 83 add_executable(ros_tutorial_srv_server src/ros_tutorial_srv_server.cpp) $ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동 $ gedit ros_tutorial_srv_server.cpp → 소스 파일 신규 작성 및 내용 수정 #include "ros/ros.h" // ROS 기본 헤더 파일 #include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더
  • 84. Service / Service server / Service client 84 // 서비스 요청이 있을 경우, 아래의 처리를 수행한다. // 서비스 요청은 req, 서비스 응답은 res로 설정하였다. bool calculation(oroca_ros_tutorials::srvTutorial::Request &req, oroca_ros_tutorials::srvTutorial::Response &res) { // 서비스 요청시 받은 a와 b 값을 더하여 서비스 응답값에 저장한다. res.result = req.a + req.b; // 서비스 요청에 사용된 a, b 값의 표시 및 서비스 응답에 해당되는 result 값을 출력한다. ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.result); return true; }
  • 85. Service / Service server / Service client 85 int main(int argc, char **argv) // 노드 메인 함수 { ros::init(argc, argv, "ros_tutorial_srv_server"); // 노드명 초기화 ros::NodeHandle nh; // 노드 핸들 선언 // 서비스 서버 선언, // oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한 // 서비스 서버 ros_tutorial_service_server를 작성한다. // 서비스명은 ros_tutorial_srv이며 서비스 요청이 있을 때, // calculation라는 함수를 실행하라는 설정이다. ros::ServiceServer ros_tutorial_service_server = nh.advertiseService("ros_tutorial_srv", calculation); ROS_INFO("ready srv server!"); ros::spin(); // 서비스 요청을 대기한다 return 0; }
  • 86. Service / Service server / Service client 4) 서비스 클라이언트 노드 작성 • 앞서 CMakeLists.txt 파일에 다음과 같은 실행 파일을 생성하는 옵션을 주었다. • src 폴더의 ros_tutorial_srv_client.cpp라는 파일을 빌드하여 ros_tutorial_srv_client라는 실행 파일을 만들라는 이야기 86 add_executable(ros_tutorial_srv_client src/ros_tutorial_srv_client.cpp) $ roscd oroca_ros_tutorials/src → 패키지의 소스 폴더인 src 폴더로 이동 $ gedit ros_tutorial_srv_client.cpp → 소스 파일 신규 작성 및 내용 수정 #include "ros/ros.h" // ROS 기본 헤더 파일 #include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더 #include <cstdlib> // atoll 함수 사용을 위한 라이브러리
  • 87. Service / Service server / Service client 87 // 노드 메인 함수 int main(int argc, char **argv) { // 노드명 초기화 ros::init(argc, argv, "ros_tutorial_srv_client"); // 입력값 오류 처리 if (argc != 3) { ROS_INFO("cmd : rosrun ros_tutorial ros_tutorial_service_client arg0 arg1"); ROS_INFO("arg0: double number, arg1: double number"); return 1; } // ROS 시스템과 통신을 위한 노드 핸들 선언 ros::NodeHandle nh; // 서비스 클라이언트 선언, oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한 // 서비스 클라이언트 ros_tutorial_service_client를 작성한다. // 서비스명은 "ros_tutorial_srv"이다 ros::ServiceClient ros_tutorial_service_client = nh.serviceClient<oroca_ros_ tutorials::srvTutorial>("ros_tutorial_srv");
  • 88. Service / Service server / Service client 88 // srv라는 이름으로 srvTutorial 서비스 파일을 이용하는 서비스 파일을 선언한다. oroca_ros_tutorials::srvTutorial srv; // 서비스 요청 값으로 노드가 실행될 때 입력으로 사용된 매개변수를 각각의 a, b에 저장한다. srv.request.a = atoll(argv[1]); srv.request.b = atoll(argv[2]); // 서비스를 요청하고, 요청이 받아들여졌을 경우, 응답 값을 표시한다. if (ros_tutorial_service_client.call(srv)) { ROS_INFO("send srv, srv.Request.a and b: %ld, %ld", (long int)srv.request.a, (long int)srv.request.b); ROS_INFO("receive srv, srv.Response.result: %ld", (long int)srv.response.result); } else { ROS_ERROR("Failed to call service ros_tutorial_srv"); return 1; } return 0; }
  • 89. Service / Service server / Service client 5) ROS 노드 빌드 • 다음 명령어로 oroca_ros_tutorials 패키지의 서비스 파일, 서비스 서버 노 드와 클라이언트 노드를 빌드한다. • [참고] 파일시스템 • oroca_ros_tutorials 패키지의 소스 코드 파일: ~/catkin_ws/src/oroca_ros_tutorials/src • oroca_ros_tutorials 패키지의 메시지 파일: ~/catkin_ws/src/oroca_ros_tutorials/msg • 빌드된 결과물은 /catkin_ws의 /build와 /devel 폴더에 각각 생성 • /build 폴더에는 캐킨 빌드에서 사용된 설정 내용이 저장 • /devel/lib/oroca_ros_tutorials 폴더에는 실행 파일이 저장 • /devel/include/oroca_ros_tutorials 폴더에는 메시지 파일로부터 자동 생성된 메시지 헤 더 파일이 저장 89 $ cd ~/catkin_ws && catkin_make → catkin 폴더로 이동 후 catkin 빌드 실행
  • 90. Service / Service server / Service client 6) 서비스 서버 실행 • 서비스 서버는 서비스 요청이 있기 전까지 아무런 처리를 하지 않고 기다리도록 프로그래밍하였다. 그러므로 다음 명령어를 실행하면 서 비스 서버는 서비스 요청을 기다린다. 90 [참고로 노드 실행에 앞서 roscore를 실행하는 것을 잊지 말자.] $ rosrun oroca_ros_tutorials ros_tutorial_srv_server [INFO] [1423118250.6704810023]: ready srv server!
  • 91. Service / Service server / Service client 7) 서비스 클라이언트 실행 • 서비스 서버를 실행했으면 이어서 다음 명령어로 서비스 클라이언트를 실행한다. • 서비스 클라이언트를 실행하면서 입력해준 실행 매개변수 2와 3을 서비스 요청 값으로 전송하도록 프로그래밍하였다. • 2와 3은 각각 a, b 값으로 서비스를 요청하게 되고, 결괏값으로 둘의 합인 5를 응답값으 로 전송받았다. • 여기서는 단순하게 실행 매개변수로 이를 이용하였으나, 실제 활용에서는 명령어로 대 체해도 되고, 계산되어야 할 값, 트리거용 변수 등을 서비스 요청 값으로 사용할 수도 있다. 91 $ rosrun oroca_ros_tutorials ros_tutorial_srv_client 2 3 [INFO] [1423118255.156345643]: send srv, srv.Request.a and b: 2, 3 [INFO] [1423118255.156345021]: recieve srv, srv.Response.result: 5
  • 92. Service / Service server / Service client [참고] rqt_graph • 서비스는 아래 그림의 토픽과는 달리 일회성이므로 rqt_graph 등에 서 확인할 수 없다. 92
  • 93. Service / Service server / Service client [참고] rosservice call 명령어 사용 방법 • 서비스 요청은 서비스 클라이언트 노드를 실행하는 방법도 있지만 “rosservice call”이라는 명령어나 rqt의 ServiceCaller를 이용하는 방 법도 있다. • 그 중 우선, rosservice call를 사용하는 방법에 대해서 알아보자. 93 $ rosservice call /ros_tutorial_srv 3 4 result: 7 $ rosservice call /ros_tutorial_srv 5 15 result: 20
  • 94. Service / Service server / Service client [참고] GUI 도구인 Service Caller 사용 방법 • ROS의 GUI 도구인 rqt를 실행하자. • rqt 프로그램의 메뉴에서 [플러그인(Plugins)] → [서비스(Service)] → [Service Caller]를 선택하면 다음과 같은 화면이 나온다. (1) servic에 /ros_tutorial_srv 입력 (2) a = 10, b = 5 입력 (3) Call 버튼을 누른다. (4) Result에 15라는 값이 표시된다. 94 $ rqt
  • 95. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 95
  • 96. Parameter 1) 매개변수를 활용한 노드 작성 • 이전 강의에서는 작성한 서비스 서버와 클라이언트 노드에서 ros_tutorial_srv_server.cpp 소스를 수정하여 서비스 요청으로 입력된 a와 b를 단순히 덧셈하는 것이 아니라, 사칙연산을 할 수 있 도록 매개변수를 활용해 볼 것이다. • 다음 순서대로 ros_tutorial_srv_server.cpp 소스를 수정해보자. 96 $ roscd oroca_ros_tutorials/src → 패키지의 소스 코드 폴더인 src 폴더로 이동 $ gedit ros_tutorial_srv_server.cpp → 소스 파일 내용 수정 #include "ros/ros.h" // ROS 기본 헤더파일 #include "oroca_ros_tutorials/srvTutorial.h" // srvTutorial 서비스 파일 헤더 (빌드 후 자동 생성됨) #define PLUS 1 // 덧셈 #define MINUS 2 // 빼기 #define MULTIPLICATION 3 // 곱하기 #define DIVISION 4 // 나누기 int g_operator = PLUS;
  • 97. Parameter 97 // 서비스 요청이 있을 경우, 아래의 처리를 수행한다 // 서비스 요청은 req, 서비스 응답은 res로 설정하였다 bool calculation(oroca_ros_tutorials::srvTutorial::Request &req, oroca_ros_tutorials::srvTutorial::Response &res) { // 서비스 요청시 받은 a와 b 값을 파라미터 값에 따라 연산자를 달리한다. // 계산한 후 서비스 응답 값에 저장한다 switch(g_operator){ case PLUS: res.result = req.a + req.b; break; case MINUS: res.result = req.a - req.b; break; case MULTIPLICATION: res.result = req.a * req.b; break;
  • 98. Parameter 98 case DIVISION: if(req.b == 0){ res.result = 0; break; } else{ res.result = req.a / req.b; break; } default: res.result = req.a + req.b; break; } // 서비스 요청에 사용된 a, b값의 표시 및 서비스 응답에 해당되는 result 값을 출력한다 ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.result); return true; }
  • 99. Parameter 99 int main(int argc, char **argv) // 노드 메인 함수 { ros::init(argc, argv, "ros_tutorial_srv_server"); // 노드명 초기화 ros::NodeHandle nh; // ROS 시스템과 통신을 위한 노드 핸들 선언 nh.setParam("calculation_method", PLUS); // 매개변수 초기설정 // 서비스 서버 선언, oroca_ros_tutorials 패키지의 srvTutorial 서비스 파일을 이용한 // 서비스 서버 ros_tutorial_service_server 를 작성한다. 서비스명은 "ros_tutorial_srv" 이며, // 서비스 요청이 있을경우, calculation 라는 함수를 실행하라는 설정이다 ros::ServiceServer ros_tutorial_service_server = nh.advertiseService("ros_tutorial_srv", calculation); ROS_INFO("ready srv server!");
  • 100. Parameter • Parameter 관련하여 설정(setParam) 및 읽기(getParam) 사용법에 주목 할 것! [참고] 매개변수로 사용 가능 형태 • 매개변수는 integers, floats, boolean, string, dictionaries, list 등으로 설정할 수 있다. • 간단히 예를 들자면, 1은 integer, 1.0은 floats, “internetofthings”은 string, true는 boolean, [1,2,3]은 integers의 list, a: b, c: d는 dictionary이다. 100 ros::Rate r(10); // 10 hz while (1) { nh.getParam("calculation_method", g_operator); // 연산자를 매개변수로부터 받은 값으로 변경한다 ros::spinOnce(); // 콜백함수 처리루틴 r.sleep(); // 루틴 반복을 위한 sleep 처리 } return 0; }
  • 101. Parameter 2) 노드 빌드 및 실행 3) 매개변수 목록 보기 • “rosparam list” 명령어로 현재 ROS 네트워크에 사용된 매개변수의 목록을 확인할 수 있다. /calculation_method가 우리가 사용한 매개 변수이다. 101 $ cd ~/catkin_ws && catkin_make $ rosrun oroca_ros_tutorials ros_tutorial_srv_server [INFO] [1423118250.6704810023]: ready srv server! $ rosparam list /calculation_method /rosdistro /rosversion /run_id
  • 102. Parameter 4) 매개변수 사용 예 • 다음 명령어대로 매개변수를 설정하여, 매번 같은 서비스 요청을 하여 서비스 처리가 달라짐을 확인해보자. • ROS에서 매개변수는 노드 외부로부터 노드의 흐름이나 설정, 처리 등을 을 바꿀 수 있다. 매우 유용한 기 능이므로 지금 당장 쓰지 않더라도 꼭 알아두도록 하자. 102 $ rosservice call /ros_tutorial_srv 10 5 → 사칙연산의 변수 a, b 입력 result: 15 → 디폴트 사칙연산인 덧셈 결괏값 $ rosparam set /calculation_method 2 → 뺄셈 $ rosservice call /ros_tutorial_srv 10 5 result: 5 $ rosparam set /calculation_method 3 → 곱셈 $ rosservice call /ros_tutorial_srv 10 5 result: 50 $ rosparam set /calculation_method 4 → 나눗셈 $ rosservice call /ros_tutorial_srv 10 5 result: 2
  • 103. Index I. 메시지, 토픽, 서비스, 매개변수 II. 퍼블리셔와 서브스크라이버 노드 작성 및 실행 III. 서비스 서버와 서비스 클라이언트 노드 작성 및 실행 IV. 매개변수 사용법 V. roslaunch 사용법 103
  • 104. roslaunch 사용법 • rosrun이 하나의 노드를 실행하는 명령어하는 명령어 이다. • roslaunch는 하나 이상의 정해진 노드를 실행시킬 수 있다. • 그 밖의 기능으로 노드를 실행할 때 패키지의 매개변수나 노드 이름 변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 환경 변수 변경 등의 옵션을 붙일 수 있는 ROS 명령어이다. • roslaunch는 ‘*.launch’라는 파일을 사용하여 실행 노드를 설정하는데 이는 XML 기반이며, 태그별 옵션을 제공한다. • 실행 명령어는 “roslaunch [패키지명] [roslaunch 파일]”이다. 104
  • 105. roslaunch 사용법 1) roslaunch의 활용 • 이전에 작성한 ros_tutorial_msg_publisher와 ros_tutorial_msg_subscriber 노드 의 이름을 바꾸어서 실행해 보자. 이름만 바꾸면 의미가 없으니, 퍼블리쉬 노드 와 서브스크라이버 노드를 각각 두 개씩 구동하여 서로 별도의 메시지 통신을 해보자. • 우선, *.launch 파일을 작성하자. roslaunch에 사용되는 파일은 *.launch라는 파 일명을 가지며 해당 패키지 폴더에 launch라는 폴더를 생성하고 그 폴더 안에 넣어야 한다. 다음 명령어대로 폴더를 생성하고 union.launch라는 새 파일을 생 성해보자. 105 $ roscd oroca_ros_tutorials $ mkdir launch $ cd launch $ gedit union.launch
  • 106. roslaunch 사용법 • <launch> 태그 안에는 roslaunch 명령어로 노드를 실행할 때 필요 한 태그들이 기술된다. <node>는 roslaunch로 실행할 노드를 기술 하게 된다. 옵션으로는 pkg, type, name이 있다. • pkg 패키지의 이름 • type 실제 실행할 노드의 이름(노드명) • name 위 type에 해당하는 노드가 실행될 때 붙여지는 이름(실행명), 일반 적으로는 type과 같게 설정하지만 필요에 따라 실행할 때 이름을 변경하도록 설정할 수 있다. 106 <launch> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher1"/> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber1"/> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher2"/> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber2"/> </launch>
  • 107. roslaunch 사용법 • roslaunch 파일을 작성하였으면 다음처럼 union.launch를 실행하자. • [참고] roslaunch 사용시에 상태 출력 방법 • roslaunch 명령어로여럿의 노드가 실행될 때는 실행되는 노드들의 출력(info, error 등)이 터미널 스크린에 표시되지 않아 디버깅하기 어렵게 된다. 이때에 --screen 옵션을 추가해주면 해당 터미널에 실행되는 모든 노드들의 출력들 이 터미널 스크린에 표시된다. 107 $ roslaunch oroca_ros_tutorials union.launch --screen
  • 108. roslaunch 사용법 • 실행 결과? • 결과적으로 ros_tutorial_msg_publisher 노드가 msg_publisher1와 msg_publisher2로 이름이 바뀌어 두 개의 노드가 실행되었다. • ros_tutorial_msg_subscriber 노드도 msg_subscriber1와 msg_subscriber2로 이름이 바뀌어 실행되었다. 108 $ rosnode list /msg_publisher1 /msg_publisher2 /msg_subscriber1 /msg_subscriber2 /rosout
  • 109. roslaunch 사용법 • 문제는 “퍼블리쉬 노드와 서브스크라이버 노드를 각각 두 개씩 구동하여 서로 별도의 메시지 통신하게 한다”는 처음 의도와는 다르게 rqt_graph를 통해 보면 서로의 메시지를 모두 서브스크라이브하고 있다는 것이다. • 이는 단순히 실행되는 노드의 이름만을 변경해주었을 뿐 사용되는 메시지의 이 름을 바꿔주지 않았기 때문이다. • 이 문제를 다른 roslaunch 네임스페이스 태그를 사용하여 해결해보자. 109
  • 110. roslaunch 사용법 • union.launch을 수정하자. 110 $ roscd oroca_ros_tutorials/launch $ gedit union.launch <launch> <group ns="ns1"> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher"/> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber"/> </group> <group ns="ns2"> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_publisher" name="msg_publisher"/> <node pkg="oroca_ros_tutorials" type="ros_tutorial_msg_subscriber" name="msg_subscriber"/> </group> </launch>
  • 111. roslaunch 사용법 • 변경 후의 실행된 노드들의 모습 111
  • 112. roslaunch 사용법 2) launch 태그 <launch> roslaunch 구문의 시작과 끝을 가리킨다. <node> 노드 실행에 대한 태그이다. 패키지, 노드명, 실행명을 변경할 수 있다. <machine> 노드를 실행하는 PC의 이름, address, ros-root, ros-package-path 등을 설정할 수 있다. <include> 다른 패키지나 같은 패키지에 속해 있는 다른 launch를 불러와 하나의 파일처럼 실행할 수 있다. <remap> 토픽 이름 등의 노드에서 사용 중인 ROS 변수의 이름을 변경할 수 있다. <env> 환경 변수를 변경한다. <param> ROS 매개변수를 변경한다 <rosparam> 파라미터를 설정한다. <group> 실행되는 노드를 그룹화할 때 사용한다. <test> 노드를 테스트할 때 사용한다. <node>와 비슷하지만 테스트에 사용할 수 있는 옵션들이 추가되어 있다. <arg> 변수를 정의할 수 있어서 주소 및 대체 이름 등에 사용한다. 112
  • 113. 이번 강좌의 리포지토리 • Example 리포지토리 • https://github.com/oroca/oroca_ros_tutorials • 웹에서 바로 보거나 다운로드도 가능하지만 바로 적용해 보고 싶다 면 다음 명령어로 리포지토리를 복사하여 빌드하면 된다. • 참고로 본 강의의 최종판 소스코드가 업로드 되어 있기에 강의 진행 을 위해 도중에 수정된 소스코드는 최종 버전만 확인 할 수 있다. 113 $ cd ~/catkin_ws/src $ git clone https://github.com/oroca/oroca_ros_tutorials.git $ cd ~/catkin_ws $ catkin_make
  • 114. 114
  • 116. 국내 유일! 최초! ROS 책 비 영어권 최고의 책 인세 전액 기부 여기서! 광고 하나 나가요~
  • 117. 여기서! 광고 둘 나가요~ • 오로카 • www.oroca.org • 오픈 로보틱스 지향 • 풀뿌리 로봇공학의 저변 활성화 • 열린 강좌, 세미나, 프로젝트 진행 • 로봇공학을 위한 열린 모임 (KOS-ROBOT) • www.facebook.com/groups/KoreanRobotics • 로봇공학 통합 커뮤니티 지향 • 일반인과 전문가가 어울러지는 한마당 • 로봇공학 소식 공유 • 연구자 간의 협력 혼자 하기에 답답하시다고요? 커뮤니티에서 함께 해요~
  • 119. Thanks for your attention! 표윤석 119 Yoonseok Pyo pyo@robotis.com www.robotpilot.net 표윤석 www.facebook.com/yoonseok.pyo