3장 ROS 구조 및 빌드 시스템
1. ROS 용어
패키지 : ROS 소프트웨어의 기본 단위. 패키지는 노드, 라이브러리, 환경설정 파일들을 통합하는 최소의 빌드 단위이며, 배포 단위이다.
패키지 매니페스트 : 패키지의 작성자, 라이선스, 의존성, 컨피그레이션 플레그 등을 포함하는 패키지 정보
메타 패키지 : 이전에는 스택으로 불리웠지만, 특수한 목적을 위한 패키지 그룹을 지칭한다. 대표적인 예로 네비게이션 스택을 예로 들 수 있다.
메시지 : 한 ROS 프로세서에서 다른 ROS 프로세서로 정보를 전달하는 한 형태
서비스 : 프로세스간의 요청/응답 상호작용
Service, Service Server, Service Client
Node : 최소 단위의 실행 가능한 프로세서를 가리키는 용어로써 하나의 실행 가능한 프로그램으로 생각하면 된다. ROS에서는 최소한의 실행 단위로 프로그램을 나누어 작업하게 된다. 각 노드는 메시지 통신으로 데이터를 주고 받는다.
Package : 하나 이상의 노드, 노드 실행을 위한 정보 등을 묶어 놓은것. 또한, 패키지의 묶음을 메타패키지라 하여 따로 분리 한다.
Message : 메시지를 통해 노드 간의 데이터를 주고 받게 된다. 메시지는 integer, floating point, boolean와 같은 변수 형태이다. 또한, 메시지 안에 메시지를 품고 있는 간단한 데이터 구조 및 메시지들의 배열과 같은 구조도 사용할 수 있다.
Publisher, Subscriber, Topic

