2014-11-10 3 views
-1

Я делал один онлайн-курс, где на странице был специальный фрейм для запуска скрипта python. Моя задача в этом упражнении состояла в том, чтобы вычислить одометрию, даны скорости.Newbie python script, odometry

Этот скрипт на странице выглядит: http://snag.gy/NTJGz.jpg

Теперь я хотел бы сделать то же самое с помощью РОС: есть почти то же самое упражнение, но в ROS:

ясный код выглядит: https://github.com/tum-vision/autonavx_ardrone/blob/master/ardrone_python/src/example1_odometry.py

Есть информация, что я должен добавить код из этой версии online_course для функции обратного вызова, я пытаюсь, но это не работает.

Мой код:

#!/usr/bin/env python 

#ROS 
import rospy 
import roslib; roslib.load_manifest('ardrone_python') 
from ardrone_autonomy.msg import Navdata 
import numpy as np 

def __init__(self): 
    self.position = np.array([[0], [0]]) 


def rotation_to_world(self, yaw): 
     from math import cos, sin 
     return np.array([[cos(yaw), -sin(yaw)], [sin(yaw), cos(yaw)]]) 


def callback(self, t, dt, navdata): 
     self.position = self.position + dt * np.dot(self.rotation_to_world(navdata.rotZ), np.array([[navdata.vx], [navdata.vy]]))  
     print("received odometry message: vx=%f vy=%f z=%f yaw=%f"%(navdata.vx,navdata.vy,navdata.altd,navdata.rotZ)) 
     print(self.position) 


if __name__ == '__main__': 
    rospy.init_node('example_node', anonymous=True) 

    # subscribe to navdata (receive from quadrotor) 
    rospy.Subscriber("/ardrone/navdata", Navdata, callback(self, t, dt, navdata)) 

    rospy.spin() 

Пожалуйста, поправьте меня, я полностью новичок в Python.

Теперь я получил сообщение:

Traceback (most recent call last): File "./example1_odometry.py", line 28, in rospy.Subscriber("/ardrone/navdata", Navdata, callback(self, t, dt, navdata)) NameError: name 'self' is not defined

+0

Это класс, который вы пишете (я думаю, это так)? Если да, тогда поместите весь свой код в раздел 'def myclass:'. – ha9u63ar

+1

@hagubear вы имеете в виду 'класс MyClass:', правильно? – jonrsharpe

+0

@jonrsharpe да я! Спасибо что подметил это. извините, пытаясь переключить мой мозг с одного языка на другой. – ha9u63ar

ответ

0

Прямой ошибку вы писали:

Traceback (most recent call last): File "./example1_odometry.py", line 28, in rospy.Subscriber("/ardrone/navdata", Navdata, callback(self, t, dt, navdata)) NameError: name 'self' is not defined 

потому, что в строке:

rospy.Subscriber("/ardrone/navdata", Navdata, callback(self, t, dt, navdata)) 

self не определен. Возможно, вы имеете в виду rospy?

+0

Я не понимаю, почему это * undefined, выше у меня есть self.position ... – Misiek777

+0

в вышеперечисленных функциях, 'self' передается как параметр. – pjz

+0

Да, поэтому я должен удалить его? Я использую это в обратном вызове. Извините за мои низкие навыки питона. :( – Misiek777

1

Просто опустите аргумент «я», он не нужен. Попробуйте следующую строку:

rospy.Subscriber("/ardrone/navdata", Navdata, callback(t, dt, navdata)) 

Ошибки вы получили потому, что само это поле члена класса (по аналогии с этим указателем в Java или C++), поэтому не имеет смысла для ее решения в своей основной функции.

Смежные вопросы