首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的计时精度与spin_once的数量有关。

我的计时精度与spin_once的数量有关。
EN

Stack Overflow用户
提问于 2022-03-06 23:22:47
回答 1查看 97关注 0票数 0

我的计时精度与spin_once的数量有关。

我试图以恒定的速率将服务称为“compute_rectangle_area”。奇怪的事发生了。

如果我把频率设置为1Hz,似乎我必须做四次spin_once才能得到正确的计时!

如果自旋次数小于4次,则程序将停留在下面的屏幕上。

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

这是我的密码。

代码语言:javascript
复制
#!/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()
EN

回答 1

Stack Overflow用户

发布于 2022-03-14 14:32:07

根据您的注释,逻辑的问题是您没有在应该使用的位置使用计时器;除了多次使用spin_once()之外,核心逻辑没有任何问题。

您之所以看到这个问题,是因为spin_once与时间无关,它只是调用可用的回调。如果希望以固定速率处理数据,最好让回调和服务使用rclpy.spin(node)运行,然后有一个固定速率计时器调用主循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71374988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档