在创建自己的节点时,有时需要添加可以从启动文件中设置的参数。
本文将向您展示如何在c++类中创建这些参数,以及如何在启动文件中设置它们。
在工作空间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>
在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; }
顶部的#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; }
打开 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} )
工作空间根目录下,运行:
colcon build --packages-select cpp_parameters
source:
. install/setup.bash
运行:
ros2 run cpp_parameters parameter_node
终端每秒返回消息:
[INFO] [parameter_node]: Hello world
可以看到参数的默认值,但是希望能够自己设置它,有两种方法可以实现这一点。
确保节点正在运行:
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
可以在启动文件中设置参数,但需要添加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
本文创建了一个带有自定义参数的节点,该参数可以从launch文件或命令行进行设置。将依赖项、可执行文件和启动文件添加到包配置文件中,以便可以编译和运行它们。
如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。