紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
Time()报错,提示参数给多了,但明明就只给了一个呀
-
按照小鱼教程https://www.bilibili.com/video/BV1CSszeuEH3?spm_id_from=333.788.player.switch&vd_source=142d1856361148473fecdd6ec38cb7bc的内容写的,
环境:
win11+wsl2+ros2+humbletf_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), # 超时时间
-
在你的代码中,问题出现在对
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
方法,这是更标准和推荐的方式。
以上为生成回答,仅供参考~
-
哎,视频没看完,后边有解决办法,
改成这样就行了:rclpy.time.Duration(seconds=1), # 超时时间