You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用rospy与RosAria控制Pioneer P3-AT时遇AttributeError问题求助

解决rospy发布Twist指令时的AttributeError问题

嘿,这个问题我之前也踩过坑!核心原因是你没有正确创建geometry_msgs/Twist消息对象,直接把列表传给了publish()方法,导致ROS的消息序列化代码找不到需要的.x/.y/.z属性。

错误原因拆解

你在终端里用rostopic pub的时候,传入的'{linear: {x: 0.9, y: 0.0}, angular: {x: 0.0...}}'是YAML格式的消息描述,rostopic工具会自动把它解析成标准的Twist消息对象再发布。但在Python脚本里,你必须手动创建这个对象——ROS不会自动把列表/数组转换成消息对象,所以当你传linear和angular这两个列表时,序列化代码尝试访问list.x,自然会抛出AttributeError。

修正后的代码示例

你需要先实例化Twist对象,再给它的属性赋值,最后发布这个对象:

import rospy
from geometry_msgs.msg import Twist

# 第一步:必须初始化ROS节点(你原来的代码漏掉了这个!)
rospy.init_node('pioneer_control_node', anonymous=True)

# 创建发布者
cmd_vel_pub = rospy.Publisher('/RosAria/cmd_vel', Twist, queue_size=10)

# 创建Twist消息对象并赋值
cmd_vel = Twist()
# 设置线速度:P3-AT是差分驱动,只有x方向有效
cmd_vel.linear.x = 0.9
# 设置角速度:只有z方向(原地转弯)有效
cmd_vel.angular.z = 0.0

# 等待订阅者连接
rospy.sleep(1)

# 发布消息(传入Twist对象,不是列表!)
cmd_vel_pub.publish(cmd_vel)

# 如果需要持续发布,可以加个循环
# rate = rospy.Rate(10)  # 10Hz
# while not rospy.is_shutdown():
#     cmd_vel_pub.publish(cmd_vel)
#     rate.sleep()

额外注意事项

  • 一定要调用rospy.init_node():没有初始化节点的话,发布者无法正常注册到ROS系统里,即使不报错也可能发不出消息。
  • 差分驱动机器人的特性:P3-AT是差分底盘,只有linear.x(前进/后退)和angular.z(左转/右转)这两个属性是有效的,其他轴的速度会被忽略,所以可以不用特意赋值为0(默认就是0)。
  • 简化赋值:如果你只需要设置x方向线速度,可以只写cmd_vel.linear.x = 0.9,其他属性保持默认值即可。

内容的提问来源于stack exchange,提问作者user9250697

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:34