#プログラミング ROS< key driver>
はじめに
1つの参考書に沿って,ROS(Robot Operating System)を難なく扱えるようになることが目的である.その第13弾として,key driverを扱う.
環境
仮想環境
ソフト | VMware Workstation 15 |
実装RAM | 2 GB |
OS | Ubuntu 64 ビット |
isoファイル | ubuntu-mate-20.04.1-desktop-amd64.iso |
コンピュータ
デバイス | MSI |
プロセッサ | Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz |
実装RAM | 8.00 GB (7.89 GB 使用可能) |
OS | Windows (Windows 10 Home, バージョン:1909) |
ROS
Distribution | noetic |
プログラミング言語 | Python 3.8.5 |
ロボットの操作
遠隔操作や自律システムなどがあるが,遠隔操作のほうが簡単であるため遠隔操作の学習から始める.ここで扱う遠隔操作はキー入力を用いるTeleop-botというものである.
Teleop-botの速度コマンド
ロボットを操作するにあたって,速度コマンドをロボットに伝えなければならない.そのために2つのプログラムにより構成する.
<プログラム①>
キー入力を受け取り,それをメッセージとして配信する
<プログラム②>
①のメッセージを受け取り,レスポンスとしてTwist
メッセージを出す
★ROSでのヒント
小さなROSノードの集まりを作る
ソフトウェアテストの作成を簡単にしてくれる
⇒1つ1つのノードはなるべく小さくする
実装
今回はプログラム①,すなわちkey driverの実装を行う.以下にソースコードとそのときの実行の様子を示す.ここでいうkey driverとは,key入力のPublisher(配信者)である.
ソースコード
#! /usr/bin/env python3
import sys, select, tty, termios #ターミナルでの作業に必要なPythonのライブラリ
import rospy
from std_msgs.msg import String #文字列を扱うメッセージ
if __name__ == '__main__':
key_pub = rospy.Publisher('keys', String, queue_size = 1) #トピック配信の準備
rospy.init_node("keyboard_driver") #ノードの初期化
rate = rospy.Rate(100) #100Hz(0.01s)
old_attr = termios.tcgetattr(sys.stdin) #現在のコンソール設定を保存
tty.setcbreak(sys.stdin.fileno()) #この2行により,ユーザがキーを押したときにすぐに標準入力として受け取れるようになった
print("Publishing keystrokes. Press Ctrl-C to exit ...")
while not rospy.is_shutdown():
"""selectはすぐにリターンする.また0秒でタイムアウトするように設定している"""
if select.select([sys.stdin], [], [], 0)[0] == [sys.stdin]:
key_pub.publish(sys.stdin.read(1)) #読み込んだものをStringとして配信
rate.sleep()
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_attr) #コンソールを標準モードに戻してからプログラムを抜ける必要がある
実行様子
感想
今回はTeleop-botの導入として,キー入力を即座に配信してくれるものを作成した.これは基本的なもので1文字ずつしか取り出せず,矢印キーのような特殊文字については別々に配信してしまう.もしそのような特殊文字を使うときには少し工夫が必要になってくる.なお,Telop-botでは特殊文字のキーは用いないため今回のもので十分であると思われる.
(2022/12/29:追記)
1文字ずつしか取り出せないと書いていたが,改めて追記しておく.
sys.stdin.read(1)
このとき引数に1としているため,1文字しか取り出せない.
この引数が読み取る文字数を設定する.つまり,任意の文字数にすることも可能である.
ちなみに引数に何も渡さない場合,入力を全て1つの文字列として取得する.
<参考>
参考文献
プログラミングROS Pythonによるロボットアプリケーション開発
Morgan Quigley, Brian Gerkey, William D.Smart 著
河田 卓志 監訳
松田 晃一,福地 正樹,由谷 哲夫 訳
オイラリー・ジャパン 発行