[ROS2] --- param

1 param介绍

类似C++编程中的全局变量,可以便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。

  • 全局字典

    在ROS系统中,参数是以全局字典的形态存在的,什么叫字典?就像真实的字典一样,由名称和数值组成,也叫做键和值,合成键值。或者我们也可以理解为,就像编程中的参数一样,有一个参数名 ,然后跟一个等号,后边就是参数值了,在使用的时候,访问这个参数名即可。

  • 可动态监控

    在ROS2中,参数的特性非常丰富,比如某一个节点共享了一个参数,其他节点都可以访问,如果某一个节点对参数进行了修改,其他节点也有办法立刻知道,从而获取最新的数值。这在参数的高级编程中,大家都可能会用到。

2 param编码示例

这里创建功能包名为,learning05_param

2.1 parameter.cpp

复制代码
/**
 * @file parameters.cpp
 *
 * @brief A node to declare and get parameters
 *        Here the parameters are the message data for two publisher
 *        It's possible to change them at run time using the commad line
 *        "ros2 param set /set_parameter_node vehicle_speed 100"
 *        "ros2 param set /set_parameter_node vehicle_type car"
 *        or using a launch file
 *
 * @author Antonio Mauro Galiano
 * Contact: https://www.linkedin.com/in/antoniomaurogaliano/
 *
 */

#include <chrono>
#include <string>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "std_msgs/msg/int16.hpp"

using namespace std::chrono_literals;

class MySetParameterClass: public rclcpp::Node
{
private:
  int velocityParam_;
  std::string typeVehicleParam_;
  rclcpp::TimerBase::SharedPtr timer_;
  rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pubString_;
  rclcpp::Publisher<std_msgs::msg::Int16>::SharedPtr pubInt_;
  void TimerCallback();

public:
  MySetParameterClass()
    : Node("set_parameter_node")
  {
    // here are declared the parameters and their default values
    this->declare_parameter<std::string>("vehicle_type", "bike");
    this->declare_parameter<int>("vehicle_speed", 10);
    pubString_ = this->create_publisher<std_msgs::msg::String>("/vehicle_type", 10);
    pubInt_ = this->create_publisher<std_msgs::msg::Int16>("/vehicle_speed", 10);
    timer_ = this->create_wall_timer(
      1000ms, std::bind(&MySetParameterClass::TimerCallback, this));
  }
};


void MySetParameterClass::TimerCallback()
{
  // here the params get their value from outside
  // such as a set command or a launch file
  this->get_parameter("vehicle_type", typeVehicleParam_);
  this->get_parameter("vehicle_speed", velocityParam_);
  std_msgs::msg::String messageString;
  messageString.data=typeVehicleParam_;
  std_msgs::msg::Int16 messageInt;
  messageInt.data=velocityParam_;
  RCLCPP_INFO(this->get_logger(), "Publishing two messages -> vehicle type %s\tVehicle speed %d",
    typeVehicleParam_.c_str(), velocityParam_);
  pubInt_->publish(messageInt);
  pubString_->publish(messageString);
}


int main(int argc, char** argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<MySetParameterClass>();
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

2.2 CMakeLists.txt

复制代码
cmake_minimum_required(VERSION 3.5)
project(learning05_param)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

add_executable(parameters src/parameters.cpp)
ament_target_dependencies(parameters rclcpp std_msgs)

install(TARGETS
	 parameters
   DESTINATION lib/${PROJECT_NAME}
 )

ament_package()

2.3 package.xml

复制代码
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>learning05_param</name>
  <version>0.0.0</version>
  <description>Example node to handle parameters</description>
  <maintainer email="foo@foo.foo">Antonio Mauro Galiano</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

3 编译运行

复制代码
# 编译
colcon build

# source环境变量
source install/setup.sh

# 运行parameters节点
ros2 run learning05_param parameters

可以看到

再开一个终端,

这里set了vehicle_speed值为12,可以看到运行的程序中vehicle_speed的值从10 变为了12

4 param常用指令

复制代码
查看列表参数
ros2 param list

ros2 param list

/set_parameter_node:

use_sim_time

vehicle_speed

vehicle_type

复制代码
查看描述
ros2 param describe /set_parameter_node use_sim_time

ros2 param describe /set_parameter_node use_sim_time

Parameter name: use_sim_time

Type: boolean

Constraints:

复制代码
获取参数值
ros2 param get /set_parameter_node use_sim_time
Boolean value is: False

设置参数值
ros2 param set /set_parameter_node use_sim_time true
Set parameter successful


将一个节点所有的param写在一个yaml文件中
ros2 param dump /set_parameter_node
Saving to:  ./set_parameter_node.yaml

修改上面的yaml文件,通过下面指令直接生效
ros2 param load /set_parameter_node set_parameter_node.yaml 
Set parameter use_sim_time successful
Set parameter vehicle_speed successful
Set parameter vehicle_type successful
相关推荐
Tipriest_2 天前
典型的 ROS 2 ament_cmake构建CMake脚本中ament相关指令解释
ros2·ament_cmake
Tipriest_3 天前
详细介绍colcon和ament的关系,以及它们在 ROS 2 构建系统中的角色和区别
ros2·colcon·ament
lqqjuly4 天前
Lidar调试记录Ⅰ之Ubuntu22.04虚拟机安装ROS2(无坑版)
linux·ros2·lidar·ubuntu22.04
nenchoumi31198 天前
ROS2 Humble 笔记(四)ROS 的最小工作单元-- Node 节点
笔记·机器人·ros2
nenchoumi31198 天前
ROS2 Humble 笔记(八)动作 action
笔记·机器人·ros2
nenchoumi31198 天前
ROS2 Humble 笔记(十二)launch 文件与 namespace 启动多个节点
笔记·机器人·ros2
nenchoumi31198 天前
ROS2 Humble 笔记(十)多机分布式通讯 DDS 与宿主机和Docker容器
笔记·机器人·ros2
叠叠乐8 天前
Navigation2 行为树架构源码级分析与设计原理
ros2
nenchoumi31199 天前
ROS2 Humble 笔记(七)标准与自定义 Interface 接口
笔记·机器人·ros2
不懂音乐的欣赏者10 天前
Windows 下 ROS/ROS2 开发环境最优解:WSL 比直接安装、虚拟机、双系统更优雅!
linux·windows·ubuntu·ros·wsl·ros2·双系统