ROS의 빌드 시스템은 CMake 기반의 catkin 빌드 시스템을 사용합니다.
패키지 생성 명령어
$ catkin_create_pkg [패키지이름] [의존 패키지1] [의존 패키지2] [의존 패키지...]
ROS에서
pakage name
은 모두 소문자를 사용하여야 한다. 그리고 -(dash)보다 _(undersocre)를 사용하여 단어를 붙이는 것을 스타일로 삼고 있습니다.
생성 후 작업 폴더(source)로 이동합니다.
.bashrc 에서 alias를 설정하였다면 cs
을 입력하여 쉽게 실행할 수 있습니다.
$ cd ~/catkin_ws/src
ROS의 표준 메세지 패키지인 std_msgs
와 c/cpp 사용을 위해 roscpp
를 의존 패키지로 설정하고 패키지를 생성합니다.
$ catkin_create_pkg fisrt_test std_msgs roscpp
first_test란 이름으로 생성한 패키지 결과
~/catkin_ws/src/first_test$ tree
├── CMakeLists.txt
├── include
│ └── first_test
├── package.xml
└── src
└── first_test_node.cpp
add_executable() 옵션을 통해서 실행 파일 코드를 추가할 수 있습니다.
다음 코드는 hello_world.cpp 파일을 이용하여 hello_world_node 실행 파일을 생성하는 설정입니다.
add_executable(${PROJECT_NAME}_node src/first_test_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;
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;
}
CMakeList.txt 안에 다음과 같은 명령어를 사용하면 빌드 중 변수 및 메세지를 출력할 수 있습니다.
MESSAGE ( [<Type>] <메시지> )
MESSAGE ( [<Type>] "Hi master" ) // 문자열 출력
MESSAGE ( [<Type>] "${PROJECT_NAME}" ) // 변수 출력
만든 패키지를 ROS 패키지 목록에 반영하는 명령어를 사용하여 프로파일을 갱신합니다.
$ rospacke profile
작업 폴더로 이동하여 빌드를 해줍니다.
.bashrc 에서 alias를 설정하였다면 cm
을 입력하여 쉽게 실행할 수 있습니다.
$ cd ~/catkin_ws && catkin_make
roscore로 ROS master를 구동합니다.
ROS master란 노드 간의 접속을 위해 초기에 노드들의 정도를 등록받고 연결 요청이 있을 때, 이 정보를 다른 노드에 알려주는 중계 역할을 합니다.
roscore를 실행시 rosout과 parameter server를 동시에 실행하게 됩니다.
$ roscore
특정 패키지의 특정 노드를 실행할 수 있는 명령어입니다.
$ rosrun [패키지 이름] [노드 이름]
복수개의 한 패키지 내의 노드를 실행할 경우 다음과 같은 명령어를 사용합니다.
$ roslaunch [패키지이름] [launch 파일 이름]
다음 명령어를 통해 first_test라는 패키지의 first_test_node라는 이름의 노드를 실행할 수 있습니다.
$ rosrun first_test first_test_node
[ INFO] [1618111391.096604500]: hello world!0
[ INFO] [1618111391.197078100]: hello world!1
[ INFO] [1618111391.297476400]: hello world!2
[ INFO] [1618111391.397453400]: hello world!3
[ INFO] [1618111391.497052700]: hello world!4
[ INFO] [1618111391.597231200]: hello world!5
[ INFO] [1618111391.697223600]: hello world!6
[ INFO] [1618111391.796972800]: hello world!7
[ INFO] [1618111391.897519600]: hello world!8
[ INFO] [1618111391.997329800]: hello world!9
[ INFO] [1618111392.097228100]: hello world!10
[ INFO] [1618111392.197298800]: hello world!11
[ INFO] [1618111392.297280500]: hello world!12
[ INFO] [1618111392.397248400]: hello world!13
[ INFO] [1618111392.497020000]: hello world!14
[ INFO] [1618111392.596903700]: hello world!15
[ INFO] [1618111392.696873400]: hello world!16
[ INFO] [1618111392.797190200]: hello world!17
[ INFO] [1618111392.897082000]: hello world!18
[ INFO] [1618111392.997451400]: hello world!19
...