为什么加“通信方式”引号,因为我觉得他就不算通信,最多最多就是一个动态加载参数方式
所以ros通信方式就三种,topic service action 别犟,犟就是你对!
常用的 param参数方法如下:
# declare_parameter 声明和初始化一个参数
# describe_parameter(name) 通过参数名字获取参数的描述
# get_parameter 通过参数名字获取一个参数
# set_parameter 设置参数的值
1、代码创建
paramter_test.cpp
#include <chrono>
#include "rclcpp/rclcpp.hpp"
class ParametersNode : public rclcpp::Node
{
public:
// 构造函数,有一个参数为节点名称
explicit ParametersNode(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(), "node start:%s.", name.c_str());
this->declare_parameter("rcl_log_level", 0); /*声明参数*/
this->get_parameter("rcl_log_level", log_level); /*获取参数*/
/*设置日志级别*/
this->get_logger().set_level((rclcpp::Logger::Level)log_level);
using namespace std::literals::chrono_literals;
timer_ = this->create_wall_timer(500ms, std::bind(&ParametersNode::timer_callback, this));
}
private:
int log_level;
rclcpp::TimerBase::SharedPtr timer_;
void timer_callback()
{
this->get_parameter("rcl_log_level", log_level); /*获取参数*/
/*设置日志级别*/
this->get_logger().set_level((rclcpp::Logger::Level)log_level);
std::cout << "*****************" << std::endl;
RCLCPP_DEBUG(this->get_logger(), "DEBUG LOG!");
RCLCPP_INFO(this->get_logger(), "INFO LOG!");
RCLCPP_WARN(this->get_logger(), "WARN LOG!");
RCLCPP_ERROR(this->get_logger(), "ERROR LOG!");
RCLCPP_FATAL(this->get_logger(), "FATAL LOG!");
}
};
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
/*创建对应节点的共享指针对象*/
auto node = std::make_shared<ParametersNode>("parameter_node");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
2、测试
正常启动:
ros2 run param_moudle paramter_node
启动前更新参数:
ros2 run param_moudle paramter_node --ros-args -p rcl_log_level:=10
运行中更改参数:
ros2 param set /parameter_node rcl_log_level 50