ROS 2边学边练(18)-- 在类(C++)中使用参数

前言

        在前期的一些章节里我们体验过设置参数、查看参数、保存参数,我们可能在启动节点时希望能在launch文件中增加设置一些参数,这些就是今天所要学习的。

动动手

创建一个功能包

        打开一个终端,先激活下ROS 2的安装环境变量(source /opt/ros/iron/setup.bash)使其能使用ROS 命令,然后进入工作空间的src路径(ros2_ws/src),按下面命令创建一个功能包cpp_parameters:

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_parameters --dependencies rclcpp

--dependencies rclcpp代表自动添加rclcpp这个依赖项到package.xml和CMakeLists.txt文件中去。

别忘了更新下package.xml里面的一些信息,如下:

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

编写节点代码

        在功能包下的src路径下,创建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")
  {
    //minimal_param_node节点构造函数内声明一名为my_parameter的参数,初值为“world”
    this->declare_parameter("my_parameter", "world");

    //创建一个周期为1s的定时器,并绑定回调函数timer_callback,到达时间即执行该回调函数
    timer_ = this->create_wall_timer(
      1000ms, std::bind(&MinimalParam::timer_callback, this));
  }

  //回调函数的定义
  void timer_callback()
  {
    //获取参数my_parameter的值(string类型)赋给变量my_param
    std::string my_param = this->get_parameter("my_parameter").as_string();

    //打印变量my_param
    RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str());

    //创建了一个名为all_new_parameters的std::vector模板类,其中包含一个rclcpp::Parameter对象,该对象的名称为"my_parameter",值为"world"
    std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")};
    //将向量all_new_parameters作为参数传给set_parameters函数
    this->set_parameters(all_new_parameters);
  }

private:
  rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char ** argv)
{
  //初始化ROS 2
  rclcpp::init(argc, argv);
  //开始实例化MinimalParam并开始循环处理逻辑
  rclcpp::spin(std::make_shared<MinimalParam>());
  rclcpp::shutdown();
  return 0;
}
增加参数描述符(可选项)

        如果你想对某个参数进行补充说明(比如功能说明、取值范围说明、读写属性说明等),我们可以通过rcl_interfaces::msg::ParameterDescriptor{}来创建一个参数描述符对象,并在其成员变量description(string类型)中将说明内容填充进去即可,我们可以采用下面的代码使得参数能有个说明(可以替换掉原先的构造函数内容,我们的代码可以换掉试试):

// ...

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));
  }

当我们启动节点后,我们可以通过:

ros2 param describe /minimal_param_node my_parameter

看看参数my_parameter的说明内容。

修改CMakeLists.txt

        在find_package(rclcpp REQUIRED)语句下面增加如下内容:

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}
)

构建运行

        构建之前我们最好先检查下依赖项有没有缺失:

$rosdep install -i --from-path src --rosdistro iron -y

正常后我们回到工作空间根路径(ros2_ws)进行构建:

$colcon build --packages-select cpp_parameters

完成后我们来启动运行下cpp_parameters节点:

$ros2 run cpp_parameters minimal_param_node

不出意外的话,节点终端会每秒返回一条下面的信息(设置的默认参数值):

[INFO] [minimal_param_node]: Hello world!

但是这种被安排好的日子是不是没啥意思,我们要自己主动设置参数值!别说还真有两个途径可以让我们玩玩。

通过控制台修改参数

        这个我们之前同样体验过啦,今天再温故一下,不坏。首先得确保节点是处于活动状态,其次我们利用下面的命令查看下这个节点支持哪些参数:

$ros2 param list

看到有我们关心的my_parameter这个参数后,ok,我们将它的值由“world”改为“earth”:

$ros2 param set /minimal_param_node my_parameter earth

当这条命令成功执行之后,它会提示Set parameter successful,我们再看看运行节点的那个终端打印的内容(大家来找茬):

通过launch文件修改参数

        默认情况,这个launch文件是不存在的,我们需要手动创建,通过下面命令新建(ros2_ws根路径下):

$mkdir src/cpp_parameters/launch
$gedit src/cpp_parameters/launch/cpp_parameters_launch.py

将下面内容复制到paunch文件中:

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"}
            ]
        )
    ])

output="screen" emulate_tty=True这两句是将信息输出到终端控制台。

我们还需添加launch安装选项到CMakeLists.txt中,增加下面内容:

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

再来构建包:

$colcon build --packages-select cpp_parameters

打开另外一个终端,进入ros2_ws根路径,激活下环境变量:

$source install/setup.bash

再启动节点试试(通过launch文件):

$ros2 launch cpp_parameters cpp_parameters_launch.py

效果如下:

各种命令及流程还是要及时温故知新啊,否则很容易就忘了。

本篇完。

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值