2013-04-26 163 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方法,以檢查它是否按照您的預期工作