Quantcast
Channel: demura.net
Viewing all 757 articles
Browse latest View live

ロボット自身の音声を認識しない方法

$
0
0

クラウドなどの音声認識サーバーが常に機能している場合、ロボット自身の発話も音声認識されてしまい人との会話がうまくいかない場合があります。それを回避するためには、自身が発話しているときにはロボットのマイクをOFFにし、話し終わったらマイクをONにします。pythonのプログラム例を次のとおり。

環境

  • Ubuntu16.04
  • Python 2.7

コード

def speak(self, sentence, sleep_time=3):
import subprocess

# 自分の声を音声認識しないように認識機能をstopする
cmd = "/usr/bin/amixer set Capture toggle"
subprocess.call(cmd.strip().split(" "))

# 下のような発話するコードを書く
self.tts_pub.publish(sentence)

# 音声認識機能を再開する
subprocess.call(cmd.strip().split(" "))

RoboCup: Kobukiに緊急停止スイッチをつける

$
0
0

Kobukiに緊急停止スイッチをつけたときのメモ。本体を分解しないでつくばチャレンジではソフトウェアスイッチは禁止されているが、RoboCup@Homeでは禁止ではない。特に、RoboCup@Home Educationでは多くのチームがKobukiを使っており、Kobikiでは緊急停止スイッチのことは考えられていない。多くのチームはKobuki上部のコネクタIOピンを使いソフトウェア的に緊急停止スイッチをつけていると思うが、安全教育上よろしくないので本体を分解して物理的に取り付けた。
なお、本体を分解せずに緊急停止スイッチを取り付ける方法としては、バッテリの線を切ってスイッチを挿入する方法があるが、緊急停止スイッチ用の配線がKobukiの外側を通るので何かにひっかかる可能性があること、見た目が悪いこと、スイッチが押されていると充電できないという問題がある。

  • Kobukiを裏返し、白丸で囲ってある部分のネジをドライバで外す。なお、写真右横の穴にはシールが貼られているのでそれを取らなければ分解できない。
  • バンパーの取り外しは、ネジ隠しの細長いプラスチックパーツ(写真下部分)をひっぱって取る。ネジが見えるので取る。写真では2箇所しな見えないが、左右の部分にもネジがついているので外す。

  • バンパーを外した様子。

  • これで上部分を外すことができる。ただし、下写真の白丸で示す4箇所がコネクタでつながっているので注意深く外す必要あり。特に、写真左の小さなコネクタについているケーブルは切れやすいので特に注意すること。

  • コネクタを外すと中央に基板、右下に電源スイッチが見える。緊急停止スイッチは、電源スイッチから伸びている黄色ケーブルを切って、それと電源スイッチのコネクタの間につける。
  • 下写真のAからBが緊急停止スイッチ用の配線。今回は保守整備がしやすいように緊急停止スイッチ用のコネクタを本体につけた。ドリルで穴を開けて、ネジを切りコネクタを取り付けた。

  • 分解した逆の手順でKobukiを組み立てる。コネクタはKobukiの右手前に取り付けた。

  • 緊急停止スイッチをロボットの上に取り付けた。スイッチには照光式のものを使ったのでLED用に別電源12VをKobukiの上部コネクタから取った。電源スイッチの後に直列に緊急停止スイッチをつけたので、電源と連動しており、電源の切れ忘れしずらいのでお薦め。

  • HappyRobotに取り付けた様子。なかなか決まっていると思う。ただ、Kobuki前部の外装をなんとかせねば。。。

終わり

ROS: mask_rcnn_rosのインストール

$
0
0

mask_rcnn_rosをインストールしたときのメモ。

  • 環境
    • Ubunutu16.04
    • ROS Kinetic
  • 次のサイトからgit cloneする
  • Pythonの仮想環境virtualenvを使う。ライブラリバージョンの依存関係が強いのでvirtualenvを使うと便利。なお、サイトではpython3でないと動かないとあるが、ROS Kineticはpython2推奨なのでpython2でインストールする。学習などはROSパッケージではないmask_rcnnを使う。
    • インストール
      • sudo pip2 install virtualenv
      • sudo pip2 install virtualenvwrapper
    • 環境設定
      • ~/.bashrcに以下を追加
        • export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2
        • export WORKON_HOME=~/.virtualenvs
        • source /usr/local/bin/virtualenvwrapper.sh
    • 仮想環境の生成
      • $ venv_name=mrcnn
      • $ mkvirtualenv --python=python2 $venv_name
    • 依存関係のインストール
      • $ cd ~/catkin_ws/src/mask_rcnn_ros
      • $ workon mrcnn
        • 仮想環境に入るとプロンプトの前に(mrcnn)と表示する
      • (mrcnn) $ pip install -r requirements.txt
      • 仮想環境から抜ける
        • (mrcnn) $ deactivate
  • パッケージのダウンロード
    • $ cd ~/catkin_ws/src/mask_rcnn_ros
    • $ git submodule update --init
  • ビルド
    • $ catkin build mask_rcnn_ros
  • 実行
    • $ workon mrcnn
    • Publisherとしてノード実行
      • (mrcnn) $ roslaunch object_detector object_detector.launch image:=<image_topic_name> is_service:=false debug:=true
    • Serviceとしてノード実行
      • (mrcnn) $ roslaunch object_detector object_detector.launch image:=<image_topic_name> is_service:=true debug:=false
    • roslaunchの引数
      • image: 画像トピック名
      • is_service: サービスのときはtrue、それ以外はfalse
      • debug: trueにするとデバッグ用に画像がopencvのcv.imshow()で表示される。
      • detection_threshold: 検出の閾値 [0, 1]
      • model: kerasモデルファイルのパス. モデルの拡張子はh5。
      • class_labels: クラス名とラベルがマッピングされたテキストファイル

以上

PD実践:LEGO Mindstorms EV3 開発環境のインストール

$
0
0
本講義では、金沢工業大学基礎実技教育課程の西川教授から強力なサポートを受けてETロボコンをロボティクス学科向けにアレンジしたロボコンをテーマとして、組込みプログラミングの基礎を楽しく学びます。なお、ノートパソコンのOSはWindowsに限定します。なお、以下の方法は西川教授の資料と以下のサイトを参考にしています。
  • 参考サイト
  • 開発環境(cygwin)のインストール(以下の補足説明は重要)インストール作業で使用するウェブブラウザはGoogle Chromeを必ず使うこと。インターネットエクスプローラーでは失敗します。
      • CygwinはWindows上でUNIXのような環境を提供するもので、UNIXのコマンドが使えます。
    • 1. Cygwin Setup (セットアップ): ここをクリックして64-bit版Cygwinのインストーラをダウンロードする。ダウンロードしたインストーラsetup-x86_64.exeをダブルクリックして起動する。
      • ダブルクリックすると「Cygwin Setup」ウインドウが開くので「次へ(N)」をクリックする。
    • 2. Choose A Download Source (インストール方法の選択):Install from Internetを選択し、「次へ(N)」をクリックする。
    • 3. Select Root Install Directory (ルートインストールディレクトリの選択):デフォルト(標準)でRoot Directoryが”C:\cygwin64″、Install Forが”All Users (RECOMMENDED)になっているので、そのまま「次へ(N)」をクリックする。
    • 4. Select Local Package Directory (ローカルパッケージディレクトリの選択):ダウンロードしたパッケージを置くディレクトリを設定する。Local Package Directoryを「C:\Users\ユーザー名\Downloads」にして「次へ(N)」をクリックする。
      Downloadsディレクトリがない場合は、”Directory … does not exist, would you like me to create it?”と聞かれるので「はい(Y)」をクリックする。
    • 5. Select Your Internet Connection (インターネット接続の選択):学内LANではUse HTTP/FTP Proxyにチェックを入れる。Proxy Host、Portは次のとおり。なお、Proxyの設定はウェブブラウザでも行うこと。学外の場合は、Direct Connectionを選択する。 
      • Proxy Host: wwwproxy.kanazawa-it.ac.jp
      • Port: 8080
    •  6. Choose A Download Site(ダウンロードサイトの選択): ダウンロードサイトはhttp://ftp.jaist.ac.jpを選び、「次へ(N)」をクリックする。
    • 7. Select Packages (パッケージの選択):EV3RTを使うためには次の4パッケージ(gcc-core, make, diffutils, perl)をインストールしなければならない。Searchにパッケージ名を入れてViewをCategoryにする。CategoryにDevelなどの名前が表示されるので、その左の「田」印をクリックするとパッケージがたくさん表示される。インストールするパッケージが見つかったら、Newの欄にある「 Skip」をクリックするとインストールするバージョンが表示される。
      •  同様にして4つのパッケージを全て選択してから最後に「次へ」をクリックする。gcc-core(バージョン4.9.0-1以降、本演習では7.4.0-1)
        • Category: Devel
        • make(バージョン4.0-2以降、本演習では4.2.1-2)
          Category:Devel
        • diffutils(バージョン3.3-2以降、本演習では3.5-2)
          Category: Utils
        • perl(バージョン5.22.1以降、本演習では5.26.3-2)
          Category: Perl
    • 8. Review and confirm changes (選択したパッケージの確認): 後でパッケージを詳しくチェックするので、以下のようなウインドウになっていれば良いので、「次へ(N)」をクリックする。

    • 9. Create Icons (アイコンの作成): Cygwinのインストールが完了ので、アイコンをデスクトップに生成し、スタートメニューに追加する。「完了」をクリックする。
    • 10. インストールのチェック:デスクトップにあるCygwin64 Terminalアイコンをダブルクリックして起動し、以下のコマンドを実行する。Cygwinのパッケージ情報が出力されるので、以下のバージョンと同じか新しいこととStatusがOKであることを確認する。違う場合は「7. Select Packages」の作業をやり直す。$はプロンプトなので入力しない。
      • $ cygcheck -c gcc-core make diffutils perl
    • 11. UNIXコマンドの説明:Cygwinインストール後の作業これからの作業で必要になるCygwinで使えるUNIXコマンドを説明します。
      • pwd:現在のディレクトリ位置を表示
      •  cd␣フォルダ名:ディレクトリを移動
      •  cd: ホームディレクトリに戻る
      •  ls: ファイルリストを表示
      •  ls␣-l: ファイルリストの詳細情報を表示
      • rm␣ファイル名: ファイルを削除(ディレクトリは削除不可)
      •  cp␣ファイル名1␣ファイル名2: ファイルのコピー
      •  mv␣ファイル名1␣ファイル名2: ファイルの移動
    •  12. 作業ディレクトリ(フォルダー)の作成:Cygwin64 Terminalで以下のコマンドを実行し、作業フォルダーを作成する。
      • $ mkdir /ev3rt
        • WindowsのフォルダはC:¥cygwin64¥ev3rtになる。
  • GCC ARMのインストール
    • GCC ARM(GNU Tools for ARM Embedded Processors)のインストーラをダウンロードする。
      • ​以下の確認済みバージョンのインストーラをダウンロードする。
      • ダウンロードしたインストーラをダブルクリックして起動する。Language Selectionウインドウが開くのでEnglishを選択して、「OK」をクリックする。

        以下のウインドウが開くので、「Yes」をクリックする。以下のウインドウが開くので、「Next」をクリックしてSetupを続ける。
    • License Agreement (ライセンス同意):ライセンスの確認になるので、”I accept the terms of the license agreement”にチェックを入れて、「Next」をクリックする。
    • Choose Destination Location (インストール先の選択): インストール先を聞かれるのでデフォルトのまま、「Next」をクリックする。
    • Start Copying Files (ファイルコピー開始):「Next」をクリックする。
    • Install wizard Complete (インストールの完了):  “Add path to environment variable”だけにチェックを入れて「Finish」をクリックする。他の項目にチェックを入れてはいけない。
    • インストールの確認: 新しくCygwin Terminalを起動して、以下のコマンドを打ち込みバージョンを確認する。
      • $ arm-none-eabi-gcc -v
      • この例では、gccのバージョンは4.8.4であることがわかる。
  •  U-Bootのmkimageのインストール:U-BootとはOSを起動するためのブートローダとよばれるプログラムであり、組み込み機器でよく使われている。以下のリンクからmkimageのバイナリをダウンロードする。mkimageはU-Boot用のフォーマットに変換するコマンド。なお、ダウンロードにはChromeを使うこと。Internet ExplorerやFireFoxを使うと余分な拡張子がついてこれからの作業がうまくいかないので注意。
      • ​http://www.trimslice.com/download/tools/Mkimage.tar.gz
      • ダウンロードした“Mkimage.tar.gz” を“作業フォルダー C:¥cygwin64¥ev3rt (cygwinでは/ev3rt)” にマウスを使ってコピペする。WindowsのC:¥cygwin64¥ev3rtフォルダはcygwin terminalでは/ev3rtとなる。
      • Cygwin Terminal を起動し、以下のコマンドを実行して“作業フォルダー(ev3rt)” に移動する。
        • $ cd /ev3rt
      • 下記のコマンドを使いMkimage.tar.gzを展開する。
        • $ tar xvzf Mkimage.tar.gz
      • 実行ファイルmkimage.exeを以下のコマンドでコピーする。
        • $ cp mkimage.exe  /usr/local/bin
  • 開発プラットフオームEV3RTのインストール
    • 参考サイト
    • パッケージバージョンβ7-3をダウンロードする。
    • ダウンロードしたEV3RTのパッケージ(ev3rt-beta7-3-release.zip) を解凍し、hrp2.tar.xzだけを“作業フォルダーC:¥cygwin64¥ev3rt (cygwinでは/ev3rt)の中にマウスを使ってコピペする。なお、hrp2.tar.xzはカーネルのソースコードが格納されている。
    • Cygwin Terminalを起動して以下のコマンドで作業フォルダー(/ev3rt)に移動する。
      • $ cd /ev3rt
    • 起動したCygwin Terminalで以下のコマンドを実行してhrp2.tar.xzを解凍する。
      • $ tar xvf hrp2.tar.xz
  • 以上で開発環境のインストールは終わりです。お疲れ様!

