Beginner:Client libraries-8 在类中使用参数

目标:创建和运行一个具有ROS参数的类

背景

当实现自己节点的时候,可能需要从launch文件中添加参数。本教程的目的是告诉你怎样在c++类中创建这些参数,以及怎样在launch文件中设置。

任务

1、创建一个包

ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp

1.1 更新package.xml

<description>C++ parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>

2、实现C++节点

创建文件cpp_parameters_node.cpp

复制代码
#include <chrono>
#include <functional>
#include <string>

#include <rclcpp/rclcpp.hpp>

using namespace std::chrono_literals;

class MinimalParam : public rclcpp::Node
{
public:
  MinimalParam()
  : Node("minimal_param_node")
  {
  //创建了一个参数,默认值为world,参数类型根据默认值来推断,在本例子中是一个string
this->declare_parameter("my_parameter", "world");   //1HZ的定时器触发 timer_ = this->create_wall_timer( 1000ms, std::bind(&MinimalParam::timer_callback, this)); } void timer_callback() {
  //获得参数,并存储到my_param中, std::
string my_param = this->get_parameter("my_parameter").as_string(); RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str());   //将my_parameter参数重新设置为默认值world std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")}; this->set_parameters(all_new_parameters); } private: rclcpp::TimerBase::SharedPtr timer_;//定时器的声明 }; int main(int argc, char ** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<MinimalParam>()); rclcpp::shutdown(); return 0; }
复制代码

 2.1.1添加参数描述

可以为参数设置一个描述符,描述符允许指定一个参数的文本描述以及它的约束,比如让它只读,指定一个范围等等;

复制代码
// ...

class MinimalParam : public rclcpp::Node
{
public:
  MinimalParam()
  : Node("minimal_param_node")
  {
    auto param_desc = rcl_interfaces::msg::ParameterDescriptor{};
    param_desc.description = "This parameter is mine!";

    this->declare_parameter("my_parameter", "world", param_desc);

    timer_ = this->create_wall_timer(
      1000ms, std::bind(&MinimalParam::timer_callback, this));
  }
复制代码

2.2 添加可执行程序

add_executable(minimal_param_node src/cpp_parameters_node.cpp)
ament_target_dependencies(minimal_param_node rclcpp)

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

3、编译和运行

colcon build --packages-select cpp_parameters

ros2 run cpp_parameters minimal_param_node

3.1 通过终端来改变

ros2 param set /minimal_param_node my_parameter earth

3.2 通过launch文件来改变

也可以在launch文件中设置参数,但是首先你需要添加launch目录。在包目录下添加一个launch目录,再在里面创建一个新的文件叫做cpp_parameters_launch.py。

复制代码
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package="cpp_parameters",
            executable="minimal_param_node",
            name="custom_minimal_param_node",
            output="screen",
            emulate_tty=True,
            parameters=[
                {"my_parameter": "earth"}
            ]
        )
    ])
复制代码
install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

总结

您使用自定义参数创建了一个节点,该参数可以从启动文件或命令行设置。您将依赖项、可执行文件和启动文件添加到包配置文件中,以便可以构建和运行它们,并查看参数的作用

 

posted on   gary_123  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2016-06-03 无名管道通讯编程
2016-06-03 执行程序---system
2016-06-03 exit--进程退出;wait--进程等待;execl--执行程序
2016-06-03 创建一个子进程---vfork
2016-06-03 多进程程序设计
2016-06-03 进程控制理论
2016-06-03 时间编程

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示