ROS2入门教程 您所在的位置:网站首页 ros2 ROS2入门教程

ROS2入门教程

2023-03-24 14:34| 来源: 网络整理| 查看: 265

ROS2入门教程——20. 如何使用ROS2的参数(C++) 古月 分类:ROS2入门教程 个人专栏:ROS2入门教程 发布时间 2021.09.08阅读数 7095 评论数 0

 当我们自己编写节点功能时,总有一些配置需要在启动过程中通过外部参数来配置,这一篇我们就来一起学习如何在C++的类和Launch文件中使用ROS2的参数功能。

1. 创建功能包 在dev_ws工作空间的src文件夹中,创建一个功能包cpp_parameters: ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp 由于在创建功能包时,使用了 --dependencies参数,会自动添加一些依赖项在 package.xml和 CMakeLists.txt文件中,所以就不需要特意设置了。但是我们最好还是打开package.xml文件,在其中填写完整以下这些描述信息。 C++ parameter tutorial Hu Chunxu Apache License 2.0 2. 编写C++代码 在dev_ws/src/cpp_parameters/src路径下,创建一个名为cpp_parameters_node.cpp的代码文件,然后复制粘贴如下代码内容: #include #include #include #include using namespace std::chrono_literals; class ParametersClass: public rclcpp::Node { public: ParametersClass() : Node("parameter_node") { this->declare_parameter("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()); rclcpp::shutdown(); return 0; } 2.1 代码解析 我们来解释一下以上代码的关键部分。 ParametersClass() : Node("parameter_node") { this->declare_parameter("my_parameter", "world"); timer_ = this->create_wall_timer( 1000ms, std::bind(&ParametersClass::respond, this)); } 这段代码是ParametersClass类的构造函数,其中第一行就创建了一个ROS参数,参数名为my_parameter,参数值为“world”,数据类型是string。接下来的第二行创建了一个1s周期的定时器,触发respond函数。 void respond() { this->get_parameter("my_parameter", parameter_string_); RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str()); } 在respond函数中,第一行会查询“my_parameter”参数,并且保存在parameter_string_这个私有变量中,紧接着第二行就把查询到的参数值打印出来了。 int main(int argc, char** argv) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared()); rclcpp::shutdown(); return 0; } main函数是以上定义类的具体实例化调用过程,先是初始了节点,接下来就开始处理类的构建和启动定时器。 2.2 添加编译配置 接下来打开CMakeLists.txt文件,添加如下编译选项的配置内容: add_executable(parameter_node src/cpp_parameters_node.cpp) ament_target_dependencies(parameter_node rclcpp) install(TARGETS parameter_node DESTINATION lib/${PROJECT_NAME} ) 3.编译运行 首先确认功能包的依赖是否有安装完成,如果又缺少的依赖则会自动安装: rosdep install -i --from-path src --rosdistro foxy -y 在终端中回到dev_ws工作空间的根目录下,使用如下命令编译工作空间: colcon build --packages-select cpp_parameters   打开一个新的终端,还是进入到dev_ws工作空间根目录下,先设置工作空间的环境变量,接下来就可以运行编译完成的节点了。 . install/setup.bash ros2 run cpp_parameters parameter_node   在终端中就可以看到每秒会有一个参数值的输出日志了。   这个值是我们在程序中设置的参数默认值,如果我们想修改它,该如何做呢?   3.1 通过终端修改参数值 不要关闭刚才运行的参数功能节点,打开一个新终端,使用如下命令查询当前所有参数列表。 ros2 param list   在列表中可以看到my_parameter这个参数,接下来就可以通过如下命令行来修改这个参数的值了。 ros2 param set /parameter_node my_parameter earth   这样,我们就将my_parameter参数的值修改为“earth”了,此时刚才运行节点的终端中,也会变成如下日志输出:   3.2 通过Launch文件修改参数值 和ROS1一样,在ROS2中也可以通过Launch文件来设置参数值。在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"} ] ) ]) 在以上launch文件的最后几行,可以看到我们依然是把my_parameter设置为了“earth”。   要运行launch文件,还需要在CMakeLists.txt文件中配置一下。 install( DIRECTORY launch DESTINATION share/${PROJECT_NAME} ) 在终端中回到dev_ws工作空间根目录下,然后重新编译一下。 colcon build --packages-select cpp_parameters 接下来一样的操作,设置工作空间环境变量,再运行launch文件。 . install/setup.bash ros2 launch cpp_parameters cpp_parameters_launch.py 终端中就可以看到参数修改之后的日志输出了。 好啦,以上就是今天学习的内容,我们成功通过C++的代码创建并查询了参数内容,同时通过命令行和Launch文件的方式,对代码内的参数进行了重新设置。

ROS2参数parameter

原创文章作者:古月。如若转载,请注明出处:古月居 http://www.guyuehome.com/35322

打赏 0

点赞 1

收藏 1

分享

微信 微博 QQ 图片 上一篇:小米机器狗“铁蛋”选择的ROS2是什么? 下一篇:ROS2入门教程——21. 如何使用ROS2的参数(Python)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有