1. 自定义topic消息

1.1 创建package

  1. ros2 pkg create --build-type ament_cmake msg_srv

可以修改package.xml文件如下信息

  1. <description>C++ client server tutorial</description>
  2. <maintainer email="you@email.com">Your Name</maintainer>
  3. <license>Apache License 2.0</license>

1.2 在工程下创建msg文件夹,创建Num.msg文件并填写如下内容

  1. int64 num

1.3 配置cmake

  1. find_package(rosidl_default_generators REQUIRED)
  2. rosidl_generate_interfaces(${PROJECT_NAME}
  3. "msg/Num.msg"
  4. )

出现如下问题
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR)
执行如下命令即可

  1. sudo apt-get install libssl-dev

1.4 配置package.xml文件

  1. <build_depend>rosidl_default_generators</build_depend>
  2. <exec_depend>rosidl_default_runtime</exec_depend>
  3. <member_of_group>rosidl_interface_packages</member_of_group>

1.5 编译工程

  1. colcon build --packages-select msg_srv

1.6 显示消息详情

  1. ros2 interface show msg_srv/msg/Num

2. 使用自定义的topic消息

2.1 publisher

  1. import rclpy
  2. from rclpy.node import Node
  3. from msg_srv.msg import Num
  4. class MyNode(Node):
  5. def __init__(self):
  6. super(MyNode, self).__init__('publisher_py')
  7. self.publisher = self.create_publisher(Num, 'py_topic', 10)
  8. timer_period = 0.5 # seconds
  9. self.timer = self.create_timer(timer_period, self.timer_callback)
  10. self.i = 0
  11. def timer_callback(self):
  12. msg = Num()
  13. msg.num = self.i
  14. self.publisher.publish(msg)
  15. self.get_logger().info('Publishing: "%d"' % msg.num)
  16. self.i += 1
  17. def main():
  18. rclpy.init()
  19. node = MyNode()
  20. rclpy.spin(node)
  21. node.destroy_node()
  22. rclpy.shutdown()
  23. if __name__ == '__main__':
  24. main()

2.2 subscriber

  1. import rclpy
  2. from rclpy.node import Node
  3. from msg_srv.msg import Num
  4. class MyNode(Node):
  5. def __init__(self):
  6. super(MyNode, self).__init__('subscriber_node')
  7. self.subscription = self.create_subscription(Num, 'py_topic', self.msg_call_back, 10)
  8. def msg_call_back(self, msg):
  9. self.get_logger().info(f'msg:{msg.num}')
  10. def main():
  11. rclpy.init()
  12. node = MyNode()
  13. rclpy.spin(node)
  14. node.destroy_node()
  15. rclpy.shutdown()
  16. if __name__ == '__main__':
  17. main()

2.3 package.xml配置

  1. <exec_depend>msg_srv</exec_depend>

2.4 setup.py配置

  1. entry_points={
  2. 'console_scripts': [
  3. ...
  4. 'publisher_msg = py_pubsub.publisher_msg:main',
  5. 'subscriber_msg = py_pubsub.subscriber_msg:main',
  6. ],
  7. },

2.5 编译工程

  1. colcon build

2.6 运行节点

  1. ros2 run py_pubsub publisher_msg
  2. ros2 run py_pubsub subscriber_msg