我的计时精度与spin_once的数量有关。
我试图以恒定的速率将服务称为“compute_rectangle_area”。奇怪的事发生了。
如果我把频率设置为1Hz,似乎我必须做四次spin_once才能得到正确的计时!
如果自旋次数小于4次,则程序将停留在下面的屏幕上。

如果重复的时间大于4,则程序的睡眠时间比预期的长。

这是我的密码。
#!/usr/bin/python3
from asyncio import Future
from functools import partial
import rclpy
from rclpy.node import Node
from robot_interfaces1.srv import ComputeRectangleArea
class ComputeRectangleAreaClientNode(Node):
def __init__(self, node_name: str) -> None:
super().__init__(node_name)
self.client_ = self.create_client(ComputeRectangleArea,"compute_rectangle_area")
def call_compute_rectangle_area_server(self,length:float,width:float)->bool:
if(self.client_.wait_for_service(5)):
msg_request = ComputeRectangleArea.Request()
msg_request.length = length
msg_request.width = width
future = self.client_.call_async(msg_request)
future.add_done_callback\
(partial(self.callback_call_compute_rectangle_area_server,length=length,width=width))
return True
else:
self.get_logger().error("Server is not ready.")
return False
pass
def callback_call_compute_rectangle_area_server \
(self,future:Future,length:float,width:float):
if future.exception() == None:
response_:ComputeRectangleArea.Response = future.result()
self.get_logger().info(f"{length} * {width} = {response_.area}.")
else:
self.get_logger().error(f"The {self.get_name()} returns {future.exception()}.")
def main(args=None):
rclpy.init(args=args)
n = ComputeRectangleAreaClientNode("compute_rectangle_area_client")
loop_rate = n.create_rate(1)
counter = 0
while rclpy.ok():
if(n.call_compute_rectangle_area_server(67.4,45.6)):
n.get_logger().info(f"Call {counter} times.")
counter += 1
rclpy.spin_once(n)
rclpy.spin_once(n)
rclpy.spin_once(n)
rclpy.spin_once(n)
rclpy.spin_once(n)
rclpy.spin_once(n)
loop_rate.sleep()
rclpy.shutdown()
if __name__ == "__main__":
main()发布于 2022-03-14 14:32:07
根据您的注释,逻辑的问题是您没有在应该使用的位置使用计时器;除了多次使用spin_once()之外,核心逻辑没有任何问题。
您之所以看到这个问题,是因为spin_once与时间无关,它只是调用可用的回调。如果希望以固定速率处理数据,最好让回调和服务使用rclpy.spin(node)运行,然后有一个固定速率计时器调用主循环。
https://stackoverflow.com/questions/71374988
复制相似问题