在創建自己的節點時,有時需要添加可以從啟動文件中設置的參數。
本文將向您展示如何在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文件或命令行進行設置。將依賴項、可執行文件和啟動文件添加到包配置文件中,以便可以編譯和運行它們。
如果給您帶來幫助,希望能給點個關注,以后還會陸續更新有關機器人的內容,點個關注不迷路~歡迎大家一起交流學習。
都看到這了,點個推薦再走吧~
未經允許,禁止轉載。