PD実践:授業概要

$
0
0
  • 本講義では、金沢工業大学基礎実技教育課程の西川教授から強力なサポートを受けてETロボコンをロボティクス学科向けにアレンジしたロボコンをテーマとして、組込みプログラミングの基礎を楽しく学びます。
    • 講義日:木曜日3,4限
    • 場所講義室:23号館221室
      • 演習室:コラボレーションスタジオ
      • 競技場:パフォ―ミングスタジオ
    • 成績個人点:50点小テスト5回各10点
      • チーム点:50点チーム技術資料:20点中間提出:5点、本提出:15点
        • プレゼンテーション(ポスター発表):20点中間提出:5点、本提出:15点
        • 競技成績:10点
    •  1週目(9/26):ガイダンス・開発環境のインストール担当教員、TA、SAの紹介(講義室)
      • 授業の概要説明(講義室)座席指定
        • 本資料の説明
        • ETロボコンの説明
      • PD実践:LEGO Mindstorms EV3 開発環境のインストール(出村;講義室)TA、SAは教材準備が終了したら講義室へ移動し、学生をサポートする。
    • 2週目(10/3):開発環境・LEGO組立演習演習の説明(全員:講義室)班の発表(1組、2組混合)
      • PD実践:プログラムのビルド・アップロード・実行(全員:演習室)
      • LEGO部品チェック
      • LEGO組立(全員:演習室)付属冊子の機体
      • 小テスト1(個人)
    • 3週目(10/10):センサ演習演習の説明(全員:講義室)
      • プログラミング演習センサ(全員:演習室)
      • 小テスト2(個人)
    • 4週目(10/24):センサ演習続き、モータ演習演習の説明(全員:講義室)
      • プログラミング演習(モータ)
      • 小テスト3(個人)
    • 5週目(10/31):モータ演習演習の説明(全員:講義室)
      • プログラミング演習(モータ演習2)
      • 小テスト4(個人)
    • 6週目(11/7):状態遷移図演習演習の説明(全員:講義室)
      • 状態遷移図演習
      • 小テスト5(個人)
    • 7週目(11/14):マルチタスク演習演習の説明(全員:講義室)
      • 状態遷移図演習
      • 競技1の説明
    • 8週目(11/21):競技準備
    • 9週(11/28):競技準備
    • 10週(12/5):競技1、チーム技術資料中間提出(チームレポート)
    • 11週(12/12):競技2説明(準備フォーミングスタジオ、競技場設置)
    • 12週(12/19):競技準備
    • 13週(1/9):トライアル(パフォーミングスタジオ、競技場設置)、プレゼン準備
    • 14週(1/16):競技会(パフォーミングスタジオ)
    • 15週(1/23):プレゼンテーション(ポスター発表)、チーム技術資料提出(チームレポート)、自己点検授業

WSL: Windows for Subsystem for Linuxのインストールと設定

$
0
0

仮想マシンを使わなくてWindows上でLinuxが使えるWindows for Subsystem for Linux (以下、WSLと表記)のインストールとメモ。しかもLinuxのバイナリがそのまま動く。Windows10のバージョンが1803だとROSのシミュレータGazeboでロボットが動作せず、授業では使用できなかった。バージョン1903は動作したという報告があったので試してみる。

  •  バージョンの確認
    • 「スタートメニュー→歯車アイコン(設定)→システム→バージョン情報」を確認しWindowsの1903以上なら良い。

      バージョンが低い場合は「スタートメニュー→歯車アイコン(設定)→更新とセキュリティ」から更新する。なお、更新作業は時間がかかり(私の環境では1時間程度かかった)、途中で作業を中断し電源を切れないので時間的に余裕がある場合に実施すること。
  • Windows Subsystem for Linuxの有効化
    • スタートメニュ→Windowsシステムツール→コントロールパネル→プログラム→プログラムと機能→Windowsの機能の有効化または無効化をクリックする。
    • Windows Subsystem for Linuxにチェックを入れ、「OK」をクリックする。
    • 再起動するように聞かれるので再起動する。
  • Ubuntuをストアからインストール
    • スタートメニューの検索窓に「store」と入力すると「Microsoft Store」と表示されるのでそれをクリックする。
  • 下記の画面になるので、Ubutu 16.04LTSを選択しクリックする。下の画面にならない場合は「検索」にUbuntuと入力する。
  • 次のウインドウになるので「入手」をクリックする。ダウンロードサイズは約200MB。
  • 入手が終わると次の画面になるので「起動」をクリックする。
  • 次のウインドウになるので少し待つ。
  • ユーザ名とパスワードを聞かれるので入力する。全角は使えないので半角英数字を使うこと。ユーザ名、パスワードは今後も使うので忘れないこと。
  • 時間帯の設定。標準では、日本の時間帯ではないので以下のコマンドを端末にコピペする。パスワードを聞かれるので入力する。なお、$はプロンプト(入力できる状態を示す記号)なのでコピペしない。
    • $ sudo dpkg-reconfigure tzdata
    • 次のウインドウになるので「Asia」を選択して、Tabキーを押して「OK」を選択してEnterキーを押す。
    • 「T」を押すとTaipeに飛ぶので、下矢印キーでTokyoを選択し、Enterキーを押す。
    • dateコマンドを端末に入力して正しい時間帯に(JST)なっていたら終わり。
  • ダウンロード先の変更。標準では海外からダウンロードするようになっているので、時短するために以下のコマンドを端末にコピペして実行し、国内に変更する。
    • $ sudo sed -i 's/\/archive\.ubuntu/\/jp\.archive\.ubuntu/' /etc/apt/sources.list
  • 次のコマンドでアップデートする。
    • $ sudo apt update
    • $ sudo apt upgrade -y
  • X Window システムのインストール。WSLはグラフィカルなインタフェース(GUI)が使えないので、ROSを動かすためにはX Windowシステムを別にインストールしなければならない。調べたらVcXsrvが無償で良さそうなのでインストールしてみる。以下のウェブサイトに行き、下図の赤で囲った「Download]をクリックする。2019年10月2日現在のバージョンは1.20.5.1。
    • https://sourceforge.net/projects/vcxsrv/
    • ダウンロードしたexeファイルをダブルクリックする。次のウインドウが開くので「Next」をクリックする。
    • インストールするフォルダーを聞かれるので、デフォルトのまま「Install」をクリックする。
    • セットアップが終わったら「Close」をクリックしてインストールを終了する。
  • X起動
    • デスクトップにできたXLaunchアイコンをダブルクリックする。
    • Select display settingsのウインドウになるのでデフォルトのまま「次へ(N)」をクリックする。
    • Select how to start clientのウインドウになるので、デフオルトのまま「次へ(N)」をクリックする。
    • Extra Settingsのウインドウになるので 以下の図のようにClipboard、Primary Selection、Disable access controlにチェックを入れ、Native openglのチェックを外して「次へ」をクリックする。
    • Finish configurationウインドウになるので、「Save configuration」をクリックして設定ファイルを保存してから「完了」をクリックする。
    • ファイアウォールなどを設定している場合は、次の図のように「Windowsセキュリティの重要な警告」というウインドウが開くので、「アクセスを許可する」をクリックする。
  • Ubuntuの設定
    • スタートメニュー→Ubuntu 16.04からUbuntuターミナルを起動する。
      デスクトップにショートカットを作っておくと便利。
    •  起動したターミナルで以下のコマンドを実行し、必要なパッケージをインストールする。なお、$はプロンプトなので入力しない。
      • $ sudo apt update
      • $ sudo apt upgrade
      • $ sudo apt-get install language-pack-ja -y
      • sudo update-locale LANG=ja_JP.UTF-8
      • $ sudo apt-get install git emacs gedit build-essential firefox dbus -y
    • 環境変数の設定
      • 自分のパソコン画面にLinuxのウインドウアプリケーションが表示されるように以下のコマンドを実行して環境変数を設定する。
        • $ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
        • $ source ~/.bashrc
  • ROS Kineticのインストール
    • 上のリンクに従ってインストール作業をしてから、以下の設定を行う。
    •  Gazeboを起動すると画面が真っ黒で何も表示されない。モデルが表示されるように以下のコマンドで環境変数を設定する。
      • $ echo ‘export GAZEBO_IP=127.0.0.1’ >> ~/.bashrc
      • $ source ~/.bashrc
    • Gazeboの起動
      • Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ gazebo
    • rvizでdbus関係のエラーを解決するためにmachine IDを設定する。Ubuntuターミナルを起動し、次のコマンドを実行する。
      • $ dbus-uuidgen | sudo tee /etc/machine-id
    • rvizの起動
      • Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ roscore
      • もう一つ、Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ rosrun  rviz  rviz

