前提・実現したいこと
ROSの環境下かつPythonでARDroneをコントローラー制御をするプログラムを作成しています。
発生している問題・エラーメッセージ
pitch,roll,yaw,thrust = self.move_controller() TypeError: 'NoneType' object is not iterable line 60,78のエラーです。
該当のソースコード
Python
1#!/usr/bin/env python 2import rospy 3from std_msgs.msg import Empty 4from sensor_msgs.msg import Joy 5from geometry_msgs.msg import Twist, Vector3 6from ardrone_autonomy.msg import Navdata 7from std_msgs.msg import Int32, Float32 8import time 9from threading import Thread 10 11a=b=x=y=lstick_lr=lstick_fb=rstick_lr=rstick_fb=0 12pitch=roll=yaw=thrust=0 13 14class controll(object): 15 def __init__(self): 16 self._joy_sub = rospy.Subscriber('joy',Joy,self.joy_callback, queue_size=1) 17 self.pub_takeoff = rospy.Publisher('/ardrone/takeoff', Empty) 18 self.pub_land = rospy.Publisher('/ardrone/land', Empty) 19 self.pub_reset = rospy.Publisher('/ardrone/reset', Empty) 20 self.pub_velocity = rospy.Publisher('/cmd_vel', Twist,queue_size=1) 21 self.pub_check = rospy.Publisher('check',Int32 ,queue_size=1) #for_rosbag 22 self.pub_check_mag = rospy.Publisher('check_mag',Int32 ,queue_size=1) 23 24 self.mag_sub = rospy.Subscriber("/ardrone/navdata/mag", Navdata, self.mag_callback) 25 26 def mag_callback(self, mag_msg): 27 global mag 28 mag = mag_msg.magY 29 30 def joy_callback(self, joy_msg): 31 global a,b,x,y,lstick_lr,lstick_fb,rstick_lr,rstick_fb 32 a = float(joy_msg.buttons[1]) 33 b = float(joy_msg.buttons[2]) 34 x = float(joy_msg.buttons[0]) 35 y = float(joy_msg.buttons[3]) 36 lb = float(joy_msg.buttons[4]) 37 rb = float(joy_msg.buttons[5]) 38 lt = float(joy_msg.buttons[6]) 39 rt = float(joy_msg.buttons[7]) 40 start = float(joy_msg.buttons[9]) 41 select = float(joy_msg.buttons[8]) 42 lstick_botton = float(joy_msg.buttons[10]) 43 rstick_botton = float(joy_msg.buttons[11]) 44 45 lstick_lr = float(joy_msg.axes[0]) #left_and_right//roll 46 lstick_fb = float(joy_msg.axes[1]) #front_and_back//pitch 47 rstick_lr = float(joy_msg.axes[2]) #rotation//yaw 48 rstick_fb = float(joy_msg.axes[3]) #up_and_down//thrust 49 plusbotton_lr = float(joy_msg.axes[4]) 50 plusbotton_fb = float(joy_msg.axes[5]) 51 52 def move_controller(self): 53 global roll,pitch,yaw,thrust 54 roll = lstick_lr 55 pitch = lstick_fb 56 thrust = rstick_fb 57 yaw = rstick_lr 58 return roll,pitch,yaw,thrust 59 60 def main(self): 61 print(y,Navdata) 62 self.move_controller() 63 self.pub_velocity.publish(Twist(Vector3(pitch,roll,thrust),Vector3(0,0,yaw))) 64 if a == 1: 65 self.pub_takeoff.publish(Empty()) 66 rospy.sleep(4.0) 67 self.pub_velocity.publish(Twist(Vector3(0,0,0),Vector3(0,0,0))) 68 elif b == 1: 69 self.pub_land.publish(Empty()) 70 self.pub_velocity.publish(Twist(Vector3(0,0,0),Vector3(0,0,0))) 71 elif x == 1: 72 self.pub_reset.publish(Empty()) 73 74if __name__ == '__main__': 75 76 rospy.init_node('moving_node', anonymous=True) 77 s = controll() 78 s.main() 79 #controll() 80 rospy.spin()
試したこと
コードをモジュール化しつつ、pitch=lstick_lrのように、代入したいです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
[投稿 2020/12/28 14:24に対する言及]
・インデントがぐちゃぐちゃで動くコードになっていませんし、
・エラーが出ている「pitch,roll,yaw,thrust = self.move_controller()」のコードが示されていないため、回答のしようがないと思います。
インデントを修正しました。
こちらが正しいインデントです。
def main(self)の一行下にエラーの対象になっているコードがあります。
ご指導のほどよろしくお願い申し上げます。
全角スペースで見た目をそろえても「インデントを修正」したことにはなりません。
あなたが実行できているソースをその環境からそのままをコピペしてください。
あと、joy_callback関数のコメントと、各関数の実装に齟齬があります。
joy_callback()関数の中で、
lstick_lr = float(joy_msg.axes[0]) #left_and_right//roll
lstick_fb = float(joy_msg.axes[1]) #front_and_back//pitch
rstick_lr = float(joy_msg.axes[2]) #rotation//yaw
rstick_fb = float(joy_msg.axes[3]) #up_and_down//thrust
となっている一方、
move_controller(self)関数の中では
global pitch,roll,yaw,thrust
pitch = lstick_lr
roll = lstick_fb
thrust = rstick_fb
yaw = rstick_lr
となっています。
つまり、たとえばjoy_callback()(物理ボタンを論理ボタンに割り当てる部分)では、
左ジョイスティックの左右は「ロール」のつもりになっているのに
move_controller()(論理ボタンを制御因子に割り当てる部分)では
左ジョイスティックの左右は「ピッチ」としています。
仮にエラーがなくなっても、質問者さんの「想定」(思い込み)と異なる動作になる可能性があります。
超能力者ではない限り、思い込みの部分までは正しく修正することはできません。
確認しなおしてください。