Programming

ROS2 인터페이스 python cmake 방식 동시 사용하기

신농해태 2021. 9. 4. 07:23
반응형

ROS2에서 패키지를 만들때  C++언어로 코딩하거나 Python언어로 코딩합니다. 그러나 동시에 2가지 언어로 코딩할수 있으면 매우 편해지는 경우는 많습니다.

ROS2에서는 다행스럽게도 ament_cmake_python를 사용하면 CMake package와 Python package를 동시에 사용할수 있습니다. 

 

 

1. 패키지 만들기

dev_ws/src 디렉토리

ros2 pkg create --build-type ament_cmake more_interfaces 패키지를 만들고 

mkdir more_interfaces/msg 디렉토리를 만듭니다. 

 

 

2. msg 파일 만들기

more_interfaces/msg 디렉토리에 파일면 AddressBook.msg 으로 텍스트 형식 파일을 생성후,

코드를 아래처럼 입력하여 저장합니다. 

bool FEMALE=true

bool MALE=false

string first_name

string last_name

bool gender

uint8 age

string address

 

package.xml을 편집기로 열어서, 아래의 코드를 추가합니다. 

<buildtool_depend>rosidl_default_generators</buildtool_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group>

 

CMakeLists.txt을 편집기로 열어서, 아래 코드를 추가합니다.  

find_package(rosidl_default_generators REQUIRED)

set(msg_files

     "msg/AddressBook.msg"

)

rosidl_generate_interfaces(${PROJECT_NAME}

     ${msg_files}

)

ament_export_dependencies(rosidl_default_runtime)

 

 

3. 같은 패키지에서 인터페이스 사용하기

more_interfaces/src로 이동하여 파일명 publish_address_book.cpp으로 텍스트형 파일을 생성하여 아래의 코드를 입력합니다. 

#include <chrono>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "more_interfaces/msg/address_book.hpp"

using namespace std::chrono_literals;

class AddressBookPublisher : public rclcpp::Node
{
public:
  AddressBookPublisher()
  : Node("address_book_publisher")
  {
    address_book_publisher_ =
      this->create_publisher<more_interfaces::msg::AddressBook>("address_book", 10);

    auto publish_msg = [this]() -> void {
        auto message = more_interfaces::msg::AddressBook();

        message.first_name = "John";
        message.last_name = "Doe";
        message.age = 30;
        message.gender = message.MALE;
        message.address = "unknown";

        std::cout << "Publishing Contact\nFirst:" << message.first_name <<
          "  Last:" << message.last_name << std::endl;

        this->address_book_publisher_->publish(message);
      };
    timer_ = this->create_wall_timer(1s, publish_msg);
  }

private:
  rclcpp::Publisher<more_interfaces::msg::AddressBook>::SharedPtr address_book_publisher_;
  rclcpp::TimerBase::SharedPtr timer_;
};


int main(int argc, char * argv[])
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<AddressBookPublisher>());
  rclcpp::shutdown();

  return 0;
}

 

1) publisher 만들기

CMakeLists.txt 파일을 열어서 아래의 코드를 추가합니다.

 

find_package(rclcpp REQUIRED)

add_executable(publish_address_book
  src/publish_address_book.cpp
)

ament_target_dependencies(publish_address_book
  "rclcpp"
)

install(TARGETS publish_address_book
 DESTINATION lib/${PROJECT_NAME})

 

2) 인터페이스에 링크하기

CMakeLists.txt 에 아래의 코드를 추가합니다.

rosidl_target_interfaces(publish_address_book ${PROJECT_NAME} "rosidl_typesupport_cpp")

 

 

4. 실행하기 

터미널을 실행합니다. 

cd ~/dev_ws   입력엔터 
colcon build --packages-up-to more_interfaces   입력엔터 

 

터미널을 새롭게 실행한 후 

cd ~/dev_ws   입력엔터 

. install/local_setup.bash

ros2 run more_interfaces publish_address_book

 

터미널을 새롭게 실행한 후 

cd ~/dev_ws   입력엔터 

. install/local_setup.bash

ros2 topic echo /address_book

728x90
LIST