終わり

コンピュータ工学Ⅱ:ROS Kineticのインストール

$
0
0

私が担当している2019年度後学期開講の講義ロボットプログラミングⅡ用です.この記事はROS のオフィシャルウェブサイトの次の日本語記事を簡略化しています。詳しい説明は次のリンクをご覧ください。なお、学内のようなfirewall内の場合は、インストール方法が煩雑になるので、firewall外の自宅に戻ってからインストールすることをお勧めします。

———————————————————————————————-

以下の手順でROSをインストールしてください。Ubuntuをブートして、Firefoxを起動し、このページを開く。

1.準備

(1) 端末(ターミナル、terminal)を開いて、以下のコマンドをコピペして、Enterキーを押し実行する。パスワードを聞かれたら入力する。

  • sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

 (2)  同様にして以下のコマンドを実行して鍵情報を取得する。

  • 学外ネットワークの場合
    • sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
  • 学内ネットワークの場合
    • 学内のfirewall内ではコマンドが失敗するので、この作業だけ、学外のネットワークで実行するか、スマホのデザリング機能を使いネットワークに接続してから上のコマンドを実行するか、以下のように–keyserver-optionをつけて実行する。なお、プロキシサーバー名、ポート番号は情報処理サービスセンターで指定されているものを使う。
    • sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --keyserver-option http-proxy=http://プロキシサーバ―名:ポート番号 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

2. インストール

(0)  Proxyの設定

  • geditをすでにインストールしている場合は以下のviを作ってファイルを作成する必要はない。geditを使ってください。
  • $ cd
  • vi  .bashrc
  • .bashrcに以下を追加する。
  •  iキーを押して挿入モードにして以下を.bashrcの最後の行にコピペする。
    • export ftp_proxy="ftp://プロキシ―サーバー名:ポート番号/"
    • export http_proxy="http://プロキシ―サーバー名:ポート番号/"
    • export https_proxy="https://プロキシ―サーバー名:ポート番号/"
  • escキーを押して、挿入モードから抜ける。
  • : (コロン)キーを押す。
  • wキーを押したあとですぐqキーを押してenterキーを押すと保存できる。
  • 以下のコマンドを実行してコピペした部分が表示できれば成功。終了するときはqキーを押す。
    • $ less .bashrc
  • なお、このproxy設定をすると学外からはapt installができなくなります。それを避けるためには学内ネットワークに接続可能なVPNサービスを利用するか、.bashrcに挿入した3行に#を入れてコメント化してください。

 

(1)  以下のコマンドでパッケージをアップデートする。

  • $ sudo apt update

(2)  ROSのインストール

  • $ sudo apt install ros-kinetic-desktop-full

なお、sudo apt-get updateで次のように怒られる場合は、Ubuntuのネットワーク設定がうまくいっていない可能性があります。proxyを設定していない場合は、上の(0)Proxyの設定してください。
SnapCrab_NoName_2015-10-15_17-25-11_No-00

3. 初期設定

(1)  以下のコマンドでrosdepを初期化する。rosdepはシステム依存するソフトウェアをインストールするルール。1行目を入力したらEnterキーを押し、2行目を入力したらEnterキーを押す。rosdepはコンパイルを楽にするツール。なお、以下の作業だけはProxy環境下では失敗するので、スマホのデザリングや自宅など学外ネットワークで実施すること。

  • $ sudo rosdep init
  • $ rosdep update

(2) 環境設定。楽をするための設定。以下のコマンドを端末にコピペしてEnterキーを押す。1行ずつ実施すること。

  • $ cd
  • $ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
  • $ source ~/.bashrc

(3) rosinstall 。インストールが簡単になるツールを以下のコマンドでインストールする。

  • $ sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

終わり

ROS演習1-2019:タートル(亀)で遊ぼう!

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年度後学期開講講義ロボットプログラミングⅡ用です。Windows Subsystem for Linux(WSL)にROSをインストールしたので、動作確認を兼ねてタートル(亀)で遊んでみましょう。この記事は以下の記事を参考にしています。

—————————————————————

1. タートルを動かそう

(1) デスクトップにあるXLaunchアイコンをダブルクリックしてXサーバーを起動する。Xサーバーを起動しないと端末以外のウインドウが開きません。Xサーバーを一度起動するとタスクマネージャーなどで終了させない限り動作しているので、通常はコンピュータを起動する度に一度起動すればよい。

  • Select display settingsのウインドウになるのでデフォルトのまま「次へ」をクリックする。
  • Select how to start clientのウインドウになるので、デフオルトのまま「次へ」をクリックする。
  • Extra Settingsのウインドウになるので Clipboard、Primary Selection、Disable access controlにチェックを入れ、Native openglのチェックを外して「次へ」をクリックする。
  • Finish configurationウインドウになるので、「Save configuration」をクリックしてから「完了」をクリックする。
  • ファイアウォールなどを設定している場合は、次の図のように「Windowsセキュリティの重要な警告」というウインドウが開くので、「アクセスを許可する」をクリックする。

(2) デスクトップのUbuntu16.04アイコンをダブルクリックして新しい端末を開き、

  • $ roscore

と入力しEnterキーを押し、マスターを起動する。これはノード間で通信するために必要である。ノードはROSの実行プログラムのこと。
注:roscoreはマスターの他にパラメータサーバー、ログ用のノードも起動します。なお、roslaunchを使うと、roscoreがすでに立ち上がっていない場合は、自動的にroscoreを立ち上げます。

(3) デスクトップのUbuntu16.04アイコンをまたダブルクリックして新しい端末を開き、次のコマンドを入力しEnterキーを押すと

  • $ rosrun turtlesim turtlesim_node

タートルのいる水色のウインドウが開く。rosrunコマンドの使い方は、rosrun  [パッケージ名] [ノード名]で、パッケージのノードを起動する。パッケージはある機能を実現するためのプログラムの集まり。この例では、turtlesimというパッケージの中のturtlesim_nodeノードを起動している。

(4) キーボードでタートルを操作。新しい端末を開き次のコマンドを入力する。

  • $ rosrun turtlesim turtle_teleop_key

キーボードの矢印キーで亀を動かすことができる。動かない場合は、ここで入力した端末をクリックして選択する。タートルのいるTurtleSimウインドウや他の端末をクリックして選択した場合は動かないので注意。

2.解説

動作を確認するためにタートルと遊んだので少しお勉強。タートルが矢印キーで動く仕組みは、turtlesimノードがturtle_teleop_keyノードから送られた(publish、出版)キーのデータを受け取り(subscribe、購読)、タートルを動かしている。このデータのことをROSではトピック(topic)とよぶ。これはPublish/Subscribe (出版/購読型モデル)モデルに基づいている。ROSではトピックを使った通信の他にクライアント/サーバーモデルのサービスもある。

3.演習

以下のROSチュートリアルの1.2 ROSトピックから最後まで説明に従って、自分のノートパソコンで動作を確認しよう!

4.ホームワーク

終わり

 


ROS演習2-2019:はじめてのROSプログラミング

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年度後学期開講の講義ロボットプログラミングⅡ用です。ROSでHellow Worldと表示するプログラムを作り、ビルドして実行してみましょう。この記事は以下のROS Wikiの記事を参考にしています。

———————–
1. ワークスペース(作業場所)の作成
これからROSでいろいろなプログラムを作っていきます。まずは、その作業用ディレクトリ(フォルダ)を作りましょう。ROSではこれをワークスペースとよびます。catkin_init_workspaceコマンドでワークスペースを作ります。以下のコマンドを実行してください。なお、先頭の$は入力を受け付けるコマンドプロンプトなので打つ必要はありません。

(1) セットアップする。なお、sourceコマンドはファイルに書かれたコマンドを現在のシェルで実行するコマンドです。
$ source /opt/ros/melodic/setup.bash
(2) mkdirコマンドでディレクトリを作る。-pのオプションはcatkin_wsディレクトリをない場合はそれを作り、その中にsrcディレクトリを作ってくれる便利なオプション。なお、~はホームディレクトリの意味。
$ mkdir -p ~/catkin_ws/src
(3) cdコマンドでディレクトリを移動する。
$ cd ~/catkin_ws/src
(4) 次のコマンドでワークスペースを初期化する。
$ catkin_init_workspace

2. ビルドの方法
ROSではソースコードをビルドするときにcatkin_makeコマンドを使います。このコマンドを実行するときは~/catkin_wsにcdコマンドで移動しなければいけません。これはとても重要なので覚えておきましょう。
次のコマンドを実行してください。
$ cd ~/catkin_ws
$ catkin_make
実行後にlsコマンドを実行すると、buildとdevelディレクトリが新たに作成されていることがわかります。

3.  設定
ここで作成したcatkin_wsを有効にするためには以下のコマンドを実行する必要があります。
$ source ~/catkin_ws/devel/setup.bash
毎回、実行するのは面倒なので~/.bashrcの一番最後にテキストエディターgeditで、上のコマンドを付け加え保存しましょう。まず、geditがインストールされていない場合は次のコマンドでインストールしてください。
$ sudo apt install gedit

ホームディレクトリに移動します。
$ cd
次のコマンドでgeditを実行します。
$ gedit .bashrc

.bashrcの中にsource /opt/ros/melodic/setup.bashがない場合は、下のように2行追加してください。

export DISPLAY=localhost:0.0
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
export DISPLAY=localhost:0.0
export GAZEBO_IP=127.0.0.1

また、下から2行目のexport DISPLAYの行と1行目のGAZEBO_IPの行がない場合は、上図と同じになるよう追記してください。

保存はgeditの上ツールバー右にある「Save」をクリックします。では、うまく設定されたか、次のコマンドで確認しましょう。
$ source .bashrc
$ echo $ROS_PACKAGE_PATH
つぎのように表示されたら成功です。
失敗した場合は、設定をもう一度実行してください。打ち間違えがないか注意しましょう。

4. パッケージの作成
準備ができたので早速、パッケージを作りましょう。パッケージは次のcatkin_create_pkgコマンドで作ります。依存パッケージはそのパッケージを作るために必要なパッケージです。
catkin_create_pkg <パッケージ名> [依存パッケージ1] [依存パッケージ2] [依存パッケージ3]
helloパッケージを作りましょう!
$ cd ~/catkin_ws/src
$ catkin_create_pkg hello roscpp
上手く作成できたか確認します。
$ cd ~/catkin_ws/src/hello
$ ls
CMakeLIsts.txt, include, package.xml, srcができていれば成功です。
package.xmlに作成者(maintainer)の情報などを書きます。ここでは省略します。ROS Wikiのpackage.xmlを参考にしてください。

