본문 바로가기
기술자료/ROS2

토픽 초간단 소스 및 컴파일 topic ultra simple source and compile ROS2 WSL2

by 와이즈캣 2024. 12. 13.
728x90
반응형

리넉 깔고 하려니 요즘 WSL2가 잘 나와서  WSL2 기반으로  ROS2 관련 공부를 시작 함.
너무 편한네. vscode도 아주 잘되고.

WSL2 Ubuntu 20.06.6 LTS base

사이트들이 쓸데 없이 복잡하게 설명하고 있어 초기 진입벽이 거지 같음.
일단 기본 소스 내용 가져다가 가장 시작하기 쉬운 방식으로 작성 해 봄.
cmake랑 colcon은 실력이 어느정도 나아져야 사용할 듯.

ros2 C++을 어느정도 다루려면
기본적으로 C++도 잘 알아야하고
mqtt 같은 구조,
빌드툴 이해,
리넉 경로 개념 등 기반 지식을 골고루 많이 알아야됨
(쉽게 만들었는데 어렵게 만들었음 ???)

아래는  oz_pub.cpp

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

#include "rclcpp/rclcpp.hpp" 		// rclcpp::Node 클래스 상속
#include "std_msgs/msg/string.hpp"	// std_msgs type String 사용

using namespace std::chrono_literals;

class HelloKittyPub : public rclcpp::Node
{
	private: // 변수
		rclcpp::TimerBase::SharedPtr _timer;
		rclcpp::Publisher<std_msgs::msg::String>::SharedPtr _hellokitty_publisher;
		size_t _count;

	public:
		// 노드 이름 : HelloKitty_publisher
		HelloKittyPub()
		: Node("HelloKitty_publisher"), _count(0)
		{
			std::cout << "[oz][생성자]HelloKittyPub\n";

			//  QoS 설정을 위해 KeepLast 형태로 depth를 10으로 설정하여 퍼블리시할 데이터를 버퍼에 10개까지 저장
			auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));

			// 발행 설정(메시지 타입:String, 토픽 이름:helloworld, QoS 설정:qos_profile)
			_hellokitty_publisher = this->create_publisher<std_msgs::msg::String>("HelloKitty", qos_profile);

			// 타이머 콜백 설정(주기:1초, 대상 함수:callback_HelloKitty_msg)
			_timer = this->create_wall_timer(1s, std::bind(&HelloKittyPub::callback_HelloKitty_msg, this));
		}

	private:
		// 콜백 함수
		void callback_HelloKitty_msg()
		{
			auto msg = std_msgs::msg::String();

			msg.data = "지옥으로 키티 : " + std::to_string(++_count);

			// logging, RCLCPP_XXX 계열의 함수는 print와 비슷
			RCLCPP_INFO(this->get_logger(), "발행 : '%s'", msg.data.c_str());

			_hellokitty_publisher->publish(msg); 	// 실제 발행
		}
};

int main(int argc, char * argv[])
{
	rclcpp::init(argc, argv);	// rclcpp와 관련된 부분이 있다면 반드시 먼저 수행

	auto node = std::make_shared<HelloKittyPub>();

	rclcpp::spin(node);			// 콜백 함수 실행
	rclcpp::shutdown(); 		// 종료 더블 체크

	return 0;
}



 

아래는  oz_sub.cpp

#include <memory>
#include <functional>

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

using std::placeholders::_1;

class HelloKittySub : public rclcpp::Node
{
	private:
		rclcpp::Subscription<std_msgs::msg::String>::SharedPtr _hellokitty_subscriber;

	public:
		// 노드 이름 : HelloKitty_subscriber
		HelloKittySub()
			: Node("HelloKitty_subscriber")
		{
			// QoS depth 10으로 하여 버퍼에 10개 저장
			auto qos_profile = rclcpp::QoS(rclcpp::KeepLast(10));

			// 구독 설정(메시지 타입:String, 토픽 이름:HelloKitty, QoS 설정:qos_profile, 구독 메시지 콜백 함수:callback_HelloKitty_msg)
			_hellokitty_subscriber = this->create_subscription<std_msgs::msg::String>(
					"HelloKitty",
					qos_profile,
					std::bind(&HelloKittySub::callback_HelloKitty_msg, this, _1));
		}

