質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

673閲覧

Pythonのモジュール化した際の関数の呼び出しおよび代入がわからない

haruking1128

総合スコア0

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/28 05:24

編集2020/12/28 10:18

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/28 05:29

[投稿 2020/12/28 14:24に対する言及] ・インデントがぐちゃぐちゃで動くコードになっていませんし、 ・エラーが出ている「pitch,roll,yaw,thrust = self.move_controller()」のコードが示されていないため、回答のしようがないと思います。
haruking1128

2020/12/28 05:38

インデントを修正しました。 こちらが正しいインデントです。 def main(self)の一行下にエラーの対象になっているコードがあります。 ご指導のほどよろしくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2020/12/28 06:52 編集

全角スペースで見た目をそろえても「インデントを修正」したことにはなりません。 あなたが実行できているソースをその環境からそのままをコピペしてください。 あと、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()(論理ボタンを制御因子に割り当てる部分)では 左ジョイスティックの左右は「ピッチ」としています。 仮にエラーがなくなっても、質問者さんの「想定」(思い込み)と異なる動作になる可能性があります。 超能力者ではない限り、思い込みの部分までは正しく修正することはできません。 確認しなおしてください。
guest

回答2

0

とりあえず、move_controllerの最後の行に一行追加して、動くかどうか確認してください。

python

1 def move_controller(self): 2   global pitch,roll,yaw,thrust 3   pitch = lstick_lr 4   roll = lstick_fb 5   thrust = rstick_fb 6   yaw = rstick_lr 7 return pitch,roll,yaw,thrust 8

投稿2020/12/28 08:15

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

def move_controller(self):

このメソッドの返り値がないために、このエラーが出てますね。
これをどうしたいということでしょうか

投稿2020/12/28 05:44

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruking1128

2020/12/28 05:51

やりたいことは、コントローラーの値をpitch,roll,thrust,yawに代入したいです。 なお、コントローラーとPIDでの計算値を場合によって使い分けたいです。 そのため、一度move_controllerといった関数をおいて、使い分けられるようにしたいです。
y_waiwai

2020/12/28 05:58

なんかグローバル変数を使用するようになってるので、 そこの行で代入しないようにしとけばいいんでは。 self.move_controller() ってだけでいいのでは。
haruking1128

2020/12/28 06:06

コンパイルは通りました。 ただし、動作が想定とは異なります。 8行目のa=b=x=の部分は必要な文章なのでしょうか。 他に書き方など、ありますでしょうか。
y_waiwai

2020/12/28 07:19

あなたがどういう想定のもとにそのコードを書いたのか不明なのでなんとも言えませんね その8行目のコードも、一度削除して実行してみれば必要なものかどうかがわかると思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問