在类 (c ++) 中使用参数 [待校准@9209]
Goal目标: using使用c Create创建并运行具有ROS参数的类。 [待校准@9210]
教程级别: 初学者 [Alyssa@7088]
Time时间: 20 20分钟 [待校准@7181]
背景
当你制作自己的 nodes 时,你有时需要添加可以从launch文件中设置的参数。 [待校准@9211]
本教程将向您展示如何在cclass类中创建这些参数,以及如何在launch文件中设置它们。 [待校准@9212]
先决条件
在之前的教程中,您学习了如何在ROS 2系统中使用 create a workspace and create a package. You have also learned about parameters 及其功能。 [待校准@9213]
任务
1创建包
打开一个新的终端和 source your ROS 2 installation ,这样 ros2
命令就可以工作了。 [待校准@9214]
导航到 dev_ws
目录创建 previous tutorial 。 [待校准@9215]
重新调用应该在 src
目录中创建的包,而不是工作区的根目录。导航到 dev_ws/src
并创建一个新的包: [待校准@9216]
ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp
您的终端将返回一条消息,验证您的包 cpp_parameters
及其所有必要的文件和文件夹的创建。 [待校准@9217]
[需手动修复的语法] --dependencies
参数将自动调用y向 package.xml
和 CMakeLists.txt
添加必要的依赖线。 [待校准@9218]
1.1更新 package.xml
[待校准@8003]
因为您在包创建过程中使用了 --dependencies
选项,所以您不必手动向 package.xml
或 CMakeLists.txt
添加依赖项。 [待校准@9219]
但是,与往常一样,请确保将描述、维护人员电子邮件和姓名以及许可信息添加到 package.xml
。 [待校准@9220]
<description>C++ parameter tutorial</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>
2编写cnode节点 [待校准@8005]
在 dev_ws/src/cpp_parameters/src
目录内,创建一个调用 cpp_parameters_node.cpp
的新文件,并将以下代码粘贴到: [待校准@9221]
#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检查代码 [待校准@8007]
顶部的 “# include” 语句是包依赖项。 [待校准@9222]
下一段代码创建类和构造函数。此构造函数的第一行创建我们的参数。我们的参数名为 my_parameter
,并被指定为默认值 world
。接下来, timer_
初始化,这导致 respond
函数每秒执行一次。 [待校准@9223]
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
函数确保消息被记录。 [待校准@9224]
void respond()
{
this->get_parameter("my_parameter", parameter_string_);
RCLCPP_INFO(this->get_logger(), "Hello %s", parameter_string_.c_str());
}
最后是 timer_
和 parameter_string_
的声明 [待校准@9225]
private:
std::string parameter_string_;
rclcpp::TimerBase::SharedPtr timer_;
追踪我们的 ParametersClass
是我们的 main
。这里ROS 2被初始化,“rclcpp:: spin” 开始处理来自节点的数据。 [待校准@9226]
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<ParametersClass>());
rclcpp::shutdown();
return 0;
}
2.2添加可执行文件 [待校准@8031]
现在打开 CMakeLists.txt
文件。在 find_package(rclcpp REQUIRED)
依赖项下添加以下代码行。 [待校准@9227]
add_executable(parameter_node src/cpp_parameters_node.cpp)
ament_target_dependencies(parameter_node rclcpp)
install(TARGETS
parameter_node
DESTINATION lib/${PROJECT_NAME}
)
3构建和运行 [待校准@8033]
在构建之前,最好在工作区 ( dev_ws
) 的根目录下运行 rosdep
,以检查是否缺少依赖项: [待校准@9228]
rosdep install -i --from-path src --rosdistro foxy -y
rosdep仅在Linux上运行,因此您可以跳到下一步。 [待校准@9229]
rosdep仅在Linux上运行,因此您可以跳到下一步。 [待校准@9229]
导航回工作区的根目录, dev_ws
,并构建新的包: [待校准@9230]
colcon build --packages-select cpp_parameters
colcon build --packages-select cpp_parameters
colcon build --merge-install --packages-select cpp_parameters
打开一个新的终端,导航到 dev_ws
,源文件安装文件: [待校准@9231]
. install/setup.bash
. install/setup.bash
call install/setup.bat
现在运行节点: [待校准@7899]
ros2 run cpp_parameters parameter_node
终端应每秒返回以下消息: [待校准@9232]
[INFO] [parameter_node]: Hello world
现在您可以看到参数的默认值,但是您希望能够自己设置它。有两种方法可以实现这一点。 [待校准@9233]
3.1通过控制台进行更改 [待校准@9234]
这部分将使用你从 tutorial about parameters 中获得的知识,并将其应用到你刚刚创建的节点上。 [待校准@9235]
确保节点正在运行: [待校准@9236]
ros2 run cpp_parameters parameter_node
打开另一个终端,再次从 dev_ws
内部源文件,然后输入以下行: [待校准@9237]
ros2 param list
在那里你会看到自定义参数 my_parameter
。要更改它,只需在控制台中运行以下行: [待校准@9238]
ros2 param set /parameter_node my_parameter earth
你知道如果你得到输出 Set parameter successful
,一切都很顺利。如果您查看另一个终端,您应该会看到输出更改为 “[信息] [参数节点]: 你好地球” [待校准@9239]
3.2通过launch文件进行更改 [待校准@9240]
您也可以在launch文件中设置参数,但是首先您需要添加launch目录。在 dev_ws/src/cpp_parameters/
目录内,创建一个调用 launch
的新目录。在那里,创建一个调用ed cpp_parameters_launch.py
的新文件 [待校准@9241]
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
launch时,我们将 my_parameter
设置为 earth
。通过添加下面的两行,我们确保我们的输出打印在我们的控制台中。 [待校准@9242]
output="screen",
emulate_tty=True,
现在打开 CMakeLists.txt
文件。在您之前添加的行下方,添加以下代码行。 [待校准@9243]
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
打开控制台,导航到工作区的根目录, dev_ws
,然后构建新包: [待校准@9244]
colcon build --packages-select cpp_parameters
colcon build --packages-select cpp_parameters
colcon build --merge-install --packages-select cpp_parameters
然后在新终端中源文件安装文件: [待校准@9245]
. install/setup.bash
. install/setup.bash
call install/setup.bat
现在使用我们刚刚创建的launch文件运行该节点: [待校准@9246]
ros2 launch cpp_parameters cpp_parameters_launch.py
终端应每秒返回以下消息: [待校准@9232]
[parameter_node-1] [INFO] [custom_parameter_node]: Hello earth
总结
您创建了一个带有自定义参数的节点,可以从launch文件或命令行进行设置。您将依赖项、可执行文件和launch文件添加到包配置文件中,以便构建和运行它们,并在动作中查看参数。 [待校准@9247]
下一步
既然你有了自己的包和ROS 2系统, next tutorial 将向你展示如何检查你的环境和系统中的问题,以防你有问题。 [待校准@9248]