安装
默认已经按照好ROS2如果安装过程有问题建议使用简单好用的MQTT协议
sudo apt-get install -y python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
创建一个ROS2工作空间
接下来,你需要创建一个ROS2工作空间,可以通过以下命令在终端中创建:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/
colcon build --symlink-install
完成后,你需要激活该工作空间,可以通过以下命令在终端中激活:
bashCopy code
source ~/ros2_ws/install/setup.bash
创建服务
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import openai
openai.api_key = "sk-"#填写openai
class ChatGPTNode(Node):
def __init__(self):
super().__init__("chat_gpt_node")
self.publisher = self.create_publisher(String, "chat_gpt_result", 10)
self.subscription = self.create_subscription(String, "user_input", self.callback_user_input, 10)
def callback_user_input(self, msg):
response = openai.Completion.create(
engine="davinci",
prompt=msg.data,
max_tokens=60,
n=1,
stop=None,
temperature=0.5
)
result = String()
result.data = response.choices[0].text.strip()
self.publisher.publish(result)
self.get_logger().info("Published: %s" % result.data)
def main(args=None):
rclpy.init(args=args)
node = ChatGPTNode()
rclpy.spin(node)
rclpy.shutdown()
print("1111")
if __name__ == "__main__":
main()
发布消息
然后,你可以使用ROS2 Python客户端库中的Node API来创建一个ROS2节点,并使用ROS2中定义的消息类型与其他节点进行通信。例如,以下代码可以创建一个ROS2节点并发布一个字符串消息:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # 字符串消息类型
"""
创建一个发布者节点
"""
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.pub = self.create_publisher(String, "user_input", 10) # 创建发布者对象(消息类型、话题名、队列长度)
self.timer = self.create_timer(0.5, self.timer_callback) # 创建一个定时器(单位为秒的周期,定时执行的回调函数)
def timer_callback(self): # 创建定时器周期执行的回调函数
msg = String() # 创建一个String类型的消息对象
msg.data = input("shu:") # 填充消息对象中的消息数据
self.pub.publish(msg) # 发布话题消息
self.get_logger().info('Publishing: "%s"' % msg.data) # 输出日志信息,提示已经完成话题发布
def main(args=None): # ROS2节点主入口main函数
rclpy.init(args=args) # ROS2 Python接口初始化
node = PublisherNode("topic_helloworld_pub") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
~
订阅消息
可以监听回答消息
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class DisplayResultNode(Node):
def __init__(self):
super().__init__("display_result_node")
self.subscription = self.create_subscription(String, "chat_gpt_result", self.callback_chat_gpt_result, 10)
def callback_chat_gpt_result(self, msg):
self.get_logger().info("Received: %s" % msg.data)
def main(args=None):
rclpy.init(args=args)
node = DisplayResultNode()
rclpy.spin(node)
rclpy.shutdown()
if __name__ == "__main__":
main()