[ROS2] --- param

简介: [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


相关文章
|
3月前
|
存储 机器人
ROS2教程 07 参数Param
本文是关于ROS2(机器人操作系统2)中参数(Parameter)机制的教程,介绍了ROS2中参数的使用和管理,包括列出、获取、设置、删除参数,以及如何通过命令行和launch文件在启动节点时配置参数,并通过示例代码展示了如何在ROS2节点中声明和使用参数。
104 0
|
1月前
|
Ubuntu 机器人 Linux
|
5天前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
|
10天前
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
【11月更文挑战第4天】ROS2的学习过程和应用,介绍DDS系统的框架和知识。
|
6月前
|
传感器 人工智能 算法
ROS机器人操作系统
ROS机器人操作系统
174 1
|
1月前
|
传感器 数据可视化 机器人
【ROS速成】半小时入门机器人ROS系统简明教程之可视化系统(三)
半小时入门机器人ROS系统简明教程之可视化系统
|
1月前
|
机器人
【ROS速成】半小时入门机器人ROS系统简明教程之安装测速(二)
半小时入门机器人ROS系统简明教程之安装测速
|
5月前
|
机器学习/深度学习 传感器 算法
强化学习(RL)在机器人领域的应用,尤其是结合ROS(Robot Operating System)和Gazebo(机器人仿真环境)
强化学习(RL)在机器人领域的应用,尤其是结合ROS(Robot Operating System)和Gazebo(机器人仿真环境)
230 2
|
5月前
|
机器人 定位技术 C++
技术笔记:ROS中测试机器人里程计信息
技术笔记:ROS中测试机器人里程计信息
|
6月前
|
NoSQL 机器人 Windows
ROS机器人编程技术控制两只小海龟的编队运动
ROS机器人编程技术控制两只小海龟的编队运动
227 1

推荐镜像

更多