사용자 정의 노드를 만들 때 때때로 시작 파일에서 설정할 수 있는 파라미터가 추가로 필요할 때가 있다.
C++ Class
에서 파라미터를 추가해보고, 이를 설정해 보자.
워크스페이스의 src
에서 패키지를 생성하자.
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
--dependencies
옵션을 사용하면 package.xml
파일과 CMakeLists.txt
파일에 전달한 인자를 자동으로 추가해 준다.
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;
}
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_parameter
를 world
로 다시 설정해 주도록 한다.
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MinimalParam>());
rclcpp::shutdown();
return 0;
}
rclcpp::spin()
을 통해 MinimalParam
을 실행한다.
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}
)
워크 스페이스로 이동 후, colcon
빌드를 수행하자.
colcon build --packages-select cpp_parameters
이후 설정 파일을 소싱 하자.
. install/setup.bash
이제 실행하면 된다.
ros2 run cpp_parameters minimal_param_node
매 초마다 아래의 메시지가 콘솔에 출력되는 것을 볼 수 있다.
[INFO][minimal_param_node]: Hello world!
ros2 param set
명령을 이용하여 파라미터를 변경해 보자. 먼저 ros2 param list
를 통해 파라미터를 확인하자.
ros2 param list
/minimal_param_node
의 my_parameter
를 earth
로 변경해 보자.
ros2 param set /minimal_param_node my_parameter earth
set_parameter()
함수로 인하여 곧바로 world
로 돌아오는 것을 확인할 수 있다.
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
첫 줄을 보면 성공적으로 변경됐음을 볼 수 있다.