如何使用ROS2创建两个节点
时间: 2024-09-15 14:07:23 浏览: 38
使用Scratch2和ROS进行机器人编程学习
在Robot Operating System (ROS) 2中,创建两个节点主要是为了处理独立的任务并相互交流数据。以下是使用ROS2 C++或Python创建两个节点的基本步骤:
**使用C++创建节点(example_node1.cpp 和 example_node2.cpp)**:
1. **安装ROS2**:首先确保已经安装了ros2包管理工具`ros2`。
2. **创建package**:在你的工作目录下创建一个新的包,例如`my_package`,然后进入该包目录。
```sh
mkdir -p src
cd src
catkin_create_pkg my_package std_msgs
```
3. **编写第一个节点**(example_node1.cpp):
```cpp
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/int32.hpp>
class ExampleNode1 : public rclcpp::Node
{
public:
explicit ExampleNode1(rclcpp::NodeOptions options)
: Node("example_node1", options),
publisher_("publish_int", std_msgs::msg::Int32::SharedPtr(new std_msgs::msg::Int32()))
{}
void spin()
{
auto msg = std_msgs::msg::Int32(42);
while (rclcpp::ok()) {
publisher_.publish(msg);
rclcpp::spin_some(context_);
}
}
private:
rclcpp::Publisher<std_msgs::msg::Int32> publisher_;
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::create_node<ExampleNode1>("example_node1");
node->spin();
rclcpp::shutdown();
return 0;
}
```
4. **编写第二个节点**(example_node2.cpp),这里可以添加监听第一个节点消息的功能:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/int32.hpp>
class ExampleNode2 : public rclcpp::Node
{
public:
explicit ExampleNode2(rclcpp::NodeOptions options)
: Node("example_node2", options)
{}
void callback(const std_msgs::msg::Int32::SharedPtr msg)
{
RCLCPP_INFO(get_logger(), "Received message: %d", msg->data);
}
void spin()
{
auto subscription = this->create_subscription<std_msgs::msg::Int32>(
"publish_int", 10,
std::bind(&ExampleNode2::callback, this, std::placeholders::_1));
rclcpp::spin_some(context_);
}
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = rclcpp::create_node<ExampleNode2>("example_node2");
node->spin();
rclcpp::shutdown();
return 0;
}
```
5. **构建并运行**:在包目录里构建并启动这两个节点。
```sh
cd ..
colcon build
ros2 run my_package example_node1
ros2 run my_package example_node2
```
**使用Python创建节点(example_node1.py 和 example_node2.py)**:
- 类似于C++,但使用`rclpy`库。
**注意事项**:
- 确保网络连接正常,因为节点间通过发布订阅通信。
- 可能需要调整节点间的通信话题名称(如`"publish_int"`)以避免冲突。
阅读全文