본문 바로가기
로보틱스

ROS2 cpp 파라미터 선언 및 코드 내 활용(1)

by 오리로스 2024. 2. 24.

parameter란?

  • node의 시작 시, 또는 작동 시의 값을 구성(configure)할 때 쓰인다. 코드를 바꾸지 않으면서. 
  • 파라미터의 lifetime은 노드의 lifetime에 종속된다. (당연히 파일, 코드등에 저장하고 쓰는방법은 있지만)
  • 각 파라미터는 key값과 value로 이뤄져있다. key값은 string 이고 value는 다음 아래 중 하나이다.
  • bool, int64, float64, string, byte[], bool[], int64[], float64[] or string[]
  • 전역적인 상수로써의 역할을 하고 코드로써, 커맨드로써 값을 실시간으로 바꿀수 있다.

공홈 설명(https://docs.ros.org/en/foxy/Concepts/About-ROS-2-Parameters.html)을 읽어보면 아주 자세히 나와 있다.

 

파라미터 선언 및 초기화하는 예제 C++ 코드이다. 타이머 하나로는 선언된 파라미터의 값을 읽고, 다른 타이머 하나로는 파라미터 값을 읽어 출력하는 예제이다.

 

예제 코드
#include "rclcpp/rclcpp.hpp"
//타이머2로 파라미터를 선언 & 로드하고 타이머1으로 주기적으로 출력하는 예제
class myParamNode : public rclcpp::Node
{
    public:
        myParamNode() : Node("param_node")//Node에도 생성자가 있기떄문에
        {
            RCLCPP_INFO(this->get_logger(), "param_node의 기본생성자");
            timer1_ = this->create_wall_timer(std::chrono::milliseconds(200),
                 std::bind(&myParamNode::timerCallBack,this));
            timer2_ = this->create_wall_timer(std::chrono::milliseconds(100),
                 std::bind(&myParamNode::paramCallBack,this));
            this->declare_parameter<std::string>("my_string","worldismine");
            this->declare_parameter<int>("my_integer",222);
            this->declare_parameter<bool>("my_bool",true);
        //    this->undeclare_parameter("my_param"); 를 통해 파라미터 해제도 가능
        }
        void paramCallBack(){
          this->get_parameter("my_string",param_string);
          this->get_parameter("my_integer",param_interger);
          this->get_parameter("my_bool",param_bool);
        }
        void timerCallBack(){
          RCLCPP_INFO(this->get_logger(),"안녕 콜백!");
          RCLCPP_INFO(this->get_logger(),"my_string  : %s",param_string.c_str());
          RCLCPP_INFO(this->get_logger(),"my_integer : %d",param_interger);
          RCLCPP_INFO(this->get_logger(),"my_bool    : %d",param_bool);
        }
    private:// public private은 선언의 장이라고 생각하면 편하다.
        std::string param_string;
        int param_interger;
        bool param_bool;

        rclcpp::TimerBase::SharedPtr timer1_;
        rclcpp::TimerBase::SharedPtr timer2_;

        
};

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

 

결과

 

[INFO] [1709276953.920847428] [param_node]: my_string  : worldismine
[INFO] [1709276953.920878487] [param_node]: my_integer : 222
[INFO] [1709276953.920891497] [param_node]: my_bool    : 1
[INFO] [1709276954.120669449] [param_node]: 안녕 콜백!
[INFO] [1709276954.120754195] [param_node]: my_string  : worldismine
[INFO] [1709276954.120775537] [param_node]: my_integer : 222
[INFO] [1709276954.120790307] [param_node]: my_bool    : 1
[INFO] [1709276954.320574263] [param_node]: 안녕 콜백!
[INFO] [1709276954.320687853] [param_node]: my_string  : worldismine
[INFO] [1709276954.320709386] [param_node]: my_integer : 222
[INFO] [1709276954.320726725] [param_node]: my_bool    : 1

 

설명
this->declare_parameter<std::string>("my_string","worldismine");
this->declare_parameter<int>("my_integer",222);
this->declare_parameter<bool>("my_bool",true);

 

기본적으로 각 노드는 위와 같이 declare_parameter함수를 통해 lifetime동안 사용할 파라미터를 선언할 수 있다. 

this->get_parameter("my_string",param_string);
this->get_parameter("my_integer",param_interger);
this->get_parameter("my_bool",param_bool);

 

get_parameter 함수를 통해 파라미터를 읽어올 수 있으며 함수의 argument는 아래와 같다.

bool get_parameter(const std::string &name, rclcpp::Parameter &parameter) const

 

간단히 get_parameter(파람이름, 받을 변수) 해주면 된다. return값이 bool이므로 get을 잘 했는지 체크도 가능.

 

+ 아래의 커맨드로 parameter를 변경 및 확인 하거나, 현재 돌고있는 파람 목록을 보거나 할 수 있다.

ros2 param get <노드이름> <파라미터 이름>
ros2 param set <노드이름> <파라미터 이름> <값>
ros2 param list

 

파람 쓸 때 젤 많이 쓰는 것 같은 명령어들이다. 이외에도 다른 명령어들도 있는데, 다음 포스팅에서 다룬다. 다음 포스팅에서는 예제처럼 코드에서 말고 yaml포맷으로 파라미터를 읽고 전달하는 법 + launch 파일에서 전달하는 법을 다룬다.