[ROS] package build

Eugene CHOI·2021년 4월 11일
1

ROS

목록 보기
1/2
post-thumbnail

ROS의 빌드 시스템은 CMake 기반의 catkin 빌드 시스템을 사용합니다.

ROS 패키지 빌드 과정

1. Pakage 생성

패키지 생성 명령어

$ 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

2. 패키지 설정 파일(package.xml) 수정

3. 빌드 설정 파일(CMakeLists.txt) 수정

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}" ) // 변수 출력

4. Package Build

만든 패키지를 ROS 패키지 목록에 반영하는 명령어를 사용하여 프로파일을 갱신합니다.

$ rospacke profile

작업 폴더로 이동하여 빌드를 해줍니다.
.bashrc 에서 alias를 설정하였다면 cm을 입력하여 쉽게 실행할 수 있습니다.

$ cd ~/catkin_ws && catkin_make

5. 노드 실행

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
...
profile
Hi, my name is Eugene CHOI the Automotive MCU FW developer.

0개의 댓글