2016-05-14 29 views
2

なぜこのエラーが出るのか分かりません。どんな助けもありがとう。TypeError: 'numpy.float64'オブジェクトは呼び出し可能ではありませんか?

このコードは、小さな全地形車両の基本的な自律航法用です。何らかの理由で、見出しとベアリングの計算関数に巻き込まれてしまいます。私は、実行関数のどちらかを最初に置こうとしましたが、同じことをします。

私はかなりPythonに慣れていないので、私は見落としている可能性が高いです。

#!/usr/bin/env python 

import rospy 
from geometry_msgs.msg import Twist 
from geometry_msgs.msg import Vector3Stamped 
from geometry_msgs.msg import Vector3 
from math import radians 
from sensor_msgs.msg import NavSatFix 
import time 
import numpy 

lat = 0.0 
lon = 0.0 
x = 0.0 
y = 0.0 
z = 0.0 
head = 0.0 
bear = 0.0 


########################################################### 
destLat = 30.210406 
#         Destination 
destLon = -92.022914 
############################################################ 


class sub(): 

    def __init__(self): 
     rospy.init_node('Test1', anonymous=False) 
     rospy.Subscriber("/imu_um6/mag", Vector3Stamped, self.call_1) 
     rospy.Subscriber("/gps/fix", NavSatFix, self.call_2) 

    def call_1(self, mag): 
     global x 
     global y 
     global z 
     x = mag.vector.x 
     y= mag.vector.y 
     z= mag.vector.z 

    def call_2(self, gps): 
     global lat 
     global lon 

     lat = gps.latitude 
     lon = gps.longitude 

def head(lat, lon): 
    global head 
    # Define heading here 
    head = numpy.rad2deg(numpy.arctan2(z, y)) + 90 
    print(head) 


def bear(y,z): 
    global bear 
    # Define bearing Here 
    dLon = destLon - lon 
    vert = numpy.sin(dLon) * numpy.cos(destLat) 
    horiz = numpy.cos(lat)*numpy.sin(destLat) - numpy.sin(lat)*numpy.cos(destLat)*numpy.cos(dLon) 
    bear = (numpy.rad2deg(numpy.arctan2(vert, horiz)) + 360) % 360 
    print(bear) 


def nav(head, bear, destLat, destLon): 
    # Do Navigation Here 
    pub = rospy.Publisher('/husky_velocity_controller/cmd_vel', Twist, queue_size=10) 
    move_cmd = Twist() 
    turn_cmd = Twist() 

    move_cmd.linear.x = 2 
    turn_cmd.angular.z = radians(45) 

    turn_angle = head - bear 
# Prettify the angle 
    if (turn_angle > 180): 
     turn_angle -= 360 
    elif (turn_angle < -180): 
     turn_angle += 360 
    else: 
     turn_angle = turn_angle 

    if (abs(lat-destLat)<.0005 and abs(lon-destLon)<.0005): 
     pub.publish(Twist()) 
     r.sleep() 
    else: 
     if (abs(turn_angle) < 8): 
      pub.publish(move_cmd) 
      rospy.spin() 
     else: 
      pub.publish(turn_cmd) 
      r = rospy.Rate(5); 
      r.sleep() 



def shutdown(self): 
    rospy.loginfo("Stop Husky") 
    cmd_vel.publish(Twist()) 
    rospy.sleep(1) 


def run(): 
    sub() 
    bear(y,z) 
    head(lat,lon) 
    nav(head, bear, destLat, destLon) 
    print('here') 



if __name__ == '__main__': 
    try: 
     while not rospy.is_shutdown(): 
      run() 
    except rospy.ROSInterruptException: 
     rospy.loginfo("stopped") 
     pass 

ここで全体の出力です:

163.11651134 
90.0 
here 
Traceback (most recent call last): 
    File "classTest.py", line 117, in <module> 
    run() 
    File "classTest.py", line 107, in run 
    bear(y,z) 
TypeError: 'numpy.float64' object is not callable 

ありがとうございますが、機能して(同じ名前空間で)フロートに同じ変数名を使用することはできません

+0

「実行」は1回限り動作します。それは別の「熊」(そして「頭」)に出くわす2番目の呼び出しです。私は国家を救うためのこの「グローバル」アプローチを取り除こうとします。クラスオブジェクトの属性として状態を保存する方が良いです。しかし、私はそれが 'rosby'呼び出しでどのように動作するのか分かりません。 – hpaulj

答えて

8

。そして、あなたは両方ともbear関数とfloatを指す変数bearを定義しました。 2つの名前のいずれかを変更する必要があります。

+1

ありがとう!それはそれをしました。 –

1

間違っています! :)

def bear(y,z): 
    global bear 
    .... 
+1

私はこれに完全に同意しますが、この回答がOPの質問に明確に答えるかどうかはわかりません。 – cpburnz

+0

それ自体はおそらく原因ではありません。あなたは 'global'なしでこのエラーを得ることができます。しかし、これらの行が並置されていることは、識別子「クマ」を使用すると面白いビジネスを指しています。たぶんプログラマーは、異なる名前空間に変数と関数を保持する言語に慣れているかもしれません。また、「グローバル」の過度の使用は、ルーキーの共通のミスであり、 – hpaulj

関連する問題