LoginSignup
2
1

More than 1 year has passed since last update.

ROSの勉強 第13弾:Teleop-bot ~ key driver ~

Last updated at Posted at 2021-02-23

#プログラミング 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(配信者)である.

ソースコード
key_publisher.py
#! /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)	#コンソールを標準モードに戻してからプログラムを抜ける必要がある
実行様子

キャプチャ.PNG

感想

今回は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 著
                       河田 卓志 監訳
            松田 晃一,福地 正樹,由谷 哲夫 訳
                  オイラリー・ジャパン 発行

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1