5. ソースコードの作成とビルド
$ cd ~/catkin_ws/src/hello/src
$ gedit hello_node.cpp


エディタが開くので以下をソースコードを打ち込み「Save」をクリックして保存する。

~/catkin_ws/src/hello/CMakeLists.txtの134行目のadd_executableで始まる行と147~149行目のtarget_link_librariesで始まる3行のコメントを次のように外して保存する(つまり、#を消す)。

ビルドします。
$ cd ~/catkin_ws
$ catkin_make

6. 実行
以下のroscoreコマンドでMaster(マスター)を実行する。他のノードを実行する前に必要です。
$ roscore
ノードを実行するためにはrosrunコマンドを使います。使い方は次のとおり。
rosrun パッケージ名 実行ファイル名
別の端末を開き、rosrunコマンドでhello_nodeノードを実行する。
なお、hello_nodeは~/catkin_ws/devel/lib/hello/hello_nodeにcatkin_makeコマンドで作られたものです。
$ rosrun hello hello_node
次のように表示されたら成功。終わり。お疲れ様!

7.ホームワーク

コンピュータ工学Ⅱ:ROS MelodicのUbuntuへのインストール

$
0
0

私が担当している2019年度後学期開講の講義ロボットプログラミングⅡ用です.この記事はROS のオフィシャルウェブサイトの次の日本語記事を簡略化しています。詳しい説明は次のリンクをご覧ください。なお、学内のようなfirewall内の場合は、インストール方法が煩雑になるので、firewall外の自宅に戻ってからインストールすることをお勧めします。

———————————————————————————————-

以下の手順でROSをインストールしてください。Ubuntuをブートして、Firefoxを起動し、このページを開く。

1.準備

(1) 端末(ターミナル、terminal)を開いて、以下のコマンドをコピペして、Enterキーを押し実行する。パスワードを聞かれたら入力する。

  • $ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

 (2)  同様にして以下のコマンドを実行して鍵情報を取得する。

  • $ curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -

2. インストール

(0)  Proxyの設定

  • geditをすでにインストールしている場合は以下のviを作ってファイルを作成する必要はない。geditを使ってください。
  • $ cd
  • vi  .bashrc
  • .bashrcに以下を追加する。
  •  iキーを押して挿入モードにして以下を.bashrcの最後の行にコピペする。
    • export ftp_proxy="ftp://プロキシ―サーバー名:ポート番号/"
    • export http_proxy="http://プロキシ―サーバー名:ポート番号/"
    • export https_proxy="https://プロキシ―サーバー名:ポート番号/"
  • escキーを押して、挿入モードから抜ける。
  • : (コロン)キーを押す。
  • wキーを押したあとですぐqキーを押してenterキーを押すと保存できる。
  • 以下のコマンドを実行してコピペした部分が表示できれば成功。終了するときはqキーを押す。
    • $ less .bashrc
  • なお、このproxy設定をすると学外からはapt installができなくなります。それを避けるためには学内ネットワークに接続可能なVPNサービスを利用するか、.bashrcに挿入した3行に#を入れてコメント化してください。

 

(1)  以下のコマンドでパッケージをアップデートする。

  • $ sudo apt update

(2)  ROSのインストール

  • $ sudo apt install ros-melodic-desktop-full

なお、sudo apt-get updateで次のように怒られる場合は、Ubuntuのネットワーク設定がうまくいっていない可能性があります。proxyを設定していない場合は、上の(0)Proxyの設定してください。
SnapCrab_NoName_2015-10-15_17-25-11_No-00

3. 初期設定

(1)  以下のコマンドでrosdepを初期化する。rosdepはシステム依存するソフトウェアをインストールするルール。1行目を入力したらEnterキーを押し、2行目を入力したらEnterキーを押す。rosdepはコンパイルを楽にするツール。なお、以下の作業だけはProxy環境下では失敗するので、スマホのデザリングや自宅など学外ネットワークで実施すること。

  • $ sudo rosdep init
  • $ rosdep update

(2) 環境設定。楽をするための設定。以下のコマンドを端末にコピペしてEnterキーを押す。1行ずつ実施すること。

  • $ cd
  • $ echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
  • $ source ~/.bashrc

(3) rosinstall 。インストールが簡単になるツールを以下のコマンドでインストールする。

  • $ sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

終わり

WSL: Windows for Subsystem for Linux (Ubuntu18.04)のインストールと設定

$
0
0

仮想マシンを使わなくてWindows上でLinuxが使えるWindows for Subsystem for Linux (以下、WSLと表記)のインストールとメモ。しかもLinuxのバイナリがそのまま動く。Windows10のバージョンが1803だとROSのシミュレータGazeboでロボットが動作せず、授業では使用できなかった。バージョン1903は動作したという報告があったので試してみる。

  •  バージョンの確認
    • 「スタートメニュー→歯車アイコン(設定)→システム→バージョン情報」を確認しWindowsの1903以上なら良い。

      バージョンが低い場合は「スタートメニュー→歯車アイコン(設定)→更新とセキュリティ」から更新する。なお、更新作業は時間がかかり(私の環境では1時間程度かかった)、途中で作業を中断し電源を切れないので時間的に余裕がある場合に実施すること。
  • Windows Subsystem for Linuxの有効化
    • スタートメニュ→Windowsシステムツール→コントロールパネル→プログラム→プログラムと機能→Windowsの機能の有効化または無効化をクリックする。
    • Windows Subsystem for Linuxにチェックを入れ、「OK」をクリックする。
    • 再起動するように聞かれるので再起動する。
  • Ubuntuをストアからインストール
    • スタートメニューの検索窓に「store」と入力すると「Microsoft Store」と表示されるのでそれをクリックする。
  • 下記の画面になるので、Ubutu 18.04LTSを選択しクリックする。下の画面にならない場合は「検索」にUbuntuと入力する。
  • 次のウインドウになるので「入手」をクリックする。ダウンロードサイズは約221MB。
  • 入手が終わると次の画面になるので「起動」をクリックする。
  • 次のウインドウになるので少し待つ。
  • ユーザ名とパスワードを聞かれるので入力する。全角は使えないので半角英数字を使うこと。ユーザ名、パスワードは今後も使うので忘れないこと。
  • 時間帯の設定。標準では、日本の時間帯ではないので以下のコマンドを端末にコピペする。パスワードを聞かれるので入力する。なお、$はプロンプト(入力できる状態を示す記号)なのでコピペしない。
    • $ sudo dpkg-reconfigure tzdata
    • 次のウインドウになるので「Asia」を選択して、Tabキーを押して「OK」を選択してEnterキーを押す。
    • 「T」を押すとTaipeに飛ぶので、下矢印キーでTokyoを選択し、Enterキーを押す。
    • dateコマンドを端末に入力して正しい時間帯に(JST)なっていたら終わり。
  • ダウンロード先の変更。標準では海外からダウンロードするようになっているので、時短するために以下のコマンドを端末にコピペして実行し、国内に変更する。
    • $ sudo sed -i 's/\/archive\.ubuntu/\/jp\.archive\.ubuntu/' /etc/apt/sources.list
  • 次のコマンドでアップデートする。
    • $ sudo apt update
    • $ sudo apt upgrade -y
  • X Window システムのインストール。WSLはグラフィカルなインタフェース(GUI)が使えないので、ROSを動かすためにはX Windowシステムを別にインストールしなければならない。調べたらVcXsrvが無償で良さそうなのでインストールしてみる。以下のウェブサイトに行き、下図の赤で囲った「Download]をクリックする。2019年10月2日現在のバージョンは1.20.5.1。
    • https://sourceforge.net/projects/vcxsrv/
    • ダウンロードしたexeファイルをダブルクリックする。次のウインドウが開くので「Next」をクリックする。
    • インストールするフォルダーを聞かれるので、デフォルトのまま「Install」をクリックする。
    • セットアップが終わったら「Close」をクリックしてインストールを終了する。
  • X起動
    • デスクトップにできたXLaunchアイコンをダブルクリックする。
    • Select display settingsのウインドウになるのでデフォルトのまま「次へ(N)」をクリックする。
    • Select how to start clientのウインドウになるので、デフオルトのまま「次へ(N)」をクリックする。
    • Extra Settingsのウインドウになるので 以下の図のようにClipboard、Primary Selection、Disable access controlにチェックを入れ、Native openglのチェックを外して「次へ」をクリックする。
    • Finish configurationウインドウになるので、「Save configuration」をクリックして設定ファイルを保存してから「完了」をクリックする。
    • ファイアウォールなどを設定している場合は、次の図のように「Windowsセキュリティの重要な警告」というウインドウが開くので、「アクセスを許可する」をクリックする。
  • Ubuntuの設定
    • スタートメニュー→Ubuntu 18.04からUbuntuターミナルを起動する。
      デスクトップにショートカットを作っておくと便利。
    •  起動したターミナルで以下のコマンドを実行し、必要なパッケージをインストールする。なお、$はプロンプトなので入力しない。
      • $ sudo apt update
      • $ sudo apt upgrade
      • $ sudo apt-get install language-pack-ja
      • sudo update-locale LANG=ja_JP.UTF-8
      • $ sudo apt-get install git emacs gedit build-essential firefox dbus
    • 環境変数の設定
      • 自分のパソコン画面にLinuxのウインドウアプリケーションが表示されるように以下のコマンドを実行して環境変数を設定する。
        • $ echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
        • $ source ~/.bashrc
  • ROS Melodicのインストール
    • 上のリンクに従ってインストール作業をしてから、以下の設定を行う。
  • ROSの設定
    •  Gazeboを起動すると画面が真っ黒で何も表示されない。モデルが表示されるように以下のコマンドで環境変数を設定する。
      • $ echo ‘export GAZEBO_IP=127.0.0.1’ >> ~/.bashrc
      • $ source ~/.bashrc
    • Gazeboの起動
      • Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ gazebo
    • rvizでdbus関係のエラーを解決するためにmachine IDを設定する。Ubuntuターミナルを起動し、次のコマンドを実行する。
      • $ dbus-uuidgen | sudo tee /etc/machine-id
    • rvizの起動
      • Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ roscore
      • もう一つ、Ubuntuターミナルを起動し、次のコマンドを実行する。
        • $ rosrun  rviz  rviz

終わり

ロボットプログラミングⅡ-2019:Virtualbox6.0+Ubuntu18.04のインストール法

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年後学期開講の講義ロボットプログラミングⅡ用です。VMware Workstation Playerは授業で使用するにはライセンス上問題があるので、VirtualBoxを利用します。

ここでは、VirtualBox6.0+Ubuntu18.04のインストール法を説明します。

VirtualBoxのインストール

(1) VirtualBoxのダウンロード

(2) Extention Packのダウンロード

(3) ダウンロードしたVirtualBox-6.0.12-133076-Win.exeファイルをダブルクリックすると以下のsetup画面になる。[Next]をクリック。

