2016-05-14 87 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

請注意,'運行'工作一次;這是第二次遇到不同的「熊」(和「頭」)。我會試圖擺脫這種'globals'方法來保存狀態。將狀態保存爲類對象的屬性更好。但我不確定這將如何與'rosby'調用相配合。 – hpaulj

回答

8

不能爲一個函數和一個浮動(在同一個命名空間)使用相同的變量名。並且你們都定義了一個bear函數和一個bear變量指向一個浮點數。你需要改變這兩個名字中的一個。

+1

謝謝!它做到了。 –

1

錯,很錯!!! :)

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

儘管我完全同意這一點,但我不知道這個答案是否清楚地回答了OP的問題。 – cpburnz

+0

它本身可能不是原因。你可以在沒有'global'的情況下得到這個錯誤。但是這些線條的並列指向使用標識符「bear」的一些有趣的事情。也許程序員習慣於在不同的命名空間中保存變量和函數的語言。過度使用'全球'是一個常見的菜鳥錯誤, – hpaulj