使用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
相关产品推荐
相关产品推荐

