4 minute read

ROS 패키지 생성

  1. 패키지 생성
cd ~/catkin_ws/src
  • beginner_tutorials 패키지 생성
catkin_create_pkg [pakage_name] [depend1] [depend2] [depend2]
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • beginner_tutorials 폴더가 생성이되고 CMakeList.txt ,package.xml이 생성된다. 여기에 위에서 설정한 패키지에 대한 설명을 포함한다.
cd beginner_tutorials
  1. 빌드 디렉토리 이동
$ cd ~/catkin_ws
$ ls
include # 헤더 파일 폴더
src # 소스 코드 볼더
CMakeList.txt # 빌드 설정 파일
package.xml # 패키지 설정 파일
  • catkin_makecatkin build를 혼용해서 사용했울 경우 에러가 발생할 수 있다.
catkin clean # 이전 빌드 초기화
  • 저는 catkin_make로는 노드 생성이 되지 않아 catkin build 사용합니다.
catkin build

source ~/catkin_ws/devel/setup.bash

패키지 설정 파일

vim package.xml
  • 아래와 같이 패키지 설정 파일 작성
<?xml version="1.0"?>
<package format="2">
  <name>beginner_tutorials</name>
  <version>0.1.0</version>
  <description>The beginner_tutorials package</description>

  <maintainer email="you@yourdomain.tld">Your Name</maintainer>
  <license>BSD</license>
  <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  <author email="you@yourdomain.tld">Jane Doe</author>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

</package>

빌드 설정 파일 작성

vim CMakeList.txt
  • 아래와 같이 빌드 설정 파일 작성
# %Tag(FULLTEXT)%
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)

## Declare ROS messages and services
add_message_files(FILES Num.msg)
add_service_files(FILES AddTwoInts.srv)

## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

# %EndTag(FULLTEXT)%

메시지 파일 작성

cd ~/catkin_ws/beginner_tutorials
mkdir msg
vim Num.msg
  • Num.msg에 아래 작성
  • int64 형식의 num 생성
    int64 num
    

    서비스 파일 작성

    cd ~/catkin_ws/beginner_tutorials
    mkdir srv
    vim AddTwoInts.srv
    
  • Num.msg에 아래 작성
  • int64 형식의 num 생성
응답
---
요청
int64 a
int64 b
---
int64 sum

퍼블리셔 노드 생성

  • 파일 생성
cd ~/catkin_ws/src
vim talker.cpp
  • talker.cpp에 코드 내용 작성
#include "ros/ros.h" // ROS 기본 헤더 파일
#include "std_msgs/String.h" //std_msg 패키지 파일 헤더

#include <sstream> 
//주어진 문자열에서 필요한 정보를 빼낼 때 유용하게 사용


int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker"); // 노드명 초기화

  ros::NodeHandle n; //ROS 시스템과 통신을 위한 노드 핸들 선언

  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  // std_msgs 패키지의 스트링 사용,
  // 퍼블리셔 chatter_pub를 작성
  // 토픽 명은 chatter 이며, 큐 사이즈를 1000으로 설정

  ros::Rate loop_rate(10);
  // 루프 주기 설정 , 0.1초 간격으로 처리 반복
  int count = 0;
  while (ros::ok())
  {
    std_msgs::String msg; // 타입이 std_msgs::String인 메시지 변수 msg 선언

    std::stringstream ss;//stringstream 생성
    ss << "hello world " << count; 
    //helloworld랑 count 변수 붙이기

    msg.data = ss.str(); // 현재 stringstream이 저장하고 있는 문자열의 복사본을 반환

    ROS_INFO("%s", msg.data.c_str()); 
    //msg.data의 string의 첫번째 문자열 주소값 반환
    // 한것을 터미널에 해당 문쟈열 출력

    chatter_pub.publish(msg); //chatter_pub 퍼블리셔에 msg 발행

    ros::spinOnce(); // 실행 반복...?!

    loop_rate.sleep(); // 루프 주기에 따라 잠자기에 들어간다.

    ++count;
  }


  return 0;
}

서브스크라이버 노드 생성

  • 파일 생성
    cd ~/catkin_ws/src
    vim listener.cpp
    
  • listener.cpp에 코드 내용 작성
#include "ros/ros.h"
#include "std_msgs/String.h"

/**
 * This tutorial demonstrates simple receipt of messages over the ROS system.
 */
