在类 (c ++) 中使用参数 [待校准@9209]

Goal目标: using使用c Create创建并运行具有ROS参数的类。 [待校准@9210]

教程级别: 初学者 [Alyssa@7088]

Time时间: 20 20分钟 [待校准@7181]

背景

当你制作自己的 nodes 时,你有时需要添加可以从launch文件中设置的参数。 [待校准@9211]

本教程将向您展示如何在cclass类中创建这些参数,以及如何在launch文件中设置它们。 [待校准@9212]

先决条件

在之前的教程中,您学习了如何在ROS 2系统中使用 create a workspace and create a package. You have also learned about parameters 及其功能。 [待校准@9213]

任务

1创建包

打开一个新的终端和 source your ROS 2 installation ,这样 ros2 命令就可以工作了。 [待校准@9214]

导航到 dev_ws 目录创建 previous tutorial[待校准@9215]

重新调用应该在 src 目录中创建的包,而不是工作区的根目录。导航到 dev_ws/src 并创建一个新的包: [待校准@9216]

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

您的终端将返回一条消息,验证您的包 cpp_parameters 及其所有必要的文件和文件夹的创建。 [待校准@9217]

[需手动修复的语法] --dependencies 参数将自动调用y向 package.xmlCMakeLists.txt 添加必要的依赖线。 [待校准@9218]

1.1更新 package.xml [待校准@8003]

因为您在包创建过程中使用了 --dependencies 选项,所以您不必手动向 package.xmlCMakeLists.txt 添加依赖项。 [待校准@9219]

但是,与往常一样,请确保将描述、维护人员电子邮件和姓名以及许可信息添加到 package.xml[待校准@9220]

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

2编写cnode节点 [待校准@8005]

dev_ws/src/cpp_parameters/src 目录内,创建一个调用 cpp_parameters_node.cpp 的新文件,并将以下代码粘贴到: [待校准@9221]

#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检查代码 [待校准@8007]

顶部的 “# include” 语句是包依赖项。 [待校准@9222]

下一段代码创建类和构造函数。此构造函数的第一行创建我们的参数。我们的参数名为 my_parameter ,并被指定为默认值 world 。接下来, timer_ 初始化,这导致 respond 函数每秒执行一次。 [待校准@9223]

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 函数确保消息被记录。 [待校准@9224]

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

最后是 timer_parameter_string_ 的声明 [待校准@9225]

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

追踪我们的 ParametersClass 是我们的 main 。这里ROS 2被初始化,“rclcpp:: spin” 开始处理来自节点的数据。 [待校准@9226]

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

2.2添加可执行文件 [待校准@8031]

现在打开 CMakeLists.txt 文件。在 find_package(rclcpp REQUIRED) 依赖项下添加以下代码行。 [待校准@9227]

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

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

3构建和运行 [待校准@8033]

在构建之前,最好在工作区 ( dev_ws ) 的根目录下运行 rosdep ,以检查是否缺少依赖项: [待校准@9228]

rosdep install -i --from-path src --rosdistro foxy -y

导航回工作区的根目录, dev_ws ,并构建新的包: [待校准@9230]

colcon build --packages-select cpp_parameters

打开一个新的终端,导航到 dev_ws ,源文件安装文件: [待校准@9231]

. install/setup.bash

现在运行节点: [待校准@7899]

ros2 run cpp_parameters parameter_node

终端应每秒返回以下消息: [待校准@9232]

[INFO] [parameter_node]: Hello world

现在您可以看到参数的默认值,但是您希望能够自己设置它。有两种方法可以实现这一点。 [待校准@9233]

3.1通过控制台进行更改 [待校准@9234]

这部分将使用你从 tutorial about parameters 中获得的知识,并将其应用到你刚刚创建的节点上。 [待校准@9235]

确保节点正在运行: [待校准@9236]

ros2 run cpp_parameters parameter_node

打开另一个终端,再次从 dev_ws 内部源文件,然后输入以下行: [待校准@9237]

ros2 param list

在那里你会看到自定义参数 my_parameter 。要更改它,只需在控制台中运行以下行: [待校准@9238]

ros2 param set /parameter_node my_parameter earth

你知道如果你得到输出 Set parameter successful ,一切都很顺利。如果您查看另一个终端,您应该会看到输出更改为 “[信息] [参数节点]: 你好地球” [待校准@9239]

3.2通过launch文件进行更改 [待校准@9240]

您也可以在launch文件中设置参数,但是首先您需要添加launch目录。在 dev_ws/src/cpp_parameters/ 目录内,创建一个调用 launch 的新目录。在那里,创建一个调用ed cpp_parameters_launch.py 的新文件 [待校准@9241]

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 launch时,我们将 my_parameter 设置为 earth 。通过添加下面的两行,我们确保我们的输出打印在我们的控制台中。 [待校准@9242]

output="screen",
emulate_tty=True,

现在打开 CMakeLists.txt 文件。在您之前添加的行下方,添加以下代码行。 [待校准@9243]

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

打开控制台,导航到工作区的根目录, dev_ws ,然后构建新包: [待校准@9244]

colcon build --packages-select cpp_parameters

然后在新终端中源文件安装文件: [待校准@9245]

. install/setup.bash

现在使用我们刚刚创建的launch文件运行该节点: [待校准@9246]

ros2 launch cpp_parameters cpp_parameters_launch.py

终端应每秒返回以下消息: [待校准@9232]

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

总结

您创建了一个带有自定义参数的节点,可以从launch文件或命令行进行设置。您将依赖项、可执行文件和launch文件添加到包配置文件中,以便构建和运行它们,并在动作中查看参数。 [待校准@9247]

下一步

既然你有了自己的包和ROS 2系统, next tutorial 将向你展示如何检查你的环境和系统中的问题,以防你有问题。 [待校准@9248]