(4)  何もしないので、[Next]をクリック。

(5) 何も変更しないで、[Next]をクリック。

(6) Warning(警告)が出るが、このまま、[Yes]をクリック。

(7)  インストールの準備完了。[Install]をクリック。

(8) インストールが始まる。

もし、途中でウインドウが開き「このデバイスソフトウェアをインストールしますか?名前:Oracle corporation ユニバーサルシリアルパスコントローラ」などデバイスソフトウェアのインスト―ルを聞かれたら、全て「インストール」する。

(9) インストールが終わったので[Finish]をクリックすると、VirtualBoxが起動する。

○ 拡張パッケージのインストール

(1) USB2.0/3.0を使えるようにダウンロードしておいたExtention Packをインストールする.VirtualBoxマネージャーの ファイル(F)→環境設定(P)→機能拡張

を選択。下図の赤枠部分をクリックして、ダウンロードしたフォルダーからOracle_VM_VirtualBox_Extension_Pack-6.0.12-vbox-extpackを選択し,[OK]をクリックする.

(2) 質問のウインドウになるので,[インストール]をクリックする.

(3) VirtualBoxライセンスの画面になるので、スクロールバーを最後降ろし最後まで読み、[同意します]をクリック。
(4) 成功すると以下の画面いなるので、[OK]をクリック。

次のように拡張パッケージ名が表示されれば成功。[OK]をクリック。

○ 仮想ハードディスクファイルのダウンロードと解凍

  • 以下のどちらかのサイトから次のファイルをダウンロードする。

○ 仮想マシンの登録と起動

(1) VirtualBoxマネージャの[新規(N)]をクリックする。

(2) 仮想マシンの名前を[Ubuntu-18.04]、タイプを[Linux]、バージョンを[Ubuntu(64-bit)]に選び、「次へ」をクリック。Ubuntu(32-bit)だとインストールに失敗するのでUbuntu(64-bit)がない場合は下の注を参照。

注:ここで、Ubuntu (64-bit)がなくUbuntu(32-bit)しかない場合は、コントロールパネル」→「プログラム」→「プログラムと機能」の「Windowsの機能の有効化と無効化」をクリックし、下図のようにHyper-Vのチェックを外す。
hyper-v

(3) 仮想マシンに割り当てるメモリーサイズを、実メモリの半分にする。
私のマシンでは16384MB使えるので半分の8192MB割り当てた。
[次へ]をクリック。

(4) 「仮想ハードディスクを作成する」にチェックを入れ[作成]をクリック。

 

(5) ハードディスクのファイルタイプは「VDI」をチェックし、[次へ]をクリック。

(6) 物理ハードディスクにあるストレージは「可変サイズ」を選び[次へ]をクリック。

 

(7) ファイルの場所とサイズは先ほど作成したフォルダ

仮想ハードディスクの名前はデフォルトのままにし、サイズは余裕を持って128GBにする。可変なので実際に使った分しかハードディスクは消費されない。ここで、標準の10GBだと授業で利用するソフトを全て入れることはできないので注意。[作成]をクリック。

 

Ubuntuのインストール準備

(1) VirtualBoxマネージャーの歯車のアイコン[設定(S)]をクリック。

(2) 「Ubuntu-設定」ウインドウが開いたら、ストレージ→コントローラー:IDE 空をクリック。次に、属性→光学ドライブ IDEセカンダリマスターの横のCDアイコン(下図では赤で囲まれている)をクリックし、「仮想光学ディスクファイルを選択」を選ぶ。

(3) 先ほど、ダウンロードした「ubuntu-ja-18.04.3-desktop-amd64.iso」を選び、[開く]をクリックすると下図のように「ubuntu-ja-18.04.3-desktop-amd64.iso」がコントローラIDEに下に表示される。[OK]をクリックする。

Ubuntuのインストール

(1) Ubuntuのインストール準備が整ったので、仮想マシンを起動する。virtual boxマネージャーの[起動(T)]をクリック。

(2) 「インストール」の画面になり、下図のように既に「日本語」が選択されているので、[Ubuntuをインストール]をクリック。

(3) 「キーボードレイアウト」の画面になるので、日本語が選ばれているか確認して、「続ける」をクリック。

(4)「アップデートと他のソフトウェア」の画面になるので、「通常のインストール」、「Ubuntuのインストール中にアップデートをダウンロードする」にチェックが入っていることを確認して、「続ける」をクリック。

(5) 「インストールの種類」の画面になる。仮想マシン上にインストールするので、「ディスクを削除してUbuntuをインストール」が選択されたままで良いので、[インストール]をクリックする。

(6) 「ディスクに変更を書き込みますか?」と聞かれるので[続ける]をクリック。

(7) 「どこに住んでいますか?」と聞かれるので、Tokyoのまま[続ける]をクリック。

(8) 「あなたの情報を入力してください」と聞かれるので次のように入力する。この際、日本語は使わず、半角英数字を使うこと。

■ あなたの名前: ローマ字(英数半角)で苗字 名前
■ コンピュータの名前:b学籍番号
■ ユーザー名の入力: ローマ字(英数半角)で苗字
■ パスワード:好きなパスワードを入れること。ただし、忘れないこと。忘れた場合は、こちらでもわからないので、インストールのやり直しになる。

[続ける]をクリック。

(9) 設定作業が終わるまで待つ。私の環境では約4分かかった。

(10) 「インストールが完了しました」の画面になるので、[今すぐ再起動する]をクリック。

(11) 下の画面になり、「Please remove the installation medium, then press Enter:」と表示されるが、DVDは入れていないので、Enterキーを押すだけで良い。Enterキーを押す。

(12)  ログインする画面になるので、設定したパスワードを入力する。

(13) 次の画面が現れたら。「次へ」をクリックして新規機能の説明を読む。

(14) 左下の赤枠で囲まれたアイコンをクリックする。

検索窓にterminalと入力すると下図のように端末アイコンが現れるので、クリックして起動する。

(15) 下図のように背景が黒いウインドウが開く。開いたら終わり。なお、Linuxではこの端末にコマンドを打ち込んで、アプリを実行する。

(16) Ubuntuの終了方法。画面右上の逆三角形のアイコンをクリックすると、下図のようにウインドウが開くので赤丸で囲った「電源ボタン」アイコンをクリックする。

(17) 「電源オフ」をクリックしてUbuntuを終了する。

終わり

ロボットプログラミングⅡ-2019:Virtualbox6.0の設定

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年後学期開講の講義ロボットプログラミングⅡ用です。
この記事では、快適に使うためにVirtualBox6.0の設定を行います。

○ VirtualBoxの設定

(1) VirtualBoxを起動し、左のツールの下にあるUbuntu-18.04を選択し「設定(P)」をクリック。

(2) 左欄の「システム」を選択し、「マザーボード」のタブをクリックし、下図のように設定する。メインメモリを実メモリの半分程度(私の場合は8192MB)にし、後の設定は変更しない。

(3) 「プロセッサー」のタブをクリックし、下図のようにCPUの個数を2、使用率制限を100%にする。

(5) 左欄の「ディスプレイ」を選択し、「ビデオメモリー」を最大の128MB、「3Dアクセラレーションの3Dを有効化」に✔を入れ、[OK]をクリック。

(7) 左欄の「USB」を選択し,USB3.0コントローラーに✔を入れ、[OK]をクリック。

(8) 「起動」をクリックしてUbuntuをスタートさせる。

(9) Ubuntuが起動したら「デバイス」->「Guest Additions CDイメージの挿入]を選択する。

(10) デスクトップ上にVBox_GAs_6.0.12のアイコンが現れるのでダブルクリックする。

(11) 「ソフトウェアの実行」をクリックする。

(12) 「VBox….には自動する..実行しますか?」と聞かれるので「実行」をクリック。パスワードを聞かれるので入力する。

(13) 以下の画面になるのでキーボードのEnterキーを押す。

(14) 再起動するとExtension Packが有効になり少し幸せになれる。

終わり。お疲れ様!

ロボットプログラミングⅡ-2019:Ubuntu18.04のネットワーク設定

$
0
0

この記事は私が担当している講義ロボットプログラミングⅡ用です。

VirtualBox6.0にインストールしたUbuntu18.04でのネットワーク設定を説明します。

○ ネットワーク設定

(1) 画面左下のアプリケーション表示アイコンをクリック。

(2) 検索窓に”set”と入力すると「端末」アイコンが表示されるのでクリック。

(3)「設定」ウインドウが開くので左下にある「ネットワーク」をクリック。

(4) 「有線」の下にある「ネットワークプロキシ」の右にある下図の赤枠の歯車アイコンをクリックして選択

(5)「ネットワークプロキシ」の画面になるので、「手動」を選択し、設定URLは大学で設定されているプロキシのアドレス(Windowsや情報処理サービスセンターを参照)にする。

ネットワーク設定終わり。

〇 Chromeのインストールと設定
(1) 左上の狐火のアイコン「Firefoxウェブブラウザ」をクリックして、Firefoxを起動する。検索窓にchromeと入力する。一番上に表示された「Google Chromeを入手」クリックする。

(2) 「Chrome」をダウンロードをクリックする。

(3) 下図のように64ビット.debが選択されていることを確認し、「同意してインストール」をクリック。

(4) 下図のように新たにウインドウが開くので「ソフトウェアのインストール(default)」になっていることを確認して、「OK」をクリック。

(5) 下図のようにgoogle-chrome-stableと表示されるので「インストール(I)」をクリックする。パスワードを聞かれるので入力する。

(6) インストールが終わると、以下のように「インストール(I)」が「削除(R)」に変わる。左下のアプリケーション表示ボタンをクリックする。

(7) 検索まどにchromeと入力すると「Google Chrome」アイコンが現れるので、クリックすると起動する。

(8) 見慣れたブラウザが現れる。右端の設定ボタンをクリックすると各種設定ができる。
(9) Proxyの設定は「設定」→「詳細設定」→「システム」→「パソコンのプロキシ設定を開く」からできる。
(10) 以下の「設定」ウインドウが開く。設定の方法は最初に実施した「ネットワーク設定」と同じ。
終わり。お疲れ様!

ROS演習1-2019:亀で遊ぼう!

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年度後学期開講講義ロボットプログラミングⅡ用です。Windows Subsystem for Linux(WSL)にROSをインストールしたので、動作確認を兼ねてタートル(亀)で遊んでみましょう。この記事は以下の記事を参考にしています。

—————————————————————

(1) 端末を開き、

  • $ roscore

と入力しEnterキーを押し、マスターを起動する。これはノード間で通信するために必要である。ノードはROSの実行プログラムのこと。
注:roscoreはマスターの他にパラメータサーバー、ログ用のノードも起動します。なお、roslaunchを使うと、roscoreがすでに立ち上がっていない場合は、自動的にroscoreを立ち上げます。

(3) 新しく別の端末を開き、次のコマンドを入力しEnterキーを押すと

  • $ rosrun turtlesim turtlesim_node

