ROS2-创建对象时,加载动态参数的方法
1.引言
ROS2中常见的参数加载方式是:通过启动文件加载。但是在集成化程度较高的系统中,不适合。我们提供通过创建对象时,加载动态参数的方法。
2.创建功能包,并实现在创建对象时动态加载参数文件
2.1 生成功能包:
ros2 pkg create ros_two_dynamic_parameter --build-type ament_cmake --dependencies rclcpp
2.2 创建配置文件my_params.yaml
my_dynamic_node:ros__parameters:my_int_param: 100my_double_param: 2.71my_string_param: "world"
2.2 创建dynamic_parameter.cpp文件
#include <rclcpp/rclcpp.hpp>class MyDynamicNode : public rclcpp::Node {
public:MyDynamicNode() : Node("my_dynamic_node") {// 声明参数并指定默认值this->declare_parameter("my_int_param", 42);this->declare_parameter("my_double_param", 3.14);this->declare_parameter("my_string_param", "hello"); }void PrintParameters(){get_parameter("my_int_param", my_int_param_);get_parameter("my_double_param", my_double_param_);get_parameter("my_string_param", my_string_param_);RCLCPP_INFO(this->get_logger(), "my_int_param: %d", my_int_param_);RCLCPP_INFO(this->get_logger(), "my_double_param: %f", my_double_param_);RCLCPP_INFO(this->get_logger(), "my_string_param: %s", my_string_param_.c_str());}
private:int my_int_param_;double my_double_param_;std::string my_string_param_;
};
int main(int argc, char **argv) {rclcpp::init(argc, argv);auto node = std::make_shared<MyDynamicNode>();auto synchronous_client = std::make_shared<rclcpp::SyncParametersClient>(node);synchronous_client->load_parameters("/home/yahboom/ros2_ws/src/ros_two_dynamic_parameter/config/my_params.yaml");node->set_parameter(rclcpp::Parameter("my_int_param", 50));node->PrintParameters();rclcpp::spin(node);rclcpp::shutdown();return 0;
}
2.3 配置 CMakeLists.txt
修改 CMakeLists.txt 文件:
add_executable(dynamic_node src/dynamic_parameter.cpp)
ament_target_dependencies(dynamic_node rclcpp)
install(TARGETS dynamic_nodeDESTINATION lib/${PROJECT_NAME})
3.编译并执行
编译
colcon build --packages-select ros_two_dynamic_parameter
执行:
ros2 run ros_two_dynamic_parameter dynamic_node