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 ¶meter) const
간단히 get_parameter(파람이름, 받을 변수) 해주면 된다. return값이 bool이므로 get을 잘 했는지 체크도 가능.
+ 아래의 커맨드로 parameter를 변경 및 확인 하거나, 현재 돌고있는 파람 목록을 보거나 할 수 있다.
ros2 param get <노드이름> <파라미터 이름>
ros2 param set <노드이름> <파라미터 이름> <값>
ros2 param list
파람 쓸 때 젤 많이 쓰는 것 같은 명령어들이다. 이외에도 다른 명령어들도 있는데, 다음 포스팅에서 다룬다. 다음 포스팅에서는 예제처럼 코드에서 말고 yaml포맷으로 파라미터를 읽고 전달하는 법 + launch 파일에서 전달하는 법을 다룬다.
'로보틱스' 카테고리의 다른 글
ROS2 cpp 커스텀 메세지 및 서비스 작성 (custom msgs & srv) (0) | 2024.04.07 |
---|---|
ROS2 cpp 파라미터 선언 및 코드 내 활용(2) - yaml 파일 활용하기 (0) | 2024.03.05 |
ROS2 cpp 패키지 만들기 (0) | 2024.02.19 |
Ubuntu 20.04(우분투 20.04) ROS2(foxy)설치 (0) | 2024.02.19 |