鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    Time()报错,提示参数给多了,但明明就只给了一个呀

    已定时 已固定 已锁定 已移动
    ROS2机器人开发:从入门到实践
    ros2 ros2humble ros2 humble
    2
    3
    250
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • J
      Jason_Duan
      最后由 编辑

      按照小鱼教程https://www.bilibili.com/video/BV1CSszeuEH3?spm_id_from=333.788.player.switch&vd_source=142d1856361148473fecdd6ec38cb7bc的内容写的,

      环境:
      win11+wsl2+ros2+humble

      tf_listener.py内容:

      import rclpy
      from rclpy.node import Node
      import rclpy.time
      from tf2_ros import TransformListener, Buffer  # 坐标变换监听器
      from tf_transformations import euler_from_quaternion  # 四元数转欧拉角函数
      
      
      class TFBroadcaster(Node):
          def __init__(self):
              super().__init__("tf_listener")
              self.buffer = Buffer()
              self.listener = TransformListener(self.buffer, self)  # 创建监听者
              self.timer = self.create_timer(1, self.get_transform)
      
          def get_transform(self):
              """实时查询buffer的坐标关系"""
              try:
                  result = self.buffer.lookup_transform(
                      "base_link",
                      "bottle_link",
                      rclpy.time.Time(seconds=0),  # seconds=0表示最新的
                      rclpy.time.Time(1.0)  # 超时时间
                  )
                  transform = result.transform
                  self.get_logger().info(f"平移:{transform.translation}")
                  self.get_logger().info(f"旋转:{transform.rotation}")
                  rotation_euler = euler_from_quaternion(
                      transform.rotation.x,
                      transform.rotation.y,
                      transform.rotation.z,
                      transform.rotation.w,
                  )
                  self.get_logger().info(f"欧拉:{rotation_euler}")
              except Exception as e:
                  self.get_logger().warn(f"获取坐标变换失败,原因:{str(e)}")
              
      
      
      def main():
          rclpy.init()
          node = TFBroadcaster()
          rclpy.spin(node)
          rclpy.shutdown()
      
      

      运行时抛异常:

      获取坐标变换失败,原因:Time.__init__() takes 1 positional argument but 2 were given
      

      经定位是这一行的错:

      rclpy.time.Time(1.0),  # 超时时间
      
      1 条回复 最后回复 回复 引用 0
      • 小伊小
        机器人小伊
        最后由 编辑

        在你的代码中,问题出现在对 rclpy.time.Time 的使用上。根据 ROS 2 的 rclpy 库的文档,Time 类的构造函数不应该直接接受秒数作为位置参数。相反,你应该使用关键字参数 seconds 和 nanoseconds 来指定时间。

        在 ROS 2 的 rclpy 中,Time 对象通常通过以下方式创建:

        • Time.from_sec(seconds: float) -> Time: 从秒数创建一个 Time 对象。
        • Time(seconds: float = 0.0, nanoseconds: int = 0) -> Time: 构造函数,接受秒和纳秒作为参数,但都是可选的,默认值为0。

        然而,在你的代码中,你尝试使用 rclpy.time.Time(1.0) 来创建一个 Time 对象,这实际上是错误的,因为这里你传递了一个位置参数 1.0 给 Time 的构造函数,而它期望的是两个可选的关键字参数 seconds 和 nanoseconds。

        为了修复这个问题,你应该使用 Time.from_sec() 方法或者直接使用关键字参数来创建 Time 对象。对于你的代码,应该修改为:

        result = self.buffer.lookup_transform(
            "base_link",
            "bottle_link",
            rclpy.time.Time(seconds=0),  # seconds=0表示最新的
            rclpy.time.Time.from_sec(1.0)  # 使用from_sec方法创建超时时间
        )
        

        或者,直接使用关键字参数(虽然这在 rclpy.time.Time 的标准用法中不常见,但理论上如果构造函数接受关键字参数的话,这是可行的,不过这里更推荐使用 from_sec 方法):

        # 注意:这种用法在 rclpy 的标准 API 中可能不被支持,仅作为理论上的说明
        result = self.buffer.lookup_transform(
            "base_link",
            "bottle_link",
            rclpy.time.Time(seconds=0),  # seconds=0表示最新的
            rclpy.time.Time(seconds=1.0)  # 直接使用关键字参数(如果支持的话)
        )
        

        但根据 rclpy 的实际用法,推荐使用 from_sec 方法,这是更标准和推荐的方式。


        以上为生成回答,仅供参考~

        我是小伊,已接入ChatGpt,所有回复,仅供参考~

        1 条回复 最后回复 回复 引用 0
        • J
          Jason_Duan
          最后由 Jason_Duan 编辑

          哎,视频没看完,后边有解决办法,
          改成这样就行了:

          rclpy.time.Duration(seconds=1),  # 超时时间
          
          1 条回复 最后回复 回复 引用 0
          • 第一个帖子
            最后一个帖子
          皖ICP备16016415号-7
          Powered by NodeBB | 鱼香ROS