1. 程式人生 > 其它 >ROS2學習之旅(18)——在類中使用引數(C++)

ROS2學習之旅(18)——在類中使用引數(C++)

ROS2配置節點引數...

在建立自己的節點時,有時需要新增可以從啟動檔案中設定的引數。

本文將向您展示如何在c++類中建立這些引數,以及如何在啟動檔案中設定它們。

1.建立功能包

在工作空間src目錄下,執行:

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

更新package.xml資訊:

<description>C++ parameter tutorial</description>
<maintainer email="[email protected]">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檔案或命令列進行設定。將依賴項、可執行檔案和啟動檔案新增到包配置檔案中,以便可以編譯和執行它們。

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