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="[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檔案或命令列進行設定。將依賴項、可執行檔案和啟動檔案新增到包配置檔案中,以便可以編譯和執行它們。
如果給您帶來幫助,希望能給點個關注,以後還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。