	private:
		// 콜백함수
		void callback_HelloKitty_msg(const std_msgs::msg::String::SharedPtr msg) const
		{
			// logging
			RCLCPP_INFO(this->get_logger(), "구독 : '%s'", msg->data.c_str());
		}
};


int main(int argc, char * argv[])
{
	rclcpp::init(argc, argv);	// rclcpp와 관련된 부분이 있다면 반드시 먼저 수행

	auto node = std::make_shared<HelloKittySub>();

	rclcpp::spin(node);			// 콜백 함수 실행
	rclcpp::shutdown(); 		// 종료 더블 체크

	return 0;
}

 

아래는 oz_sub.cpp  컴파일 방법(oz_pub.cpp의 경우 첫 줄만 수정해서 사용

g++ -o oz_sub oz_sub.cpp \
-I/opt/ros/foxy/include \
-L/opt/ros/foxy/lib -Wl,-rpath,/opt/ros/foxy/lib \
-lrclcpp \
-llibstatistics_collector \
-llibstatistics_collector_test_msgs__rosidl_typesupport_introspection_c \
-llibstatistics_collector_test_msgs__rosidl_generator_c \
-llibstatistics_collector_test_msgs__rosidl_typesupport_c \
-llibstatistics_collector_test_msgs__rosidl_typesupport_introspection_cpp \
-llibstatistics_collector_test_msgs__rosidl_typesupport_cpp \
-lstd_msgs__rosidl_typesupport_introspection_c \
-lstd_msgs__rosidl_generator_c \
-lstd_msgs__rosidl_typesupport_c \
-lstd_msgs__rosidl_typesupport_introspection_cpp \
-lstd_msgs__rosidl_typesupport_cpp \
-lrcl \
-lrcl_interfaces__rosidl_typesupport_introspection_c \
-lrcl_interfaces__rosidl_generator_c \
-lrcl_interfaces__rosidl_typesupport_c \
-lrcl_interfaces__rosidl_typesupport_introspection_cpp \
-lrcl_interfaces__rosidl_typesupport_cpp \
-lrmw_implementation \
-lrmw \
-lrcl_logging_spdlog \
-lspdlog \
-lpthread \
-lrcl_yaml_param_parser \
-lyaml \
-lrosgraph_msgs__rosidl_typesupport_introspection_c \
-lrosgraph_msgs__rosidl_generator_c \
-lrosgraph_msgs__rosidl_typesupport_c \
-lrosgraph_msgs__rosidl_typesupport_introspection_cpp \
-lrosgraph_msgs__rosidl_typesupport_cpp \
-lstatistics_msgs__rosidl_typesupport_introspection_c \
-lstatistics_msgs__rosidl_generator_c \
-lstatistics_msgs__rosidl_typesupport_c \
-lstatistics_msgs__rosidl_typesupport_introspection_cpp \
-lstatistics_msgs__rosidl_typesupport_cpp \
-lbuiltin_interfaces__rosidl_typesupport_introspection_c \
-lbuiltin_interfaces__rosidl_generator_c \
-lbuiltin_interfaces__rosidl_typesupport_c \
-lbuiltin_interfaces__rosidl_typesupport_introspection_cpp \
-lbuiltin_interfaces__rosidl_typesupport_cpp \
-lrosidl_typesupport_introspection_cpp \
-lrosidl_typesupport_introspection_c \
-lrosidl_typesupport_cpp \
-lrosidl_typesupport_c \
-lrcpputils \
-lrosidl_runtime_c \
-lrcutils \
-ldl \
-ltracetools

 

아래는 실행 결과

소스 및 컴파일 복사해서 쓸 수 있게 스크립트도 포함 시켜둠

저 처럼 ros2에 애 먹고 계시는 초보자님들에게 보탬이 되길 바람

oz.7z
0.00MB

 

 

728x90