Action, Action Server, Action Client
2. ROS 통신 방식
3. TF(Transform)
각조인트(joint)들의 상대좌표 변환
트리(tree) 형태로 조인트들 간의 관계도를 표시함
4. ROS 관련 명령어
명령어
중요도
명령어풀이
세부설명
roscd
★★★
ros+cd(changes directory)
지정한 ROS 패키지의 디렉터리로 이동
rosls
★☆☆
ros+ls(lists files)
ROS 패키지의 파일목록 확인
rosed
★☆☆
ros+ed(editor)
ROS 패키지의 파일편집
roscp
★☆☆
ros+cp(copies files)
ROS 패키지의 파일복사
rospd
☆☆☆
ros+pushd
ROS 디렉터리 인덱스에 디렉터리 추가
rosd
☆☆☆
ros+directory
ROS 디렉터리 인덱스 확인
명령어
중요도
명령어풀이
세부설명
roscore
★★★
ros+core
-master(ROS 네임서비스) -rosout(로그기록) -parameter server(파라미터관리)
rosrun
★★★
ros+run
노드실행
roslaunch
★★★
ros+launch
노드를 여러개 실행 및 실행 옵션 설정
rosclean
★★☆
ros+clean
ROS 로그 파일을 검사하거나 삭제
명령어
중요도
명령어풀이
세부설명
rostopic
★★★
ros+topic
ROS 토픽 정보 확인
rosservice
★★★
ros+service
ROS 서비스 정보 확인
rosnode
★★★
ros+node
ROS 노드 정보 확인
rosparam
★★★
ros+param(parameter)
ROS 파라미터 정보 확인, 수정
rosbag
★★★
ros+bag
ROS 메시지 기록, 재생
rosmsg
★★☆
ros+msg
ROS 메시지 정보 확인
rossrv
★★☆
ros+srv
ROS 서비스 정보 확인
rosversion
★☆☆
ros+version
ROS 패키지 및 배포 릴리즈 버전 정보 확인
roswtf
☆☆☆
ros+wtf
ROS 시스템 검사
명령어
중요도
세부설명
catkin_create_pkg
★★★
패키지 자동 생성
catkin_make
★★★
캐킨 빌드시스템에 기반을 둔 빌드
catkin_eclipse
★★☆
캐킨 빌드 시스템으로 생성한 패키지를 이클립스에서 사용 할 수 있게 변경
catkin_prepare_release
★★☆
릴리즈 할때 사용되는 로그정리 및 버전 태깅
catkin_generate_changelog
★★☆
릴리즈 할때 CHANGELOG.rst 파일 생성 또는 업데이트
catkin_init_workspace
★★☆
캐킨 빌드 시스템의 작업폴더 초기화
catkin_find
★☆☆
캐킨 검색
명령어
중요도
명령어풀이
세부설명
rospack
★★★
ros+pack(age)
ROS 패키지와 관련된 정보 보기
rosinstall
★★☆
ros+install
ROS 추가 패키지 설치
rosdep
★★☆
ros+dep(endencies)
해당패키지의 의존성 파일 설치
roslocate
☆☆☆
ros+locate
ROS 패키지 정보 관련 명령어
roscreate-pkg
☆☆☆
ros+create-pkg
ROS 패키지 자동생성(구rosbuild 시스템에서사용)
rosmake
☆☆☆
ros+make
ROS 패키지를 빌드(구rosbuild 시스템에서사용)
5. 빌드 시스템
Column 1
Column 2
Quantity
Unit
angle
radian
frequency
hertz
force
newton
power
watt
voltage
volt
length
meter
mess
kilogram
time
second
current
ampere
temperature
celsius
대상
명명규칙
예제
패키지
under_scored
Ex) first_ros_package
토픽, 서비스
under_scored
Ex) raw_image
파일
under_scored
Ex) turtlebot3_fake.cpp
네임스페이스
under_scored
Ex) ros_awesome_package
변수
under_scored
Ex) string table_name;
타입
CamelCased
Ex) typedefint32_t propertiesNumber;
클래스
CamelCased
Ex) classUrlTable
구조체
CamelCased
Ex) structUrlTableProperties
열거형
CamelCased
Ex) enumChoiceNumber
함수
camelCased
Ex) addTableEntry();
메소드
camelCased
Ex) void setNumEntries(int32_t num_entries)
상수
ALL_CAPITALS
Ex) const uint8_t DAYS_IN_A_WEEK = 7;
SI(Systeme Internationale) 단위 사용
5.1 Topic / Publisher / Subscriber 실습
1) 패키지 생성
cd ~/catkin_ws/src
catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp
cd ros_tutorials_topic
ls
include → 헤더파일폴더
src→ 소스코드폴더
CMakeLists.txt → 빌드설정파일
package.xml→ 패키지설정파일
2) 패키지 설정 파일(package.xml) 수정
gedit package.xml
<?xmlversion="1.0"?>
<packageformat="2">
<name>ros_tutorials_topic</name>
<version>0.1.0</version>
<description>ROS turtorialpackage to learn the topic</description>
<license>Apache 2.0</license>
<authoremail="pyo@robotis.com">Yoonseok Pyo</author>
<maintaineremail="pyo@robotis.com">Yoonseok Pyo</maintainer>
<urltype="website">http://www.robotis.com</url>
<urltype="repository">https://github.com/ROBOTIS-GIT/ros_tutorials.git</url>
<urltype="bugtracker">https://github.com/ROBOTIS-GIT/ros_tutorials/issues</url>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>std_msgs</depend>
<depend>message_generation</depend>
<export></export >
</package>
3) 빌드 설정 파일(CMakeLists.txt) 수정
gedit CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(ros_tutorials_topic)
## 캐킨빌드를할때요구되는구성요소패키지이다.
## 의존성패키지로message_generation, std_msgs, roscpp이며이패키지들이존재하지않으면빌드도중에에러가난다.
find_package(catkin REQUIRED COMPONENTS message_generationstd_msgsroscpp)
## 메시지선언: MsgTutorial.msg
add_message_files(FILES MsgTutorial.msg)
## 의존하는메시지를설정하는옵션이다.
## std_msgs가설치되어있지않다면빌드도중에에러가난다.
generate_messages(DEPENDENCIES std_msgs)
## 캐킨패키지옵션으로라이브러리, 캐킨빌드의존성, 시스템의존패키지를기술한다.
catkin_package(
LIBRARIES ros_tutorials_topic
CATKIN_DEPENDS std_msgsroscpp
)
## 인클루드디렉터리를설정한다.
include_directories(${catkin_INCLUDE_DIRS})
## topic_publisher노드에대한빌드옵션이다.
## 실행파일, 타깃링크라이브러리, 추가의존성등을설정한다.
add_executable(topic_publisher src/topic_publisher.cpp)
add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_publisher ${catkin_LIBRARIES})
## topic_subscriber노드에대한빌드옵션이다.
add_executable(topic_subscriber src/topic_subscriber.cpp)
add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(topic_subscriber ${catkin_LIBRARIES})
4) 메시지 파일 작성
roscd ros_tutorials_topic
mkdir msg
cd msg
gedit MsgTutorial.msg
time stamp
int32 data
5) 퍼블리셔 노드 작성
roscd ros_tutorials_topic/src
gedit topic_publisher.cpp
#include "ros/ros.h"// ROS 기본 헤더 파일
#include "ros_tutorials_topic/MsgTutorial.h"// MsgTutorial 메시지 파일 헤더(빌드 후 자동 생성 됨)
int main(int argc, char **argv) // 노드 메인 함수
{
ros::init(argc, argv, "topic_publisher"); // 노드명 초기화
ros::NodeHandle nh;// ROS 시스템과 통신을 위한 노드 핸들 선언
// 퍼블리셔선언, ros_tutorials_topic패키지의MsgTutorial메시지파일을이용한
// 퍼블리셔ros_tutorial_pub를작성한다. 토픽명은"ros_tutorial_msg" 이며,
// 퍼블리셔큐(queue) 사이즈를100개로설정한다는것이다
ros::Publisher ros_tutorial_pub= nh.advertise<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg", 100);
// 루프주기를설정한다. "10" 이라는것은10Hz를말하는것으로0.1초간격으로반복된다
ros::Rate loop_rate(10);
// MsgTutorial메시지파일형식으로msg라는메시지를선언
ros_tutorials_topic::MsgTutorial msg;
// 메시지에사용될변수선언
int count = 0;
while (ros::ok())
{
msg.stamp= ros::Time::now();// 현재시간을msg의하위stamp 메시지에담는다
msg.data= count; // count라는변수값을msg의하위data 메시지에담는다
ROS_INFO("send msg= %d", msg.stamp.sec); // stamp.sec메시지를표시한다
ROS_INFO("send msg= %d", msg.stamp.nsec); // stamp.nsec메시지를표시한다
ROS_INFO("send msg= %d", msg.data); // data 메시지를표시한다
ros_tutorial_pub.publish(msg);// 메시지를발행한다
loop_rate.sleep();// 위에서정한루프주기에따라슬립에들어간다
++count;// count 변수1씩증가
}
return 0;
}
6) 서브 스크라이버 노드 작성
roscd ros_tutorials_topic/src→ 패키지의 소스 폴더인 src폴더로 이동
gedit topic_subscriber.cpp→ 소스파일 신규작성 및 내용 수정
#include "ros/ros.h" // ROS 기본헤더파일
#include "ros_tutorials_topic/MsgTutorial.h" // MsgTutorial메시지파일헤더(빌드후자동생성됨)
// 메시지콜백함수로써, 밑에서설정한ros_tutorial_msg라는이름의토픽
// 메시지를수신하였을때동작하는함수이다
// 입력메시지로는ros_tutorials_topic패키지의MsgTutorial메시지를받도록되어있다
void msgCallback(const ros_tutorials_topic::MsgTutorial::ConstPtr& msg)
{
ROS_INFO("recievemsg= %d", msg->stamp.sec); // stamp.sec메시지를표시한다
ROS_INFO("recievemsg= %d", msg->stamp.nsec); // stamp.nsec메시지를표시한다
ROS_INFO("recievemsg= %d", msg->data); // data 메시지를표시한다
}
int main(int argc, char **argv)// 노드메인함수
{
ros::init(argc, argv, "topic_subscriber");// 노드명초기화
ros::NodeHandle nh; // ROS 시스템과통신을위한노드핸들선언
// 서브스크라이버선언, ros_tutorials_topic패키지의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;
}
7) ROS 노드 빌드
cd~/catkin_ws
catkin_make
•ros_tutorials_topic 패키지의 소스 코드 파일: ~/catkin_ws/src/ros_tutorials_topic/src
•ros_tutorials_topic패키지의 메시지 파일: ~/catkin_ws/src/ros_tutorials_topic/msg
•빌드된 결과물은 /catkin_ws의 /build와/devel폴더에 각각 생성
•/build 폴더에는 캐킨 빌드에서 사용된 설정 내용이 저장
•/devel/lib/ros_tutorials_topic폴더에는 실행 파일이 저장
•/devel/include/ros_tutorials_topic폴더에는 메시지 파일로 부터 자동 생성된 메시지 헤더 파일이 저장
roscore
rosrun ros_tutorials_topic topic_publisher
rostopic list
/ros_tutorial_msg
/rosout
/rosout_agg
rostopic echo /ros_tutorial_msg
rosrun ros_tutorials_topic topic_subscriber
rqt_graph
5.2 git을 활용하여 예제 활용하기
sudo apt-get install git
cd~/catkin_ws/src
git clone https://github.com/ROBOTIS-GIT/ros_tutorials.git
cd~/catkin_ws
catkin_make
rosrun ros_tutorials_topic topic_publisher
rosrun ros_tutorials_topic topic_subscriber
5.3 roslaunch
•roslaunch는 하나 이상의 정해진 노드를 실행 시킬수 있다.
•roslaunch는‘*.launch’라는 파일을 사용하여 실행노드를 설정하는데 이는XML 기반이며, 태그별 옵션을 제공한다.
•실행 명령어는"roslaunch [패키지명] [roslaunch파일]”이다.
roscd ros_tutorials_topic
mkdir launch
cd launch
gedit union.launch
<launch>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>
•pkg 패키지의 이름
•type 실제 실행 할 노드의 이름(노드명)
•name 위 type에 해당하는 노드가 실행될때 붙여지는 이름(실행명), 일반적으로는 type과 같게 설정하지만 필요에 따라 실행할때 이름을 변경하도록설정할수 있다.
roslaunch ros_tutorials_topic union.launch --screen
rosnode list
/topic_publisher1
/topic_publisher2
/topic_subscriber1
/topic_subscriber2
/rosout
rqt_graph
Last updated
Was this helpful?