사용자 정의 파라미터 (C++)

평범한컴공생·2023년 1월 5일
0

[ROS2]

목록 보기
19/19
post-thumbnail

배경

사용자 정의 노드를 만들 때 때때로 시작 파일에서 설정할 수 있는 파라미터가 추가로 필요할 때가 있다.

C++ Class 에서 파라미터를 추가해보고, 이를 설정해 보자.

작업

1. 패키지 생성

워크스페이스의 src에서 패키지를 생성하자.

ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp

--dependencies 옵션을 사용하면 package.xml 파일과 CMakeLists.txt 파일에 전달한 인자를 자동으로 추가해 준다.

2. C++ 노드 작성

새롭게 생성한 패키지의 디렉터리의 src로 이동 후 cpp_parameters_node.cpp 파일을 생성하자.

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

#include <rclcpp/rclcpp.hpp>

using namespace std::chrono_literals;

class MinimalParam : public rclcpp::Node {
public:
    MinimalParam() : Node("minimal_param_node") {
        this->declare_parameter("my_parameter", "world");

        timer_ = this->create_wall_timer(1000ms, std::bind(&MinimalParam::timer_callback, this));
    }
    void timer_callback() {
        std::string my_param =
            this->get_parameter("my_parameter").get_parameter_value().get<std::string>();
        RCLCPP_INFO(this->get_logger(), "Hello, %s!", my_param.c_str());

        std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")};
        this->set_parameters(all_new_parameters);
    }
private:
    rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char **argv){
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MinimalParam>());
    rclcpp::shutdown();
    return 0;
}

2.1 코드 분석

class MinimalParam : public rclcpp::Node
{
public:
  MinimalParam()
  : Node("minimal_param_node")
  {
    this->declare_parameter("my_parameter", "world");

    timer_ = this->create_wall_timer(
      1000ms, std::bind(&MinimalParam::timer_callback, this));
  }

#include 전처리자에서 해당 패키지의 종속성을 확인할 수 있다.

생성자에서 declare_parameter() 메소드를 통해 my_paramter 파라미터를 값 world로 할당한 모습이다.

변수의 자료형은 넘겨 준 데이터에 의해 결정되며, 위와 같은 경우에는 string으로 설정된다.

다음 라인은 timer_1000ms의 주기로 timer_callback() 함수를 매번 실행하도록 설정한 모습이다.

void timer_callback()
{
  std::string my_param =
    this->get_parameter("my_parameter").get_parameter_value().get<std::string>();

  RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str());

  std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")};
  this->set_parameters(all_new_parameters);
}

timer_callback()은 생성자에서 정의한 my_parameters 변수의 값을 가져오고, 이를 my_param에 저장한다.

RCLCPP_INFO 함수는 해당 문자열을 로깅하는 함수이다.

set_parameters()함수는 std::vector에 저장된 my_parameterworld로 다시 설정해 주도록 한다.

int main(int argc, char ** argv)
{
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalParam>());
  rclcpp::shutdown();
  return 0;
}

rclcpp::spin()을 통해 MinimalParam을 실행한다.

2.2 executable 추가

CMakeLists.txt를 열고, find_package(rclcpp REQUIRED) 아래에 다음을 추가한다.

add_executable(minimal_param_node src/cpp_parameters_node.cpp)
ament_target_dependencies(minimal_param_node rclcpp)

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

3. 빌드

워크 스페이스로 이동 후, colcon 빌드를 수행하자.

colcon build --packages-select cpp_parameters

이후 설정 파일을 소싱 하자.

. install/setup.bash

이제 실행하면 된다.

ros2 run cpp_parameters minimal_param_node

매 초마다 아래의 메시지가 콘솔에 출력되는 것을 볼 수 있다.

[INFO][minimal_param_node]: Hello world!

3.1 콘솔을 이용한 파라미터 값 변경

ros2 param set 명령을 이용하여 파라미터를 변경해 보자. 먼저 ros2 param list를 통해 파라미터를 확인하자.

ros2 param list

/minimal_param_nodemy_parameterearth로 변경해 보자.

ros2 param set /minimal_param_node my_parameter earth

set_parameter()함수로 인하여 곧바로 world로 돌아오는 것을 확인할 수 있다.

3.2 launch 파일을 이용한 파라미터 값 변경

launch 파일을 통해서도 파라미터의 값을 변경할 수 있다.

워크스페이스의 src/cpp_parameters에서 launch 디렉터리를 생성한 뒤, launch 디렉터리에서 cpp_parameters_launch.py 파일을 생성하자.

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription(
        [
            Node(
                package="cpp_parameters",
                executable="minimal_param_node",
                name="custom_minimal_param_node",
                output= "screen",
                emulate_tty=True,
                parameters=[{"my_parameter": "earth"}],
            )
        ]
    )

parameters=로 파라미터의 값을 변경할 수 있다.

CMakeLists.txt에서 다음을 추가한다.

install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

워크스페이스에서 빌드를 수행한다.

colcon build --packages-select cpp_parameters
. install/setup.bash

ros2 launch를 통해 launch파일을 실행한다.

ros2 launch cpp_parameters cpp_parameters_launch.py

첫 줄을 보면 성공적으로 변경됐음을 볼 수 있다.

참고

ROS 2 Documentation: Foxy

profile
학부 연구생(220627~)

0개의 댓글