왕다방

인공지능 & 로봇 사용자들의 자유게시판입니다. 인공지능, 가정용로봇, 서비스로봇, 인공지능스피커 등 자유롭게 올려주세요. 질문과답변도 이곳에 올려주세요.

제목ROS2: C++로 publisher와 subscriber 만들기2021-12-15 04:06
작성자user icon Level 4

88x31.png


이번 글에서는 C++을 통해 발행자(publisher)구독자(subscriber)를 만들어보겠습니다.


터미널을 열고 오버레이 작업공간 src 폴더로 이동하세요.

  $ cd ~/dev_ws/src


C++ 패키지를 만들겠습니다. 빌드타입은 ament_cmake, 의존성 패키지는 rclcpp와 std_msgs를 포함합니다. 

패키지 이름은 pubsub_cpp로 하겠습니다.

  $ ros2 pkg create pubsub_cpp --build-type ament_cmake --dependencies rclcpp std_msgs


package.xml 파일을 열어서 versiondescriptionmaintainerlicense를 수정하고 저장합니다.

mb-file.php?path=2021%2F12%2F15%2FF4388_1.png
 

C 언어 빌드 설정은 필요없으므로 제거해주고 pub와 sub 노드의 빌드와 설치 설정을 추가합니다.

mb-file.php?path=2021%2F12%2F15%2FF4389_2.png
mb-file.php?path=2021%2F12%2F15%2FF4390_3.png
 

노드를 작성을 위해 ~/dev_ws/src/pubsub_cpp/src 폴더에 pub.cpp와 sub.cpp를 생성합니다.

  $ touch ~/dev_ws/src/pubsub_cpp/src/{pub.cpp,sub.cpp}


pub 노드를 작성하겠습니다.

mb-file.php?path=2021%2F12%2F15%2FF4394_4.png
 


파이썬 패키지와 같습니다. Node 클래스를 상속하는 Pub 클래스를 만들어서 main 함수에서 실행시켜주면 됩니다.


우선 rclcpp.hppstring.hpp 헤더파일을 include하고 네임스페이스로 chrono_literals를 사용합니다.

#include <chrono>
#include <functional>
#include <memory>
#include <string>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;


발행자 노드 클래스를 작성합니다. 클래스 이름은 Pub 이고 Node 클래스를 상속합니다.

class Pub : public rclcpp::Node
{
}


Pub 클래스 생성자를 작성합니다. 부모 클래스인 Node 클래스는 노드 이름을 매개변수로 초기화하고, count를 0으로 초기화합니다. create_publisher 함수를 통해 발행자를 생성하고 create_wall_timer를 통해 타이머를 생성합니다.

public:
Pub() : Node("pub"), count(0)
{
auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));
publisher_ = this->create_publisher<std_msgs::msg::String>(
"topic", qos_profile);
timer = this->create_wall_timer(
500ms, std::bind(&Pub::timer_callback, this));
}


timer_callback 함수는 private로 만들어줍시다.

private:
void timer_callback()
{
auto msg = std_msgs::msg::String();
msg.data = "Hello World: " + std::to_string(count++);
RCLCPP_INFO(
this->get_logger(),
"Publishing: '%s'",
msg.data.c_str());
publisher_->publish(msg);
}
rclcpp::TimerBase::SharedPtr timer;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count;


메인함수를 작성합니다.

int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<Pub>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}



동일하게 아래 스크린샷과 같이 sub 노드를 작성하세요.

mb-file.php?path=2021%2F12%2F15%2FF4395_5.png
 

이제 colcon으로 패키지를 빌드해주세요. 

  $ cd ~/dev_ws && colcon build --symlink-install --packages-select pubsub_cpp


오버레이 작업공간을 환경설정합니다.

  $ . ~/dev_ws/install/setup.bash


다음 명령어를 통해 sub 노드를 실행해봅시다.

  $ ros2 run pubsub_cpp sub


새로운 터미널을 열고 다시 오버레이 작업공간을 환경설정하고 pub 노드를 싱행해봅시다.

  $ . ~/dev_ws/install/setup.bash

  $ ros2 run pubsub_cpp pub


mb-file.php?path=2021%2F12%2F15%2FF4396_6.gif
 

구독자는 지난번에 만든 pubsub_py 패키지의 sub 노드를 실행시키고 발행자는 pubsub_cpp 패키지의 pub 노드를 실행해보세요!

  $ . ~/dev_ws/install/setup.bash

  $ ros2 run pubsub_py sub

  $ . ~/dev_ws/install/setup.bash

  $ ros2 run pubsub_cpp pub

mb-file.php?path=2021%2F12%2F15%2FF4397_7.gif
 

#ROS2# 노드# 패키지# publisher# subscriber# topic# C++
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)