2013-04-26 77 views
0

我真的不能明白我在做什么错。我试图从另一个方法的值对象..这是我的代码如何从其它方法获得的值对象在Python

#!/usr/bin/env python 


class tracksendi(): 
    def __init__(self): 
     rospy.on_shutdown(self.shutdown) 

     rospy.Subscriber('robotis/servo_head_pan_joint', 
         Float64, self.posisi_ax12_pan) 
     rospy.Subscriber('robotis/servo_head_tilt_joint', 
         Float64, self.posisi_ax12_tilt) 
     rospy.Subscriber('robotis/servo_right_elbow_joint', 
         Float64, self.posisi_ax12_elbow) 

     while not rospy.is_shutdown(): 
      self.operasikan_servo() 
      rate.sleep() 

    def posisi_ax12_pan(self,pan): 
     self.posisi_pan_servo = pan.data 
     return 

    def posisi_ax12_tilt(self,tilt): 
     self.posisi_tilt_servo = tilt.data 
     return  

    def posisi_ax12_elbow(self,elbow): 
     self.posisi_elbow_data = elbow.data 
     return 

    def ambil_timestamp(self,waktu): 
     self.data_time_joint_states = waktu.header.stamp 
     return    

    def operasikan_servo(self): 
    # Lengan Kanan 
     try: 

      vektor_n_rs = self.posisi_pan_servo - self.posisi_tilt_servo 
      vektor_re_rs = self.posisi_tilt_servo - self.posisi_elbow_data 

     except KeyError: 
      pass 


if __name__ == '__main__': 
    try: 
     tracksendi() 
    except rospy.ROSInterruptException: 
     pass 

但是,我得到这个错误

vektor_n_rs = self.posisi_pan_servo - self.posisi_tilt_servo 

AttributeError: tracksendi instance has no attribute 'posisi_pan_servo' 

这个问题如何解决???

注:

rospy.Subscriber( 'robotis/servo_head_pan_joint',Float64,self.posisi_ax12_pan)

rospy.Subscriber( 'robotis/servo_head_tilt_joint',Float64,self.posisi_ax12_tilt)

rospy.Subscriber( 'robotis/servo_right_elbow_joint',Float64,self.posisi_ax12_elbow)

rospy.Subscriber是一个行命令插入用于self.posisi_ax12_pan方法,self.posisi_ax12_tilt方法和self.posisi_ Float64数据ax12_elbow。

回答

1

显然posisi_ax12_panposisi_ax12_tilt后来被称为比operasikan_servo(您订阅的事件发生后),这样,你应该初始化这个属性 - self.posisi_pan_servo和self.posisi_tilt_servo:

def __init__(self): 
     rospy.on_shutdown(self.shutdown) 
     self.posisi_pan_servo = 0 # or any number you want 
     self.posisi_tilt_servo = 0 # or any number you want 
     #.... 
0

错误说self.posisi_pan_servo不存在。您似乎只能在posisi_ax12_pan()中定义此变量。这意味着当您尝试访问operasikan_servo()中的该属性时,尚未调用方法posisi_ax12_pan()

0

我想在调用operasikan_servo的构造函数之前应该调用posisi_ax12_*方法。

0

看起来你是不是执行方法posisi_pan_servo,其初始化属性“posisi_pan_servo”

你应该之前执行它,试图获得该属性。

也许在init方法你应该调用该方法。因此,尝试从改变:

rospy.Subscriber('robotis/servo_head_pan_joint', Float64, self.posisi_ax12_pan) 

要:

rospy.Subscriber('robotis/servo_head_pan_joint', Float64, self.posisi_ax12_pan(pan)) 

在调用传递一个正确的参数。

但是另一件事是深入测试rospy.Subscriber方法,以检查它是否按照您的预期工作