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: 100
my_double_param: 2.71
my_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_node
DESTINATION lib/${PROJECT_NAME})
3.编译并执行
编译
colcon build --packages-select ros_two_dynamic_parameter
执行:
ros2 run ros_two_dynamic_parameter dynamic_node


4063

被折叠的 条评论
为什么被折叠?