タートルのいる水色のウインドウが開く。rosrunコマンドの使い方は、rosrun  [パッケージ名] [ノード名]で、パッケージのノードを起動する。パッケージはある機能を実現するためのプログラムの集まり。この例では、turtlesimというパッケージの中のturtlesim_nodeノードを起動している。

(4) キーボードでタートルを操作。新しい端末を開き次のコマンドを入力する。

  • $ rosrun turtlesim turtle_teleop_key

キーボードの矢印キーで亀を動かすことができる。動かない場合は、ここで入力した端末をクリックして選択する。タートルのいるTurtleSimウインドウや他の端末をクリックして選択した場合は動かないので注意。

2.解説

動作を確認するためにタートルと遊んだので少しお勉強。タートルが矢印キーで動く仕組みは、turtlesimノードがturtle_teleop_keyノードから送られた(publish、出版)キーのデータを受け取り(subscribe、購読)、タートルを動かしている。このデータのことをROSではトピック(topic)とよぶ。これはPublish/Subscribe (出版/購読型モデル)モデルに基づいている。ROSではトピックを使った通信の他にクライアント/サーバーモデルのサービスもある。

3.演習

以下のROSチュートリアルの1.2 ROSトピックから最後まで説明に従って、自分のノートパソコンで動作を確認しよう!

4.ホームワーク

終わり

 


ROS演習3-2019:シミュレータでTurtlebot3を動かそう!

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年度後学期開講の講義ロボットプログラミングⅡ用です。シミュレータGAZEBOを使い、Turtlebot3を動かします。次のTurtleBot3 e-Manualを参考にしています。

0.準備

(1) VirtualBoxの場合
3Dアクセラレーション無効化。
VirtualBox->設定->ディスプレイ->3Dアクセレーション有効化のチェックを外す。
この作業をしてからVirtualBoxを起動しないとシミュレータを起動できません。

(2)  WSL(Windows Subsystem for Linux)の場合
ROS演習1-2019で実施したように、Xサーバーを起動する。

1. 設定

~/.bashrcの最後の7行をgeditなどを使って以下のように設定し保存する。

(1) VirtualBoxの場合

(2) WSLの場合

2.  Turtlebot3 リモートPC用のパッケージインストール
まず、Turtlebot用のパッケージをインストール。端末を開き、次のコマンドを実行。2番目は長いのでコピペする。$はコマンドプロンプトなので入力しない。

  • $ sudo apt update
  • $ sudo apt upgrade
  • $ sudo apt-get install ros-melodic-joy ros-melodic-teleop-twist-joy ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-server ros-melodic-rosserial-client ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-navigation
  • $ cd ~/catkin_ws/src/
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_gazebo_plugin.git
  • $ cd ~/catkin_ws
  • $ catkin_make


 

4. rvizの起動

端末を開き次のコマンドを実行

$  export TURTLEBOT3_MODEL=burger
$  roslaunch turtlebot3_fake turtlebot3_fake.launch

別の端末を開き、次のコマンドを実行

$  export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

演習1で実施したようにキーボードでROSの視覚化ツールrviz上でturtlebot3を動かせます。動かしてみましょう!

毎回、export TURTLEBOT3_MODEL=burgerと入力するのは手間がかかるので、geditで.bashrcの最後の行に以下を追加する。
export TURTLEBOT3_MODEL=burger

5.  Simulator GAZEBOを動かそう

$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

初回はネットからモデルを取得するので、私の環境で5分程度かかった。しばらくすると次のようなウインドウが開く。下のロボットがturtlebot3。
別の端末を開き、次のコマンドを入力するとキーボードからロボットを操縦するためのlaunchファイルを起動。
$  roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

端末に下のように表示される。w a s d x キーでロボットを操作できる。いずれかのキーを押してロボットを動かそう!マウスのカーソルがturtlebot3_teleop_key.launchを起動した端末上になければ動かないので注意。

お疲れ様!

ROS演習3-2019:シミュレータでTurtlebot3を動かそう!

$
0
0

この記事は私が金沢工業大学ロボティクス学科で担当している2019年度後学期開講の講義ロボットプログラミングⅡ用です。シミュレータGAZEBOを使い、Turtlebot3を動かします。次のTurtleBot3 e-Manualを参考にしています。

1. 設定

~/.bashrcの最後の3行をgeditを使って以下のように設定し保存する。

2.  Turtlebot3 リモートPC用のパッケージインストール
まず、Turtlebot用のパッケージをインストール。端末を開き、次のコマンドを実行。2番目は長いのでコピペする。$はコマンドプロンプトなので入力しない。

  • $ sudo apt update
  • $ sudo apt upgrade
  • $ sudo apt-get install ros-melodic-joy ros-melodic-teleop-twist-joy ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan ros-melodic-rosserial-arduino ros-melodic-rosserial-python ros-melodic-rosserial-server ros-melodic-rosserial-client ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro ros-melodic-compressed-image-transport ros-melodic-rqt-image-view ros-melodic-navigation
  • $ cd ~/catkin_ws/src/
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
  • $ git clone https://github.com/ROBOTIS-GIT/turtlebot3_gazebo_plugin.git
  • $ cd ~/catkin_ws
  • $ catkin_make

3. rvizの起動

端末を開き次のコマンドを実行すると、ROSの視覚化ツールrvizが起動する。

export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_fake turtlebot3_fake.launch

別の端末を開き、次のコマンドを実行

$ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

演習1で実施したようにキーボードでturtlebot3を動かせます。動かしてみましょう!

4.  Simulator GAZEBOを動かそう

次のコマンドでROSのシミュレータGazeboを起動する。

$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

初回はネットからモデルを取得するので、私の環境で5分程度かかった。しばらくすると次のようなウインドウが開く。下のロボットがturtlebot3。

別の端末を開き、次のコマンドを入力するとキーボードからロボットを操縦するためのlaunchファイルを起動。
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

端末に下のように表示される。w a s d x キーでロボットを操作できる。いずれかのキーを押してロボットを動かそう!マウスのカーソルがturtlebot3_teleop_key.launchを起動した端末上になければ動かないので注意。

お疲れ様!

ROS演習4-2019: トピック通信しよう!

$
0
0


今回はROSの通信方式であるトピックを学びます。

1. Publisher

キーボードからロボットを操縦するmy_teleopパッケージを作ろう!
ROS演習2と同じ要領でmy_teleopパッケージを作ります。忘れた人はROS演習2を見ながらやろう。今回の例ではhelloをmy_teleopに置き換えます。このプログラムはメッセージの送リ手であるpublisher(配信者)プログラムの簡単な例にもなっています。プログラムの説明はソースコード内のコメントを参照してください。テキストエディタ(gedit)にコピペして名前を付けて保存する。
保存ディレクトリは~/catkin_ws/src/my_teleop/srcの中です。

#include "ros/ros.h"  // rosで必要はヘッダーファイル
#include <geometry_msgs/Twist.h> // ロボットを動かすために必要
using namespace std;

int main(int argc, char **argv)
{
    ros::init(argc, argv, "my_teleop_node");
    // initでROSを初期化し、my_teleop_nodeという名前をノードにつける
    // 同じ名前のノードが複数あるとだめなので、ユニークな名前をつける

    ros::NodeHandle nh;
    // ノードハンドラの作成。ハンドラは必要時に起動される。

    ros::Publisher  pub;
    // パブリッシャの作成。トピックに対してデータを送信。

    ros::Rate rate(10);
    // ループの頻度を設定するためのオブジェクトを作成。この場合は10Hz、1秒間に10回数、1ループ100ms。

    geometry_msgs::Twist vel;
    // geometry_msgs::Twist この型は並進速度と回転速度(vector3:3次元ベクトル) を合わせたもので、速度指令によく使われる

    pub= nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);
    // マスターにgeometry_msgs::Twist型のデータを送ることを伝える
    // マスターは/cmd_velトピック(1番目の引数)を購読する
    // 全てのノードにトピックができたことを知らせる(advertise)。
    // 2番目の引数はデータのバッファサイズ

    cout << "f: forward, b: backward, r: right, l:left" << endl;

    while (ros::ok()) { // このノードが使える間は無限ループする
        char key;  // 入力キーの値

        cin >> key; // 標準入力からキーを読み込む
        cout << key << endl; // 読み込んだキーの値を標準出力へ出力

        switch (key) {
        case 'f': // fキーが押されていたら
            vel.linear.x  =  0.5;
            break;
        case 'b':
            vel.linear.x  = -0.5;
            break;
        case 'l':
            vel.angular.z =  1.0;
            break;
        case 'r':
            vel.angular.z = -1.0;
            break;
            // linear.xは前後方向の並進速度(m/s)。前方向が正。
            // angular.zは回転速度(rad/s)。反時計回りが正。
        }

        pub.publish(vel);    // 速度指令メッセージをパブリッシュ(送信)
        ros::spinOnce();     // 1回だけコールバック関数を呼び出す
        vel.linear.x  = 0.0; // 並進速度の初期化
        vel.angular.z = 0.0; // 回転速度の初期化
        rate.sleep();        // 指定した周期でループするよう寝て待つ

    }

    return 0;
}

以下のコマンドでビルドして実行しよう。
$ cd ~/catkin_ws
$ catkin_make
$ roscore
$ rosrun my_teleop my_teleop_node

なお、catkin_makeでビルドを失敗する場合はCMakeLists.txtやpackage.xmlが間違っている場合があります。その場合はこのファイルmy_teleop.tgzをクリックしてダウンロードし、~/catkin_ws/srcの中にコピーしてください。次の手順で展開したあとにcatkin_makeを再実行してください。
$ cd ~/catkin_ws/src
$ tar xvzf my_teleop.tgz

 

2. Subscriber

次に、メッセージの受け手であるsubscriber(購読者)の簡単なプログラムを示します。このプログラムはmy_teleop_nodeがパブリッシュするトピック/cmd_velをサブスクライブして、並進速度(Linear Velocity)と角速度(Angular Velocity)を標準出力に出力する簡単なプログラムです。

// ファイル名 my_subscriber_node.cpp                                            
#include <ros/ros.h>  // rosで必要はヘッダーファイル                             
#include <geometry_msgs/Twist.h> // ロボットを動かすために必要                   
#include <iostream>
using namespace std;

// コールバック関数。並進、回転速度の表示。                                      
void callback(const geometry_msgs::Twist::ConstPtr& vel) {
  cout << "Linear :" << vel->linear.x << endl;
  cout << "Angular:" << vel->angular.z << endl;
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "my_subscriber_node");
  ros::NodeHandle nh;

  //subscriberの作成。トピック/cmd_velを購読する。バッファ数は10。               
  ros::Subscriber sub = nh.subscribe("/cmd_vel", 10, callback);

  // コールバック関数を繰り返し呼び出す。whileループが必要な場合はspinOnce()を使う。                                                                             
  ros::spin();

  return 0;
}

 

ここで、馴染みのないコールバック関数callbackが登場しています。コールバック関数はIT用語辞典によると「コールバック関数とは、プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。」と定義されています。

