ros2 Node的create_timer其实并非完全异步的, 当任务时间大于定时间隔时, 并不能保证任务按设置的定时间隔执行。
当任务时间小于定时间隔时, 任务是按设置的定时间隔执行的。
import rclpy
from rclpy.node import Node
from rclpy.executors import MultiThreadedExecutor
class MyNode(Node):
def __init__(self):
super().__init__('listener_node')
self.state_switch_timer = self.create_timer(1, self.func)
def func(self):
print(time.time(), "enter func")
func1()
def func1():
## 模拟一个耗时的操作
a = []
number = 100000000
for i in range(number):
a.append(i)
if i == 0:
print("^" * 10, "first enter fumc1", time.time())
if i % (number // 10) == 0: ##控制最多打印10个, 避免刷屏
print("func1", time.time(), i)
def ros_timer_test(args=None):
rclpy.init(args=args)
robot_control = MyNode()
# 使用 MultiThreadedExecutor
executor = MultiThreadedExecutor()
rclpy.spin(robot_control, executor=executor)
robot_control.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
ros_timer_test()