ros2 创建一个订阅节点 代码
时间: 2023-05-18 11:04:56 浏览: 68
可以使用以下代码来创建一个ROS2订阅节点:ros2::NodeOptions node_options;
auto node = rclcpp::Node::make_shared("subscriber_node", node_options);
auto subscription = node->create_subscription<std_msgs::msg::String>("topic_name", 10, [](std_msgs::msg::String::SharedPtr msg) {
std::cout << "Received: '" << msg->data << "'" << std::endl;
});
相关问题
ros2创建节点
在ROS 2中,创建节点需要进行以下步骤:
1. 创建一个ROS 2包(package)
在ROS 2中,使用`colcon`来编译ROS 2程序,因此在创建ROS 2包之前,需要先安装`colcon`。安装完成后,在终端中输入以下命令来创建ROS 2包:
```
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create my_package --build-type ament_cmake
```
这个命令会在`~/ros2_ws/src`目录下创建一个名为`my_package`的ROS 2包,并使用`ament_cmake`作为构建类型。
2. 创建一个ROS 2节点
在ROS 2包中,可以创建多个节点。在`my_package`包中,使用以下命令来创建一个名为`my_node`的节点:
```
cd ~/ros2_ws/src/my_package
ros2 pkg create my_node --build-type ament_cmake --node-name my_node
```
这个命令会在`my_package`包中创建一个名为`my_node`的目录,并在其中生成一个C++源文件`my_node.cpp`,并且在`CMakeLists.txt`中添加了编译`my_node`节点所需的相关代码。
3. 编写节点代码
在`my_node.cpp`文件中编写节点代码。节点代码应该包含节点初始化、消息订阅和发布、消息处理等功能。例如,以下代码会创建一个ROS 2节点,订阅名为`/input`的字符串消息,并将消息添加到名为`/output`的字符串消息中进行发布:
```cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class MyNode : public rclcpp::Node {
public:
MyNode() : Node("my_node") {
pub_ = create_publisher<std_msgs::msg::String>("output", 10);
sub_ = create_subscription<std_msgs::msg::String>("input", 10,
std::bind(&MyNode::onInput, this, std::placeholders::_1));
}
private:
void onInput(const std_msgs::msg::String::SharedPtr msg) {
auto output_msg = std_msgs::msg::String();
output_msg.data = "Received message: " + msg->data;
pub_->publish(output_msg);
}
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_;
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_;
};
int main(int argc, char** argv) {
rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
```
4. 编译节点
在终端中,使用以下命令编译ROS 2节点:
```
cd ~/ros2_ws
colcon build --packages-select my_package
```
这个命令会在`~/ros2_ws/build`目录下编译`my_package`包,并生成`my_node`节点的可执行文件。
5. 运行节点
在终端中,使用以下命令运行`my_node`节点:
```
cd ~/ros2_ws
source install/setup.bash
ros2 run my_package my_node
```
这个命令会启动`my_node`节点,并开始订阅`/input`话题,并在`/output`话题中发布消息。
这是一个简单的ROS 2节点创建和使用的例子,实际情况中可能需要更复杂的节点和功能。同时,需要注意编写好`package.xml`和`CMakeLists.txt`文件,以正确配置ROS 2节点的依赖和编译选项。
ROS2节点通信的代码实现
在ROS2中,节点之间的通信可以通过发布者(Publisher)和订阅者(Subscriber)来实现。具体的实现步骤如下:
1. 创建节点
首先,需要创建节点并且初始化ROS2系统,代码如下:
```python
import rclpy
rclpy.init()
node = rclpy.create_node('my_node')
```
2. 创建发布者
接下来,需要创建一个发布者对象并且指定发布的主题名称、消息类型等信息,代码如下:
```python
from std_msgs.msg import String
publisher = node.create_publisher(String, 'my_topic', 10)
```
其中,String是消息类型,'my_topic'是发布的主题名称,10是队列的大小。
3. 发布消息
发布消息时,需要构造一个消息对象并且调用发布者对象的publish()方法,代码如下:
```python
msg = String()
msg.data = 'Hello, World!'
publisher.publish(msg)
```
这里构造了一个String类型的消息,将其data属性设置为'Hello, World!',然后调用publish()方法将消息发布出去。
4. 创建订阅者
创建订阅者的代码与创建发布者类似,需要指定订阅的主题名称、消息类型等信息,代码如下:
```python
subscriber = node.create_subscription(String, 'my_topic', callback, 10)
```
其中,callback是当订阅到消息时要执行的回调函数,10是队列的大小。
5. 定义回调函数
回调函数的作用是处理订阅到的消息,代码如下:
```python
def callback(msg):
print('I heard: [%s]' % msg.data)
```
这里的回调函数将订阅到的消息打印出来。
6. 运行节点
最后,需要调用rclpy.spin()方法来运行节点,代码如下:
```python
rclpy.spin(node)
```
完整的代码如下:
```python
import rclpy
from std_msgs.msg import String
def callback(msg):
print('I heard: [%s]' % msg.data)
def main(args=None):
rclpy.init(args=args)
node = rclpy.create_node('my_node')
publisher = node.create_publisher(String, 'my_topic', 10)
subscriber = node.create_subscription(String, 'my_topic', callback, 10)
msg = String()
msg.data = 'Hello, World!'
publisher.publish(msg)
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
这个例子中创建了一个节点,同时创建了一个发布者和一个订阅者,发布了一条消息,然后运行节点并且等待订阅到消息。当订阅到消息时,会执行回调函数并且打印消息内容。