ROS2学习之旅(18)——在类中使用参数(C++)

在创建自己的节点时,有时需要添加可以从启动文件中设置的参数。

本文将向您展示如何在c++类中创建这些参数,以及如何在启动文件中设置它们。

1.创建功能包

在工作空间src目录下,运行:

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

更新package.xml信息:

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

2.编写C++节点

dev_ws/src/cpp_parameters/src目录中,创建一个名为cpp_parameters_node.cpp的新文件,并将以下代码粘贴到其中:

#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <string>
#include <functional>

using namespace std::chrono_literals;

class ParametersClass: public rclcpp::Node
{
  public:
    ParametersClass()
      : Node("parameter_node")
    {
      this->declare_parameter<std::string>("my_parameter", "world");
      timer_ = this->create_wall_timer(
      1000ms, std::bind(&ParametersClass::respond, this));
    }
    void respond()
    {
      this->get_parameter("my_parameter", parameter_string_);
      RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
    }
  private:
    std::string parameter_string_;
    rclcpp::TimerBase::SharedPtr timer_;
};

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

2.1代码解释

顶部的#include语句是包依赖项。

下一段代码创建类和构造函数。在构造函数的第一行创建参数,参数名为my_parameter,并被赋值为默认值world。接下来,初始化timer_,这将导致每秒钟执行一次respond函数。

class ParametersClass: public rclcpp::Node
{
  public:
    ParametersClass()
      : Node("parameter_node")
    {
      this->declare_parameter<std::string>("my_parameter", "world");
      timer_ = this->create_wall_timer(
      1000ms, std::bind(&ParametersClass::respond, this));
    }

respond函数的第一行从节点获取参数my_parameter,并将其存储在parameter_string_中,RCLCPP_INFO函数确保该消息被记录。

void respond()
{
  this->get_parameter("my_parameter", parameter_string_);
  RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
}

最后是timer_parameter_string_的声明:

private:
  std::string parameter_string_;
  rclcpp::TimerBase::SharedPtr timer_;

ParametersClass后面是main函数。这里初始化了ROS 2, rclcpp::spin开始处理来自该节点的数据。

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

2.2添加可执行文件

打开 CMakeLists.txt ,在 find_package(rclcpp REQUIRED) 下面添加:

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

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

3.编译和运行

工作空间根目录下,运行:

colcon build --packages-select cpp_parameters

source:

. install/setup.bash

运行:

ros2 run cpp_parameters parameter_node

终端每秒返回消息:

[INFO] [parameter_node]: Hello world

可以看到参数的默认值,但是希望能够自己设置它,有两种方法可以实现这一点。

3.1通过consle控制台改变

确保节点正在运行:

ros2 run cpp_parameters parameter_node

打开另一终端,再次source环境,运行以下命令:

ros2 param list

终端返回,自定义参数:my_parameter,可以在终端通过简单的命令行改变:

ros2 param set /parameter_node my_parameter earth

此时,终端输出Set parameter successful表示设置参数成功。此时,运行parameter_node节点的终端输出:

[INFO] [parameter_node]: Hello earth

3.2通过launch文件改变

可以在启动文件中设置参数,但需要添加launch文件夹。在dev_ws/src/cpp_parameters/目录中,创建一个名为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="parameter_node",
            name="custom_parameter_node",
            output="screen",
            emulate_tty=True,
            parameters=[
                {"my_parameter": "earth"}
            ]
        )
    ])

当启动节点parameter_node时,将my_parameter设置为earth,并·通过添加下面的两行代码,确保在控制台中打印输出:

output="screen",
emulate_tty=True,

打开CMakeLists.txt文件,添加:

install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)

在工作空间根目录下,编译包:

colcon build --packages-select cpp_parameters

source:

. install/setup.bash

启动launch文件:

ros2 launch cpp_parameters cpp_parameters_launch.py

此时终端每秒返回信息:

[parameter_node-1] [INFO] [custom_parameter_node]: Hello earth

4.总结

本文创建了一个带有自定义参数的节点,该参数可以从launch文件或命令行进行设置。将依赖项、可执行文件和启动文件添加到包配置文件中,以便可以编译和运行它们。

如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。

上一篇:三大通信协议(2)IIC


下一篇:verilog中参数传递与参数定义中#的作用