// 메시지 콜백 함수
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
  // 받은 메시지 터미널에 출력
}

int main(int argc, char **argv)
{

  ros::init(argc, argv, "listener"); // 노드 명 초기화
  ros::NodeHandle n; // 통신을 위한 노드 핸들 선언

  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  // 서브스크라이버 sub 생성
  // 토픽 명은 chatter

  // 메시지가 수신되기를 대기
  ros::spin();

  return 0;
}

빌드 및 실행

  • 세 터미널 실행
    roscore
    
    cd ~/catkin_ws
    catkin build
    rosrun beginner_tutorials talker
    
    cd ~/catkin_ws
    catkin build
    rosrun beginner_tutorials listener
    
[ INFO] [1596938764.747689806]: hello world 348
[ INFO] [1596938764.847676088]: hello world 349
[ INFO] [1596938764.947665128]: hello world 350
[ INFO] [1596938765.047666848]: hello world 351
[ INFO] [1596938765.147679626]: hello world 352
[ INFO] [1596938765.247687048]: hello world 353
[ INFO] [1596938765.347670694]: hello world 354
[ INFO] [1596938765.447668962]: hello world 355
[ INFO] [1596938765.547665370]: hello world 356
[ INFO] [1596938765.647671929]: hello world 357
[ INFO] [1596938765.747660301]: hello world 358
[ INFO] [1596938765.847673416]: hello world 359
[ INFO] [1596938765.947716690]: hello world 360
[ INFO] [1596938766.047669841]: hello world 361
[ INFO] [1596938766.147662413]: hello world 362
[ INFO] [1596938766.247682612]: hello world 363
[ INFO] [1596938766.347711041]: hello world 364
[ INFO] [1596938766.447673138]: hello world 365
[ INFO] [1596938766.547666443]: hello world 366
[ INFO] [1596938766.647668220]: hello world 367
[ INFO] [1596938766.747673589]: hello world 368
[ INFO] [1596938766.847683292]: hello world 369

[ INFO] [1596938763.748036248]: I heard: [hello world 338]
[ INFO] [1596938763.848012166]: I heard: [hello world 339]
[ INFO] [1596938763.948053175]: I heard: [hello world 340]
[ INFO] [1596938764.047965859]: I heard: [hello world 341]
[ INFO] [1596938764.147991623]: I heard: [hello world 342]
[ INFO] [1596938764.247966580]: I heard: [hello world 343]
[ INFO] [1596938764.347989641]: I heard: [hello world 344]
[ INFO] [1596938764.448160705]: I heard: [hello world 345]
[ INFO] [1596938764.548239325]: I heard: [hello world 346]
[ INFO] [1596938764.648190572]: I heard: [hello world 347]
[ INFO] [1596938764.748104385]: I heard: [hello world 348]
[ INFO] [1596938764.848014076]: I heard: [hello world 349]
[ INFO] [1596938764.947999450]: I heard: [hello world 350]
[ INFO] [1596938765.047973004]: I heard: [hello world 351]
[ INFO] [1596938765.147984068]: I heard: [hello world 352]
[ INFO] [1596938765.248072914]: I heard: [hello world 353]
[ INFO] [1596938765.348087031]: I heard: [hello world 354]
[ INFO] [1596938765.448014236]: I heard: [hello world 355]
[ INFO] [1596938765.548036212]: I heard: [hello world 356]
[ INFO] [1596938765.648083477]: I heard: [hello world 357]
[ INFO] [1596938765.747949715]: I heard: [hello world 358]
[ INFO] [1596938765.848048490]: I heard: [hello world 359]
[ INFO] [1596938765.948121244]: I heard: [hello world 360]
[ INFO] [1596938766.047971012]: I heard: [hello world 361]
[ INFO] [1596938766.147932184]: I heard: [hello world 362]
[ INFO] [1596938766.248045944]: I heard: [hello world 363]
[ INFO] [1596938766.348182636]: I heard: [hello world 364]
[ INFO] [1596938766.448031058]: I heard: [hello world 365]
[ INFO] [1596938766.547941110]: I heard: [hello world 366]
[ INFO] [1596938766.647945751]: I heard: [hello world 367]
[ INFO] [1596938766.748001039]: I heard: [hello world 368]
[ INFO] [1596938766.848097269]: I heard: [hello world 369]

Categories:

Updated: