Beginner:Client libraries-8 在类中使用参数
目标:创建和运行一个具有ROS参数的类
背景
当实现自己节点的时候,可能需要从launch文件中添加参数。本教程的目的是告诉你怎样在c++类中创建这些参数,以及怎样在launch文件中设置。
任务
1、创建一个包
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
1.1 更新package.xml
<description>C++ parameter tutorial</description> <maintainer email="you@email.com">Your Name</maintainer> <license>Apache License 2.0</license>
2、实现C++节点
创建文件cpp_parameters_node.cpp
#include <chrono> #include <functional> #include <string> #include <rclcpp/rclcpp.hpp> using namespace std::chrono_literals; class MinimalParam : public rclcpp::Node { public: MinimalParam() : Node("minimal_param_node") {
//创建了一个参数,默认值为world,参数类型根据默认值来推断,在本例子中是一个string this->declare_parameter("my_parameter", "world"); //1HZ的定时器触发 timer_ = this->create_wall_timer( 1000ms, std::bind(&MinimalParam::timer_callback, this)); } void timer_callback() {
//获得参数,并存储到my_param中, std::string my_param = this->get_parameter("my_parameter").as_string(); RCLCPP_INFO(this->get_logger(), "Hello %s!", my_param.c_str()); //将my_parameter参数重新设置为默认值world std::vector<rclcpp::Parameter> all_new_parameters{rclcpp::Parameter("my_parameter", "world")}; this->set_parameters(all_new_parameters); } private: rclcpp::TimerBase::SharedPtr timer_;//定时器的声明 }; int main(int argc, char ** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<MinimalParam>()); rclcpp::shutdown(); return 0; }
2.1.1添加参数描述
可以为参数设置一个描述符,描述符允许指定一个参数的文本描述以及它的约束,比如让它只读,指定一个范围等等;
// ... class MinimalParam : public rclcpp::Node { public: MinimalParam() : Node("minimal_param_node") { auto param_desc = rcl_interfaces::msg::ParameterDescriptor{}; param_desc.description = "This parameter is mine!"; this->declare_parameter("my_parameter", "world", param_desc); timer_ = this->create_wall_timer( 1000ms, std::bind(&MinimalParam::timer_callback, this)); }
2.2 添加可执行程序
add_executable(minimal_param_node src/cpp_parameters_node.cpp) ament_target_dependencies(minimal_param_node rclcpp) install(TARGETS minimal_param_node DESTINATION lib/${PROJECT_NAME} )
3、编译和运行
colcon build --packages-select cpp_parameters ros2 run cpp_parameters minimal_param_node
3.1 通过终端来改变
ros2 param set /minimal_param_node my_parameter earth
3.2 通过launch文件来改变
也可以在launch文件中设置参数,但是首先你需要添加launch目录。在包目录下添加一个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="minimal_param_node", name="custom_minimal_param_node", output="screen", emulate_tty=True, parameters=[ {"my_parameter": "earth"} ] ) ])
install( DIRECTORY launch DESTINATION share/${PROJECT_NAME} )
总结
您使用自定义参数创建了一个节点,该参数可以从启动文件或命令行设置。您将依赖项、可执行文件和启动文件添加到包配置文件中,以便可以构建和运行它们,并查看参数的作用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2016-06-03 无名管道通讯编程
2016-06-03 执行程序---system
2016-06-03 exit--进程退出;wait--进程等待;execl--执行程序
2016-06-03 创建一个子进程---vfork
2016-06-03 多进程程序设计
2016-06-03 进程控制理论
2016-06-03 时间编程