Classを使用した書き方 (Python,ROS)
今日のメモ書きはPythonでClassを用いてのrosのコードの書き方に関してです。
まずはPythonのClassに関して。
Classはいわゆるオブジェクト指向と呼ばれるものの考え方です。イメージとしては、人の体を想像すると分かりやすいです。例えば、ひろしさんには心臓、胃、肝臓など様々な働きをする臓器があります。 これをClassに当てはめると、ひろしというClassの中に、心臓、胃、肝臓、などの臓器の関数を作り、それぞれにその中に働き内容書きます。
Class ひろし():
def 心臓(self):
心臓の処理
def 胃(self):
胃の処理
具体的に書くと上に記述した形になります。
ここで1つポイントは関数の引数にselfがある事です。Classの引数にはselfは必ず入れます。
Classを使う大きなメリットとしては、大きく2つあります。
1つ目は、複数の関数を1つの塊として整理でき、自由に呼び出せることです。例えば、実行する場所で心臓の動作だけ使いたい場合は、そのように書けばできます。
書き方のルールは .
○=ひろし( )
〇.心臓()
で実行はできます。
2つ目のメリットは、同じ変数をClass内の関数で跨って使えることです。ここでselfがポイントになります。
def 心臓(self):
self.血液=
def 胃(self):
self.血液=
と血液の変数にselfを付ければ、同じ変数の使用も可能です。 普通の関数でグローバル関数を使えばいいじゃんと言う意見もあると思いますが、プログラムの規模が大きくなった場合、どこでどのグローバル変数を使っているかなど分かりにくくなるため、コードを整理するという意味でもこのような書き方ができるClassは非常に有効です。
では、ROSでの書き方に入ります。基本のクラスの書き方は同じです。 データのパブリッシュ処理はwhile not なんちゃら の中に書き、実行されているうちはずっと繰り返すようにします。詳しい
Class robot():
………
def run(self):
while not なんちゃら
pub.publish(○○)
if ○○○
robot1=robot()
robot.run()
このように実行する場所のif内に、先程説明した書き方でClassのrunを実行するとメッセージをずっと送れます。 Classの最初の関数はdef init みたいな感じで書くのですが省略します。
もしロボットだったら速度をパブリッシュして、レーザーセンサーの値によって、0になる条件も作りたいと時があると思います。
その時はdef でストップの関数を作り、ずっと回っているwhile内で、robot.ストップと書けば、速度を0にする処理を後付けで加えれます。