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文件或命令行進行設置。將依賴項、可執行文件和啟動文件添加到包配置文件中,以便可以編譯和運行它們。

如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM