0

私は自分が間違っていることを本当に理解できません..別のメソッドから値オブジェクトを取得しようとしています..これは私のコードです

#!/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.possi_ax12_pan)

rospy.Subscriber('robotis/servo_head_tilt_joint', Float64, self.possi_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_ax12_elbow の Float64 データを挿入するライン コマンドです。

4

4 に答える 4

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
        #....
于 2013-04-26T07:25:13.377 に答える
0

'posisi_pan_servo' 属性を初期化するメソッド possi_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 メソッドを深くテストして、期待どおりに機能しているかどうかを確認することです

于 2013-04-26T07:28:18.760 に答える
0

self.posisi_pan_servo存在しないというエラーが表示されます。この変数は でのみ定義しているようですposisi_ax12_pan()。これは、 内でその属性にアクセスしようとしたときに、メソッドposisi_ax12_pan()がまだ呼び出されていないことを意味しますoperasikan_servo()

于 2013-04-26T07:26:24.587 に答える
0

posisi_ax12_*メソッドの呼び出しoperasikan_servoは、コンストラクターを呼び出す前に行う必要があると思います。

于 2013-04-26T07:27:41.917 に答える