概要:这篇主要介绍在类中使用参数(C++)
环境:ubuntu20.04,ros2-foxy,vscode
最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.
2.2.9在类中使用参数(C++)(原文:https://docs.ros.org/en/foxy/Tutorials/Using-Parameters-In-A-Class-CPP.html )
>> 教程>> 在类中使用参数(C++)
你正阅读的是ros2 较老版本(Foxy ),但仍然支持的说明文档.想查看最新版本的信息,请看galactic 版本链接( https://docs.ros.org/en/galactic/Tutorials.html )
在类中使用参数(C++)
目标:使用c++创建带有ros参数的类
课程等级:初级
时长:20min
目录:
1.背景 2.预备知识 3.步骤 3.1创建一个包 3.2写一个c++节点 3.3编译运行 4.总结 5.下一步
1.背景
在操作节点时,你有时需要通过launch文件来设置参数.
这节课就是向你展示创建带有参数的c++类,和如何在launch文件里面设置这些参数.
2.预备知识
在前面课程中,你学了如何创建工作空间和包.你也学习了ros2 系统里面的参数和它们的函数.
3.步骤
3.1创建一个包
新开一个终端,source 一下ros2 安装位置以保证ros2 指令都没问题.
进入之前课程创建的dev_ws 工作空间目录.
回忆一下,包应该创建在src 目录下,并不是工作空间的根目录.进入dev_ws/src 目录,新建一个包:
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
你的终端返回信息表示你的cpp_parameters 包以及相关的必要文件都创建完成.
--dependencies 参数会自动添加必要的依赖行到package.xml 和CMakeLists.txt 文件中.
3.1.1更新package.xml文件
由于创建包时使用了--dependencies 操作,你不必在package.xml 和CMakeLists.txt 文件手动添加依赖.
往常一样,确定在package.xml 文件中添加了description, maintainer email and name 和license 内容.
<description>C++ parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>
3.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;
}
3.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_;
我们的主函数main 用到ParametersClass 类.这里ros2 被初始化了,并且rclcpp::spin 开始处理来自节点的数据.
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ParametersClass>());
rclcpp::shutdown();
return 0;
}
3.2.2添加executable
现在打开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.3编译运行
编译前,在工作空间dev_ws 根目录下面运行rosdep 查找所缺少的依赖是一个不错的操作.
linux:
rosdep install -i --from-path src --rosdistro foxy -y
返回dev_ws 工作空间的根目录,编译你的新包:
colcon build --packages-select cpp_parameters
新开一个终端,进入dev_ws,source 一下配置文件:
linux:
. install/setup.bash
然后运行节点:
ros2 run cpp_parameters parameter_node
终端每秒会返回一次下面信息:
[INFO] [parameter_node]: Hello world
现在你可以看到你的参数的默认值,但是你想能够自己来设置它(参数).这里有两种方式可以实现.
3.3.1通过改变控制台
这部分用到你在参数教程学习到的知识,运用到你刚刚创建的节点上面.
保证节点在运行中:
ros2 run cpp_parameters parameter_node
新开另外一个终端,进入dev_ws 并source 一下环境变量,输入下面这行指令:
ros2 param list
你会看到自定义参数my_parameter .在控制台简单运行下面指令来更改它:
ros2 param set /parameter_node my_parameter earth
如果你看到输出Set parameter successful ,这表示参数设置成功.如果你看一下其他终端,你应该看见输出更改为[INFO] [parameter_node]: Hello earth
3.3.2通过launch文件进行修改
你也可以在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}
)
开一个终端,进入dev_ws根目录,编译你的新包:
linux:
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 文件,也可以使用命令行来设置(参数).添加依赖关系,可执行文件,launch 文件到包配置文件,这样子,你就可以编译和运行它们了,并且可以看见(设置的)参数起作用了.
5.下一步
既然有了自己的一些包和ros2 系统,下一个节课教你如何检查环境系统问题,以免你有问题(却不知道怎么折腾).
其他
个人认为重点:
c++ 参数node 编写;添加内容后,配置文件的如何编写;使用launch文件更改默认参数编写句子理解以及对应配置文件的内容的添加.
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
##################### 不积硅步,无以至千里 好记性不如烂笔头 感觉有点收获的话,麻烦大大们点赞收藏哈
|