通常はマウスで線を描くなどの処理を実装するような、あるイベントが起きた時に処理をするプログラムを実装する場合に使われます。通常は、マウスのイベント処理などの場合のようにマウスのボタンが押されたり、移動したときに自動的にコールバック関数が呼び出されますが、ROSではspinOnce()やspin()で明示的に呼び出さなければいけません。spinOnce()はコールバック関数を一度だけ呼び出すので通常はwhileループの中で使います。spin()はノードが動いている間、コールバック関数を呼び続けます。ROSではメッセージの受け渡しにコールバック関数を使います。

また、callback関数の引数はトピックのメッセージ型でT型の場合はconst T::ConstPtr &でなければいけません。::ConstPtrと馴染みのないものが出てきましたね。ConstPtrはBoostのShared Pointerにtypedefされています。このShared Pointerはスマートポインタという賢いポインタで、普通のポインタで使い終わったら必要となるdeleteしなくても自動的にメモリを開放してくれるすぐれものです。

では、今までパッケージを作った要領で、my_subscriberパッケージを作ろう。
~/catkin_ws/src/my_subscriberディレクトリの下にCMakeLists.txt, package.xml, src
などを作ることになる。上のプログラムのファイル名はmy_subscriber_node.cppとする。

以下のコマンドでビルドして実行しよう。
$ cd ~/catkin_ws
$ catkin_make
$ rosrun my_subscriber my_subscriber_node

なお、catkin_makeでビルドを失敗する場合はCMakeLists.txtやpackage.xmlが間違っている場合があります。その場合はこのファイルmy_subscriber.tgzをクリックしてダウンロードし、~/catkin_ws/srcの中にコピーしてください。次の手順で展開したあとにcatkin_makeを再実行してください。
$ cd ~/catkin_ws/src
$ tar xvzf my_subscriber.tgz

3. シミュレータでの確認
演習3のturtlebot3シミュレータを起動し、my_teleop_nodeとmy_subscriber_nodeの動作を確認しましょう。シミュレータを次のコマンドで起動します。
$ export TURTLEBOT3_MODEL=burger
$ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch

次にmy_teleop_nodeを起動した端末にマウスカーソルを持って行いきます。
f, b, l, rキーでロボットが移動したら成功。キーを押した後はエンターキーを押す。
このシミュレータの場合は、/cmd_velをPublishするだけでロボットがその速度で移動します。

次にSubscriberのプログラムが動作しているか確認するために、my_subscriber_nodeを起動した端末を見ましょう。速度が表示されていたら成功です。

お疲れ様!

終わり

4. ホームワーク

  • キーsを押すと、turtlebot3が停止するようにmy_teleop_node.cppのソースコードを変更しよう!
  • my_teleop_node.cppではキーボードのf, b, r, lを押した後にエンターキーを押すと、一定の速度でturtlebot3が動き出します。キーを押すたびに並進速度が0.01 [m/s]ずつ増減、回転角度が0.1 [rad/s]ずつ変化するようにソースコードを変更しよう!
  • turtlebot3の移動する軌跡が正方形になるようプログラムを変更しよう!
  • my_teleop_node.cppは、演習turtlebot3_teleopとは違いf, b, r, lのキーを押した後にエンターキーが必要です。エンターキーを押さずに、f, b, r, lキーを押すとロボットが移動するようにソースコードを変更しよう。
    • ヒントmy_teleop_node.cppではstd::cinでキーボードから入力しますがキーが入力されるまで待状態になります。これをブロックとよびます。エンターキーが入力されると次の処理に移ります。Linuxでブロックしないの入出力を実現する場合はselectシステムコールを使います。次のリンクが参考になります。

ROS演習5-2019:サービス通信しよう!

$
0
0

今回はROSの通信のもう一つの通信方式であるサービスを理解しましょう。次のROS Wikiを参考にしています。

サービスはROSの通信方法の一つで、双方向通信に使います。ある仕事をお願いするクライアントとそれを処理して返すサーバーからなります。今回、作成するプログラムは速度指令値を送るクライアントと、それをロボットへ伝え(リクエスト)、ロボットから現在の速度を取得しクライアントに返す(レスポンス)サーバーです。次の手順でやりましょう。この例は、前回学んだトピック通信も入れていますので、実践的な内容です。

1.my_serviceパッケージの作成
$ cd ~/catkin_ws/src
$ catkin_create_pkg my_service std_msgs rospy roscpp

2.srvファイルの作成。srvファイルはやり取りするデータの型を表すテキストファイル。拡張子がsrv、この例のファイル名はWheel.srv。
$ cd ~/catkin_ws/src/my_service
$ mkdir srv
$ cd srv
$ gedit Wheel.srv
内容は次のコード。——-の上が入力(リクエスト)、下が出力(レスポンス)のデータ型を表します。

float64 target_linear_velocity
float64 target_angular_velocity
---------------
float64 current_linear_velocity
float64 current_angular_velocity

サーバーは並進、回転速度指令値target_linear_velocity, target_angular_velocityがリクエストされると、
現在の並進、回転速度current_linear_velocity, current_angular_velocityをリスポンスします。

3.Package.xmlの変更
~/catkin_ws/src/my_service/package.xmlの40、46行目のコメントタグを次のように外す。 つまり、message_generation, message_runtimeを有効にする必要があります。

 
<!-- Use build_depend for packages you need at compile time: -->
  <build_depend>message_generation</build_depend> 
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <exec_depend>message_runtime</exec_depend> 
  <!-- Use test_depend for packages you need only for testing: -->

4.CMakeLists.txtの変更
~/catkin_ws/src/my_service/CMakeLists.txtの13行目、std_msgsの下に次のようにmessage_generationを追加。

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospyp
  std_msgs
  message_generation
)

次の58~62行目を

## Generate services in the 'srv' folder                                        
# add_service_files(                                                            
#   FILES                                                                       
#   Service1.srv                                                                
#   Service2.srv                                                                
# )   

以下に変更。

## Generate services in the 'srv' folder                                        
 add_service_files(
   FILES
   Wheel.srv
 )

次の71~74行目

## Generate added messages and services with any dependencies listed here       
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

のコメントを外し、次にする。

## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)

次に示す105~110行目

#catkin_package(                                                                
#  INCLUDE_DIRS include                                                         
#  LIBRARIES my_service                                                         
#  CATKIN_DEPENDS roscpp rospy std_msgs                                         
#  DEPENDS system_lib                                                           
#)   

を次に変更する。

catkin_package(                                                                
  INCLUDE_DIRS include                                                         
  LIBRARIES my_service                                                         
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime                                        
  DEPENDS system_lib                                                           
)   

5.ビルド
ソースコードを書く前にサービスのライブラリを作成するためにcatkin_makeしてビルドしなければなりません。
$ cd ~/catkin_ws
$ catkin_make
ビルド時にエラーがでたら、Package.xml, CMakelists.txtに間違えがないか確認し、直して再度ビルド。
6.サービスサーバーのソースコード作成
では、依頼された仕事を処理するサーバープログラムを作ります。次のプログラムをgeditなどを使いwheel_server.cppというファイル名を付けて~/catkin_ws/src/my_service/src/wheel_server.cppと保存。一字でも打ち間違えると動かないのでコピペする。

#include "ros/ros.h"
#include <geometry_msgs/Twist.h>
#include "nav_msgs/Odometry.h"
#include "my_service/Wheel.h"  // 自動的に作られる                                         

class Server {
public:
  Server();      // コンストラクタ                                                         
  ~Server() {};  // デストラクタ                                                           
  // オドメトリのコールバック関数                                                          
  void odomCallback(const nav_msgs::Odometry::ConstPtr& odom);
  // サーバーのコールバック関数(サービスの本体)                                          
  bool wheelService(my_service::Wheel::Request  &req,
                    my_service::Wheel::Response &res);
  void loop(); // ループ関数                                                               
private:
  ros::Publisher cmd_pub;     // パブリッシャ                                              
  ros::Subscriber odom_sub;   // サブスクライバ                                            
  ros::NodeHandle nh;         // ノードハンドルの宣言                                      
  ros::ServiceServer service; // サービス                                                  
  double tmp_linear_velocity; // 現在の並進速度                                            
  double tmp_angluar_velocity; // 現在の回転速度                                           
  const static double max_linear_velocity =  0.7; // 最大並進速度                          
  const static double min_linear_velocity = -0.7; // 最小並進速度                          
  const static double max_angular_velocity =  1.2; // 最大回転速度                         
  const static double min_angular_velocity = -1.2; // 最小回転速度    
  geometry_msgs::Twist target_vel, tmp_vel; // 目標速度、現在の速度                        
};

// コンストラクタ                                                                          
Server::Server()
{
  ROS_INFO("Ready to wheel");

  //サービスの設定                                                                         
  service = nh.advertiseService("wheel",&Server::wheelService,this);
// パブリッシャ(配信)の設定:                                                             
  cmd_pub= nh.advertise<geometry_msgs::Twist>("/cmd_vel", 10);

  // サブスクライバ(購読)の設定                                                            
  // /odomトピックはロボットの速度情報を持っている                                         
  odom_sub = nh.subscribe("/odom", 10, &Server::odomCallback, this);

  // 速度の初期化                                                                          
  target_vel.linear.x  = 0.0;
  target_vel.linear.y  = 0.0;
  target_vel.linear.z  = 0.0;
  target_vel.angular.x = 0.0;
  target_vel.angular.y = 0.0;
  target_vel.angular.z = 0.0;
  tmp_vel.linear.x  = 0.0;
  tmp_vel.linear.y  = 0.0;
  tmp_vel.linear.z  = 0.0;
  tmp_vel.angular.x = 0.0;
  tmp_vel.angular.y = 0.0;
  tmp_vel.angular.z = 0.0;
}
// サーバーのコールバック関数                                                              
bool Server::wheelService(my_service::Wheel::Request  &req,
                          my_service::Wheel::Response &res)
{
  ROS_INFO("Set velocity: linear=%.2f angular=%.2f",
           req.target_linear_velocity, req.target_angular_velocity);
  // 指令速度が最小、最大速度内かチェック                                                  
  if (min_linear_velocity  > req.target_linear_velocity ||
      max_linear_velocity  < req.target_linear_velocity)  return false;
  if (min_angular_velocity > req.target_angular_velocity ||
      max_angular_velocity < req.target_angular_velocity) return false;
  // クライアントからの速度をロボットの速度指令とする                                      
  target_vel.linear.x  = req.target_linear_velocity;
  target_vel.angular.z = req.target_angular_velocity;
  // /odomトピックからサブスクライブした速度情報をクライアントに返す                       
  res.current_linear_velocity  = tmp_vel.linear.x;
  res.current_angular_velocity = tmp_vel.angular.z;
  return true;
}
// オドメトリのコールバック関数(現在速度を知る)                                          
void Server::odomCallback(const nav_msgs::Odometry::ConstPtr& odom)
{
  tmp_vel = odom->twist.twist; // 現在の速度ゲット                                         
}
// ループ関数                                                                              
void Server::loop()
{
  ros::Rate loop_rate(30); // Hz                                                           

  while(ros::ok()) {
    // ロボットを動かすため目標速度をパブリッシュ                                          
    cmd_pub.publish(target_vel);
    // コールバック関数を呼ぶ                                                              
    ros::spinOnce();
    // 決められた周期でループするため寝て待つ                                              
    loop_rate.sleep();
  }
}

