rclpy 是 ROS 2 (Robot Operating System 2) 中用于 Python 的客户端库。它提供了与 ROS 2 系统交互的 API,使开发者能够使用 Python 编写 ROS 2 节点、发布和订阅消息、调用服务、定时器等。rclpy 是 ROS 2 的核心库之一,为 Python 开发者提供了与 ROS 2 系统进行通信的能力。
安装 ROS 2(以 Ubuntu 为例):
sudo apt update
sudo apt install ros-<ros-distro>-rclpy
替换 为你使用的 ROS 2 发行版(如 foxy、galactic、humble)。
导入 rclpy:
import rclpy
from rclpy.node import Node
定义节点类:
class MinimalNode(Node):
def __init__(self):
super().__init__('minimal_node')
self.get_logger().info('Hello ROS 2 from Python node!')
初始化和运行节点:
def main(args=None):
rclpy.init(args=args)
node = MinimalNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
完整示例:
import rclpy
from rclpy.node import Node
class MinimalNode(Node):
def __init__(self):
super().__init__('minimal_node')
self.get_logger().info('Hello ROS 2 from Python node!')
def main(args=None):
rclpy.init(args=args)
node = MinimalNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
from std_msgs.msg import String
class PublisherNode(Node):
def __init__(self):
super().__init__('publisher_node')
self.publisher_ = self.create_publisher(String, 'topic', 10)
timer_period = 1 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = String()
msg.data = 'Hello, world! %d' % self.i
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
self.i += 1
4.2 创建订阅者
class SubscriberNode(Node):
def __init__(self):
super().__init__('subscriber_node')
self.subscription = self.create_subscription(
String,
'topic',
self.listener_callback,
10)
self.subscription # prevent unused variable warning
def listener_callback(self, msg):
self.get_logger().info('Received: "%s"' % msg.data)
from example_interfaces.srv import AddTwoInts
class ServiceNode(Node):
def __init__(self):
super().__init__('service_node')
self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)
def add_two_ints_callback(self, request, response):
response.sum = request.a + request.b
return response
5.2 创建客户端
from example_interfaces.srv import AddTwoInts
class ClientNode(Node):
def __init__(self):
super().__init__('client_node')
self.client = self.create_client(AddTwoInts, 'add_two_ints')
while not self.client.wait_for_service(timeout_sec=1.0):
self.get_logger().info('Service not available, waiting again...')
self.req = AddTwoInts.Request()
self.req.a = 1
self.req.b = 2
self.send_request()
def send_request(self):
self.future = self.client.call_async(self.req)
self.future.add_done_callback(self.callback)
def callback(self, future):
try:
response = future.result()
except Exception as e:
self.get_logger().info('Service call failed %r' % (e,))
else:
self.get_logger().info('Result of add_two_ints: %d' % response.sum)
class TimerNode(Node):
def __init__(self):
super().__init__('timer_node')
self.timer = self.create_timer(1.0, self.timer_callback)
def timer_callback(self):
self.get_logger().info('Timer callback triggered')
class ParameterNode(Node):
def __init__(self):
super().__init__('parameter_node')
self.declare_parameter('my_parameter', 'default_value')
self.get_logger().info('Parameter value: %s' % self.get_parameter('my_parameter').get_parameter_value().string_value)
示例 setup.py:
from setuptools import setup
package_name = 'my_package'
setup(
name=package_name,
version='0.0.1',
packages=[package_name],
py_modules=['my_module'],
entry_points={
'console_scripts': [
'my_node = my_package.my_module:main',
],
},
install_requires=['setuptools'],
)
总结
rclpy 是 ROS 2 的 Python 客户端库,提供了创建节点、发布和订阅消息、调用服务、定时器等功能。它使得 Python 开发者能够使用熟悉的 Python 语言进行 ROS 2 开发。通过理解和使用 rclpy,可以构建功能强大的 ROS 2 应用程序,并与 ROS 2 系统进行高效的交互。