int main(int argc, char **argv)
{
  //ROSの初期化 wheel_serverはノード名                                                     
  ros::init(argc, argv, "wheel_server");

  Server svr;
  svr.loop();
  return 0;
}

7.サービスクライアントのソースコード作成
次に仕事を依頼するのクライアントのソースコートを作成する。以下のソースコードをwheel_client.cppという名前で~/catkin_ws/src/my_service/src/wheel_client.cpp保存する。

#include "ros/ros.h"
#include "my_service/Wheel.h"  // 自動的に作られる                                         

int main(int argc, char **argv)
{
  // 初期化 wheel_clientノード                                                            
  ros::init(argc, argv, "wheel_client");

  ros::NodeHandle nh;
  // サービスクライアントの設定                                                            
  ros::ServiceClient client = nh.serviceClient<my_service::Wheel>("wheel");

  my_service::Wheel srv;

  std::cout << "Input target linear  velocity:";
  std::cin >> srv.request.target_linear_velocity;
  std::cout << "Input target angular velocity:";
  std::cin >> srv.request.target_angular_velocity;

 // サービスを呼ぶ                                                                        
  if (client.call(srv)) {
    // 成功したらサーバーからのレスポンスを表示                                            
    ROS_INFO("Current linear_vel=%f  angular_vel=%f",
             (double) srv.response.current_linear_velocity,
             (double) srv.response.current_angular_velocity);
  }
  else {
    // 失敗したらエラー表示                                                                
    ROS_ERROR("Faild to call service wheel");
    return 1;
  }
  return 0;
}

8.CMakeLists.txtの変更とビルド
以下をCMakeLists.txtの最後に追加する。

                                                               
add_executable(wheel_server src/wheel_server.cpp)
add_dependencies(wheel_server my_service_gencpp)
target_link_libraries(wheel_server ${catkin_LIBRARIES})

add_executable(wheel_client src/wheel_client.cpp)
add_dependencies(wheel_client my_service_gencpp)
target_link_libraries(wheel_client ${catkin_LIBRARIES})

次のコマンドでビルドする。
$ cd ~/catkin_ws
$ catkin_make

9.実行
端末を開き、以下のコマンドを実行する。
$ export TURTLEBOT3_MODEL=burger 
$ roslaunch turtlebot3_gazebo turtlebot3_world.launch
端末をもう1個開き、各コマンドを実行する。
$ rosrun my_service wheel_server
サーバーは次のように表示される。
server1
さらに、端末を開き、次のコマンドを実行する。
$ rosrun my_service wheel_client
クライアントはキーボードから入力(速度指令値)をサーバーへ送る。wheel_clientを起動した端末で並進速度(linear velocty)と角速度(angular velocity)を入力してエンターキーを押すとデータがサーバーへ送られます。その速度指令値が最小、最大値の範囲外ならエラーを返す。それ以外は、シミュレータ上のロボットが動きます。
client1
成功したら終わり。うまく動かない場合は、打ち間違えや手順に間違いがないか確認し、再度実行しましょう。

なお、今回のソースコードをまとめてmy_service.tarに置いています。うまくcatkin_makeできない方はこれを使ってください。解凍の仕方は次の通り。
$ cp ./my_service.tgz ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ tar xvf my_service.tar

ROS演習6-2019:デッドレコニングを実装しよう!

$
0
0

今回はTurtlebot3にデッドレコニングを実装します。

  • デッドレコニング説明資料
    • 以下の説明資料をダウンロードして読んでください。これをGazebo上のTurtlebot3に実装していきましょう。
  • テンプレートファイル
// ファイル名 my_odom3.cpp
#include <ros/ros.h>  // rosで必要はヘッダーファイル
#include <geometry_msgs/Twist.h> // ロボットを動かすために必要
#include <nav_msgs/Odometry.h>
#include <tf/transform_broadcaster.h>
#include <tf/transform_datatypes.h>
#include <gazebo_msgs/ModelStates.h> 
#include <sensor_msgs/JointState.h>
#include 

using namespace std;

// コールバック関数。並進、回転速度の表示。
void cbVel(const geometry_msgs::Twist::ConstPtr& vel) {
  cout << "Linear :" << vel->linear.x << endl;
  cout << "Angular:" << vel->angular.z << endl; } // /odomトピックから位置posと姿勢poseを表示 void cbOdom(const nav_msgs::Odometry::ConstPtr& msg) { ROS_INFO("Seq: %d", msg->header.seq);
  ROS_INFO("/odom Pos (x:%f, y:%f, z:%f)", msg->pose.pose.position.x,msg->pose.pose.position.y, msg->pose.pose.position.z);

  tf::Quaternion q(msg->pose.pose.orientation.x, msg->pose.pose.orientation.y, msg->pose.pose.orientation.z, msg->pose.pose.orientation.w);  
  // tf::Quaternion q(quat.x, quat.y, quat.z, quat.w);
  tf::Matrix3x3 m(q);
  double roll, pitch, yaw;
  m.getRPY(roll, pitch, yaw);

  ROS_INFO("/odom Pose (roll:%f, pitch:%f, yaw:%f) ", roll, pitch, yaw);
  ROS_INFO("Vel (Linear:%f, Angular:%f)", msg->twist.twist.linear.x,msg->twist.twist.angular.z);
												  
}

// /gazebo/model_statesトピックから真の位置Pos(x,y,z)と姿勢Pose(roll, pitch ,yaw)を表示
void cbModelStates(const gazebo_msgs::ModelStates::ConstPtr& msg)
{
  ROS_INFO("Real Pos (x:%f, y:%f, z:%f)", msg->pose[1].position.x,msg->pose[1].position.y, msg->pose[1].position.z);

  tf::Quaternion q(msg->pose[1].orientation.x, msg->pose[1].orientation.y, msg->pose[1].orientation.z, msg->pose[1].orientation.w);  
  // tf::Quaternion q(quat.x, quat.y, quat.z, quat.w);
  tf::Matrix3x3 m(q);
  double roll, pitch, yaw;
  m.getRPY(roll, pitch, yaw);

  ROS_INFO("Real Pose (roll:%f, pitch:%f, yaw:%f) ", roll, pitch, yaw);
												  
}

// cbMyOdom:この関数に自分のオドメトリを実装しよう!
// /joint_statesトピックから左右のjoint(車輪回転軸)の位置(回転角度)[rad]を表示
// 参考:Turtlebot3の車輪直径0.066 [m]
void cbMyOdom(const sensor_msgs::JointState::ConstPtr& jointstate)
{
  double wheel_right_joint_pos = jointstate->position[0]; // 右車軸の位置[rad]
  double wheel_left_joint_pos  = jointstate->position[1]; // 左車軸の位置[rad]

  // 車軸の位置は積算される
  ROS_INFO("Whell Pos (r:%f, l:%f)", wheel_right_joint_pos,wheel_left_joint_pos);
}




int main(int argc, char **argv)
{
  ros::init(argc, argv, "my_odom3");
  ros::NodeHandle nh;

  //subscriberの作成。トピック/cmd_velを購読する。
  ros::Subscriber sub  = nh.subscribe("/cmd_vel", 10, cbVel);
  ros::Subscriber sub2 = nh.subscribe("/odom", 100, cbOdom);
  ros::Subscriber sub3 = nh.subscribe("/gazebo/model_states", 100, cbModelStates);
  ros::Subscriber sub4 = nh.subscribe("/joint_states", 100, cbMyOdom);
  
  
  // コールバック関数を繰り返し呼び出す。
  ros::Rate rate(100);

  while (ros::ok()) {

    
    ros::spinOnce();
    rate.sleep();
  }
  return 0;
}
  • 以下ファイルをダウンロードして~/catkin_ws/srcの下にコピーする。
  • ビルドする
    • $ cd ~/catkin_ws/src
    • $ tar xvf my_odom3.tar
    • $ cd ~/catkin_ws
    • $ catkin_make
  • rvizでの実行
    • 端末を3つ開き、各端末で以下のコマンドを実行する。
    • $ roslaunch turtlebot3_fake turtlebot3_fake.launch
    • $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
    • $ rosrun my_odom3  my_odom3
  • gazeboでの実行
    • 端末を3つ開き、各端末で以下のコマンドを実行する。
    • $ roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
    • $ roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
    • $ rosrun my_odom3  my_odom3
    • 以下のコマンドでノードとトピックの関係を見てみましょう。
      • $ rqt_graph
    • 以下のように表示されれば成功です。

 

演  習

  • 準 備
    • ホームディレクトリの名前が日本語の場合はコマンド操作がやりづらいので以下のコマンドで英語に変更する。
      • $ LANG=C xdg-user-dirs-gtk-update
    • $ cd
    • fmt_world-2.tarをクリックしてダウンロードし~/Downloadsの中に保存。
    • $ cd Downloads
    • $ tar xvf  fmt_world-2.tar
    • $ cd fmt_world
    • $ cp turtlebot3_fmt_world.launch  ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch
    • $ cp  fmt.world  ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/worlds
    • $ cp -r fmt ~/.gazebo/models
    • $ roslaunch turtlebot3_gazebo turtlebot3_fmt_world.launch
    • 下のような建物とロボットが表示されたら終わり。右奥のボールがゴール。
  • 演 習(レポート2)
    • 基本動作
      • Turtlebot3を指定の距離[m]だけ直進して停止するプログラムを作ろう
      • Turtlebot3を指定の角度[°]だけ回転して停止するプログラムを作ろう
      • Turtllebot3を矩形軌道を移動するプログラムを作ろう
    • ウェイポイントナビゲーション
      • スタート地点からゴールまで進むプログラムを作ろう。
    • デッドレコニング
      • デッドレコニングをcbMyOdom関数に実装しよう。rvizの場合は/odomトピックと値を比較し、gazeboが動く場合はシミュレータ上の真の位置Real Posと比較しよう。
  • ヒント
    • Gazeboを起動するとTurtlebot3に速度指令を送らなくても滑って動く場合があります。その場合は次のパラメータを変更してみてください。
      • turtlebot3/turtlebot3_description/urdf/turtlebot3_burger.gazebo.xacro
        • 11,12, 21,22行目パラメータ摩擦係数mu1,mu2を0.1から1以下の大きな値。
          • <mu1>1.0</mu1>
            <mu2>1.0</mu2>
        • mu1, mu2を変化させてもスリップする場合はkp, kdのパラメータを変えましょう。gazeboは動力学計算にODEを使っており、ODEのdt(時間ステップ)、erp、cfmとは次の関係があります。
          • kp = erp/ (dt* cfm)
          • kd = (1.0- erp)/cfm
        • kp, kd, dtからerp, cfmを求める式
          • erp = dt * kp / (dt * kp + kd)
          • cfm = 1.0 / (dt * kp + kd)

終わり

Viewing all 757 articles
Browse latest View live