🤖

ROSによるロボット操作法 Part-1 実機編

2023/08/03に公開

0. 記事の内容

群馬県産業技術センターではAI技術等をはじめとしたデジタル技術を広く県内企業の方にも活用頂けるようにデジタルソリューションラボ [外部リンク] 等を通じて情報等の提供を行っています。ここでは、DSLに整備されましたTHK(株)社製の移動台車を備えた単腕のロボットアームのGUIツールによる操作とPythonによるプログラムによる操作の手順等についてまとめています。

1. はじめに

ロボットは、従来、工場内の自動化など、生産現場での利用が主でしたが、近年、人と会話をしたり、人に代わってファミリーレストランで配膳や下げ膳を行ったり、人と関りをもつロボットが身近なものとなってきています。

これらは、機械学習をはじめとしたAI技術やロボット開発の標準のミドルウェアであるROS(Robot Operating System)の充実など、様々な技術の開発や発展に支えられています。
例えば、レーザー光を利用して対象物までの距離や形などを計測する技術であるLiDAR(Light Detection And Ranging)により、ロボットは自律移動に必要な地図を作成し、自分の位置を推定し、衝突を回避しながら最適なルートで目的地に移動することができます。また、人と接するロボットでは音声認識、音声合成、画像認識などの技術も利用されています。

群馬産業技術センターでは、これらのロボットに関係した技術を紹介するため、中小企業のDX化の推進を体験できる場である「デジタルソリューションラボ(DSL)」にTHK(株)社製の移動台車を備えた単腕のロボットアームを整備しました。導入されたロボットは、ROSにより操作が可能で、GUIでの操作やプログラムによる動作の制御を容易に確認することができます。

本手順書では、導入されたロボットを実際に操作する手順を示すことにより、ロボットの設定の様子やアームの動作や自律移動の仕組み等を説明すると供に、ROSによるプログラムの例を示し、実際にロボットを制御するプログラムを作成するときに参考となる情報等を提供します。

2.ロボットの動作環境

2-1.ロボット

導入のロボットは、次の3つの部位とハンドから構成されています(図2-1、図2-2)。

(a) SLAM式全方向移動台車 Seed-Mover
メカナムホイールと呼ばれる4個の車輪を独立に駆動することにより、前後左右の移動や右左折、その場での回転による方向転換など自由な運動が可能です。また、LiDARが搭載され、自己位置推定と環境地図の作成を行うSLAM(Simultaneous Localization and Mapping)を実行できます。レーザーの検出高は床面から17.74cmで、最大検出距離は10mです。台車単体で、積載量35kgまでの運搬が可能です。

(b) 前後、上下動作可能な昇降機構 Seed-Lifter
2軸の動作により上下50cmと前後25cmの動作が可能です。また、スプリングアシストにより20kgまでのものが積載できます。

(c) 単腕ロボットアーム Seed-Arm
手首(3軸)、肩(2軸)、肘(1軸)の制御ができ、手首の先端にロボットハンドを取り付け可能です。

(d) ロボットハンド TRX
開閉の制御信号のみで、「つまむ、つかむ、にぎる」の動作ができ、アームとハンドの組み合わせで、最大1.5kgの物体のハンドリングができます。


図2-1 ロボット全体の様子


図2-2 ロボットの各部位 (THK(株)マニュアル[1])

2-2.操作用パソコン

ロボットにはWi-Fiルーターが搭載され、操作用パソコンとは無線LANで接続されます。そのため、無線LANを内蔵したパソコン、または無線LANアダプタ等の対応が必要となります。また、ロボットの操作用パソコンの推奨動作環境は、ROSのバージョンにより異なりKineticではUbuntu 16.04のOS環境、Melodicでは18.04、Noeticでは20.04となっています。

THK(株)では、導入したロボットを操作したり、プログラムを作成したりするために必要な3種類のROSに対応したパッケージseed_r7_ros_pkgをGitHubで公開しています(図2-3)[2]。


図2-3 GitHubで提供のTHK(株)のseed_r7_ros_pkg

2-3.Live USB

ROSの操作環境を構築し、ロボットの操作を容易に行えるようにTHK(株)ではホームページに「NEDO特別講座用ISOファイル」としてUbuntu18.04にROSのMelodicをインストールしたLive USB用のISOファイルを公開しています(図2-4) [1]。ここでは、公開されているISOファイルをダウンロードして、Windows 10のインストールされたパソコンによるLive USBの作成手順を示します。また、このLive USBにはROSに加え、すでに以下のソフトがインストールされています。

    ・MoveIt! (https://moveit.ros.org/)
        ロボットのアームの移動や経路探索に用いられるモーションプランニングツール 
    ・Navigation Stack (http://wiki.ros.org/navigation)
        ロボットの地図の作成やナビゲーションのための自律移動ツール
    ・Rviz (http://wiki.ros.org/rviz)
        ロボットの位置や関節の角度、LiDARで得られた障害物までの距離などの3次元データの可視化ツール 
    ・Gazebo (http://gazebosim.org/)
        ロボットの3次元モデルの物理シミュレーター



図2-4 THK(株)が提供のLive USB用イメージ

(1) ISOファイル
THK(株)のホームページSEED Solutions / Supportから、NEDO特別講座用ISOファイル「ubuntu-seed-18.04.5-desktop-amd64.iso」をマウスでクリックしてダウンロードし、パソコンの適当なフォルダに保存します。ここでは、C:ドライブに/workフォルダを作成し、保存するものとします。

(2) USBへの書込み
ISOファイルをUSBに書込んでLive USBを作成するソフトは、何種類かありますが、ここでは、THK(株)のホームページSEED Solutions / Supportに掲載の「Live USBの作成手順.pdf」で紹介の書込み用ソフトウェアUNetbootinを用います。ソフトは、https://unetbootin.github.io/ よりWindows用のものをダウンロードします(図2-5)。


図2-5 UNetbootinのダウンロードサイト

(3) USBへの書込み
USBメモリは、USB3.0、16GB以上のものが推奨されています。ここでは、USB3.1、32GBのものを利用しています。Live USBを作成するとUSBの内容はすべてなくなりますので、必要なものは事前に保存するなど、注意して下さい。

a. USBをパソコンに設定します。
このとき、ドライブレターをWindows Explorer等により確認しておきます。

b. ダウンロードした「unetbootin-windows-702.exe」を、マウスでダブルクリックして起動します。解凍やインストール等の必要はありません。

c. UNetbootinの画面で次の設定を行います(図2-6(a))。

    ・「ディスクイメージ」を選択
    ・「ISO」を選択
    ・「...」のボタンをクリックして、ダウンロードしたISOファイルを選択
    ・スペースに8192MBを設定
    ・タイプに「USBドライブ」を選択
    ・ドライブにUSBのドライブレターを選択

d. 「OK」ボタンをクリックして、書込みを開始します(図2-6(b))。

e. 「Installation complete」の画面で、「終了」ボタンをクリックして書込みを終了します(図2-6(c))。

【注意】
※ 途中で警告が出たときは画面の指示に対応して下さい(図2-6(d))。
※ プログラムが停止したときなどは、最初から書込みをやり直して下さい。


(a) 設定画面


(b) 書込み作業中


(c) 終了画面


(d) 途中の警告画面
Fig.2-6 UNetbootinによるLive USBの作成

(4) 設定ファイルの修正
エクスプローラから作成したLive USBを選択し、\boot\grub\grub.cfgファイルをメモ帳等で開き、ファイルの以下の部分の3行目の最後に「-- persistent」を追加して、上書き保存します(図2-7)。

menuentry "UEFI Boot the Ubuntu SEED 18.04.5 Desktop" [
  set gfxpayload=keep
  linux /casper/vmlinuz noprompt file=/cdrom/preseed/custom.seed boot=casper quiet splash -- persistent
  initrd /casper/initrd.lz
]



図2-7 grub.cfgの修正

(5) Ubuntuの起動
Live USBのUbuntuシステムを起動する手順を以下に示します。

a. パソコンの起動
Live USBをパソコンに挿入して、電源をON または 再起動します。

b. ブートメニューの表示
Windowsが起動する前に、F7やF12等のキーを繰返し押し、起動するデバイスを選択するブートメニューを表示させます。図2-8(a)では、F7がブートメニューの呼び出し用のキーに割り当てられています。

c. Live USBの選択
ブートメニューから作成したLive USBを識別するUSBのメーカー名等を探し、矢印キーで移動してenterキーで選択します。図2-8(b)では、Live USBの「JetFlash Transcend 32GB」を選択します。

d. 起動する項目を選択
現れた画面から「UEFI Boot the Ubuntu SEED 18.04.5 Desktop」の項目に矢印キーで移動してenterキーで選択します(図2-8(c))。画面に何も表示されないときは、そのままにしていても「Default」が選択されてシステムが起動します。しばらくして、Ubuntuに自動ログインしてDesktop画面が現れれば、Live USBの作成は成功です(図2-8(d)、図2-8(e))。

【注意】
※ F7やF12等のキーを押して、ブートメニューが表示されない場合は、パソコンの取扱説明書等でキーの割当てを確認して下さい。
※ ブートメニューが表示されてもLive USBを識別するUSBのメーカー名等がない場合は、BIOSのセットアップのBootやStartup Deviceの設定を確認して下さい(図2-8(f))。BIOSのセットアップのメニューに入るには、パソコンを起動するときにF2やDeleteキー等を繰返し押すことで行える場合もありますが、パソコンにより異なりますのでうまく行かないときはキーの割当てを取扱説明書等で確認して下さい。
※ Live USBの初期のユーザ名とパスワードは「seed」です。


(a) パソコンの起動画面 (F2:Setup、F7:Boot Options)


(b) ブートメニュー


(c) ブート項目


(d) Ubuntuの起動中の画面


(e) UbuntuのDesktop画面


(f) AMI BIOSのセットアップ画面
図2-8 Live USBのUbuntuシステムの起動

(6) Ubuntuの終了
Ubuntuを終了してパソコンの電源をOFFする手順を以下に示します。

a. ロボットの電源OFF
操作用パソコンとロボットをWi-Fi接続したときは、操作用パソコンのUbuntuを終了する前に、ロボットに搭載のパソコン(マスターPC)の電源がOFFとなっていることを確認して下さい。
ロボットの電源がOFFとなっていないときは、3-2節(1)の手順によりOFFとしてから、以降のUbuntuの終了手順を行って下さい。

b. 操作用パソコンの電源OFF
次のどちらかの操作で終了します。
b-1. メニューで実施 (図2-9)

    ・デスクトップ画面の右上隅の下向きの三角形のアイコンをクリックします。
    ・現れた画面の最下段右側の電源のアイコンを選択します。
    ・現れた画面から「電源オフ」を選択します。

b-2. コマンドで実施 (図2-10)

    ・Ubuntuのターミナルを起動して、次のコマンドを実行します。
        sudo shutdown -h now
        パスワード「seed」を入力

c. Live USBの抜取り
パソコンの電源がOFFとなったことを確認して、Live USBをパソコンから抜取ります。


(a) デスクトップ右上隅のボタンのメニュー


(b) パソコンの電源OFF
図2-9 メニューによるUbuntuの終了


図2-10 ターミナルによるUbuntuの終了

3.ロボットとパソコンの準備

ロボットの電源をONし、Wi-Fiにより操作用パソコンと接続する手順を示します。

3-1.ロボットの電源ON

(1) バッテリー
導入のロボットで利用のバッテリーは、正面側にあるボタンを押すと緑色のLEDが点灯し、残量レベルが表示されます(図3-1)。残量が少ないときは、バッテリーの側面の充電口に充電器のコネクタを接続して充電を行う必要があります。充電中は充電器のLEDが赤色に点灯し、完了すると緑色の点灯となります。


図3-1 ロボットのバッテリー

(2) ロボットへのバッテリーの装着
ロボットは、バッテリーを3個装着することができますが、3個すべてを装着しなくても動作させることができます(Fig.3-2)。バッテリーはロボットの差し込み口のレールに乗せて、奥までしっかりと差し込みます。特に、ロック等はありません。取り外すときはゆっくりと引き抜くことで行えます。また、バッテリーにはスイッチはなく、奥まで挿入された時点で通電状態となります。


図3-2 ロボットへのバッテリーの装着

(3) 電源ON
ロボットの台車の上面にあるボタンを順番に投入して行きます(図3-3)。

a. 非常停止スイッチの解除を確認
台車の正面に向かって左側の赤いスイッチが押し下げられた状態のときは、スイッチを時計方向に回して通常の状態にします。

b. ロボットの主電源ON
台車の右側の矩形のスイッチの1側を押して、ONにします。

c. ロボットの起動スイッチON
非常停止ボダンの左側の緑色の起動スイッチの点滅を確認し、スイッチを押して点灯させます。このとき、ロボットアーム等が原点復帰の動作を行うために、5~10秒程度、動きますので注意して下さい。

【注意】
※ 原点復帰動作中に非常停止ボタンを押さないで下さい。

d. 台車のLEDの確認
台車の4隅のLEDが黄色の点滅から緑色の点灯になることを確認します。

e. ロボットのパソコン(マスターPC)の電源ON
台車の右側の丸い孔の電源ボダンを押し、白色の電源マークのLEDの点灯を確認します。


図3-3 ロボットの電源スイッチ

3-2.ロボットの電源OFF

(1) ロボットのパソコン(マスターPC)の電源OFF
ロボットのパソコン(マスターPC)の電源を落とすには、4-1節のロボットと操作用パソコンがWi-Fi接続された状態で、SSH接続された操作用パソコンのターミナルから次のコマンドを実行します。ここで、Byobuが起動されているときは、各ウインドウで「exit」またはCTRL+Dを入力してByobuを終了させてから行います。

       shutdown -h now
      パスワード「seed」を入力

コマンドが正常に実行されたことを確認して、ロボットのパソコンに接続のターミナルを✕のボダンをクリックして終了します。

(2) ロボットの主電源OFF
台車の矩形のスイッチの0側を押し、電源をOFFにします。

(3) 操作用パソコンの電源OFF
ロボットのパソコン(マスターPC)に続いて、操作用パソコンの電源をOFFにするときは、ターミナルから「shutdown -h now」のコマンドの実行とパスワード「seed」を入力します。また、「2-3節 (6)Ubuntuの終了」で説明のメニュー操作で行うこともできます。

4.ロボットの操作

2章で設定したLive USBにより操作用パソコンでUbuntuを起動し、3章の手順で電源をONしたロボットに無線LANのWi-Fiで接続し、ロボットを操作する手順を示します。

4-1.Wi-Fi接続

(1) Wi-Fiルーターとの接続
操作用パソコンとロボットのパソコン(マスターPC)をネットワークで接続するために、Wi-Fiルーターと接続を行います(図4-1)。

a. Ubuntuのデスクトップの左下隅の「3x3の格子点」のアイコンをマウスでクリックして、アプリケーションソフトの一覧を表示させます。

b. 「設定」ソフトを選択します。

c. 現れた画面で「Wi-Fi」の項目を選択します。

d. ルーターの一覧からロボットのWi-FiルーターのSSIDを選択します。

e. パスワードを入力します。

f. ルーターの一覧で目的のルーターに「✓」の付いたことを確認します。

導入したロボットのWi-Fiルーターは、2.4GHzと5GHzの周波数帯に対応し、ルーターの背面に以下の情報が記載されています。周波数帯は操作用パソコン側で対応しているものを選択してください。

      SSID : Baffalo-G-FB2A (2.4GHz)
             Baffalo-A-FB2A (5GHz)
      Password(WAP2) : (確認下さい)



(a) 「3x3の格子点」のアイコン


(b) アプリケーションソフトの一覧


(c) Wi-Fiルーターの一覧


(d) Wi-Fiの認証パスワードの入力


(e) 接続されたWi-Fiルーター
図4-1 Wi-Fiルーターとの接続

(2) 操作用パソコンのIPアドレス
操作用パソコンの固定IPアドレスを設定します。

a. Ubuntuのデスクトップの左下隅の「3x3の格子点」のアイコンをマウスでクリックして、アプリケーションソフトの一覧を表示させます。

b. 「設定」ソフトをクリックして起動します。

c. 「Wi-Fi」の項目を選択します。

d. (1)で接続したルーターの項目の歯車のアイコンをクリックします(図4-1(e))。

e. 現れた画面で「IPv4」のタブを選択します(図4-2(a))。

f. 現れた画面の「IPv4メソッド」で「手動」を選択し、以下の設定を行います(図4-2(b))。

      アドレス      : 192.168.0.200
      ネックマスク  : 255.255.255.0
      ゲートウェイ、DNS、ルートの設定を行う必要はありません。

g. [適用]をクリックして設定を保存します。

h. [設定]画面の上段の「オン」のボタンをクリックして「オフ」にした後、もう一度、クリックして「オン」します(図4-1(e))。

i. 接続したルーターの項目の歯車のアイコンをクリックします。

j. IPv4に設定したIPアドレスを確認し、[キャンセル]をクリックして画面を閉じます(図4-2(c))。

k. [設定]ソフトの右上の✕のアイコンをクリックして閉じます。


(a) IPアドレス情報(設定前)


(b) IPアドレスの設定


(c) IPアドレス情報(設定後)
図4-2 固定IPアドレスのマニュアル設定

(3) ロボットとの接続確認
操作用パソコンとロボットのパソコン(マスターPC)が正しくWi-Fi接続されているか、[ターミナル]を起動し、次のコマンドを実行して確認します(図4-3)。

      ping 192.168.0.50

パケットの損失がなく、応答が表示されていれば正常に接続されています。
コマンドの終了はCRTL+Cを押します。


図4-3 pingコマンドによる接続の確認

4-2.ロボットのマニュアル操作

操作用パソコンのターミナルからコマンドの実行によりGUI画面を起動し、ロボットの前後進、左右回転の操作、およびロボットを構成している昇降機構Seed-Lifter、アームSeed-Arm、ハンドTRXの各関節の操作を行います[2]。

(1) Byobuターミナルマルチプレクサ[3]
ROSのプログラムの実行では、複数のターミナルを起動してコマンドを実行する必要があります。しかし、操作用パソコンからロボットのパソコンにSSH接続する場合は、Byobuという仮想ターミナルソフトを用いることで、SSH接続した状態で複数のシェル環境を起動することができます。
操作用パソコンにインストールされているByobuは、起動されたターミナルでbyobuとコマンドを入力して実行することにより、複数のシェル環境を同時に起動して、それらを切り替えながら作業を行うことができます。

主に用いる操作は、次のウインドウの「追加」、「切換え」、「閉じる」です。

      新規ウインドウの追加 : F2
      前のウインドウに移動 : F3
      後のウインドウに移動 : F4
      ウインドウを閉じる   : exit または CTRL+D

現在の表示ウインドウは、ターミナルの下段に表示される0からはじまるウインドウの番号により識別できます。
また、モニタが広いときは、画面を水平や垂直に分割して利用することも可能です(図4-4)。
すべてのウインドウを閉じると元のターミナル画面に戻ります。


4-4 Byobuの画面の例 (画面の垂直、水平分割)

(2) ロボットのパソコン(マスターPC)
操作用パソコンからロボットのパソコンにSSH接続を行い、ロボット側の設定を行います。

a. SSH接続
操作用パソコンのターミナルを起動して次のコマンドを実行し、SSH接続を行います。

      ssh seed@192.168.0.50

ここで、初めてSSH接続する場合は、次の接続の確認とパスワードの入力の要求がありますので、それぞれ「yes」「seed」と入力します(図4-5)。

      接続確認   :  Are you sure you want to continue connecting (yes/no) ?
      パスワード  :  seed@192.168.0.50’s password:

画面に「seed@seed-mover:~$」とプロンプトが表示されれば、正しくSSH接続されています。
続いて、ロボットのパソコンのIPアドレスを設定して、Byobuを起動します(図4-6)。

      rossetip 192.168.0.50
      byobu

b. ロボット側のターミナル1
Byobuの最初のウインドウ0で次のコマンドroscoreを実行します(図4-7)。roscoreは、ROSで通信を行うために必要なもので、プログラムの実行に先立って起動しておく必要があります。

      roscore

c. ロボット側のターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。
実行中は、画面に[ INFO]に続く文字が、出力され続けます(図4-8)。

      roslaunch seed_r7_bringup seed_r7_bringup.launch robot_model:=typeg_arm



図4-5 ロボット側のパソコンとのSSH接続


図4-6 ロボット側のパソコンのIPアドレス設定


図4-7 roscoreの実行中画面


図4-8 seed_r7_bringup.launchの実行中画面

(3) 操作用パソコン
ターミナルを起動して操作用のパソコン側の設定を行います。

a. ターミナルの起動
操作用パソコンで(2)のロボット側のパソコンと接続のターミナルとは別のターミナルを起動し、次のコマンドを実行して操作用のパソコン側の設定を行い、Byobuを起動します(図4-9、図4-10)。

      rossetip 192.168.0.200
      rossetmaster 192.168.0.50
      byobu

b. 操作ターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行し、ROSの可視化ツールRvizを起動してDSLに導入のアームロボットを表示します(図4-11)。

      rosrun rviz rviz -d `rospack find seed_r7_bringup`/rviz.rviz

また、ロボットがうまく表示されないときは、左側のDisplayペインで以下の項目の設定を行って下さい。

    ・Global OptionsのFixed Frame : mapをbase_linkやodomに変更する
    ・TFShow Names            : チェックを外す
    ・TFShow Axes             : チェックを外す

c. 操作ターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します(図4-12)。

      rosrun rqt_robot_steering rqt_robot_steering

現れた画面の垂直のスライダーで前進と後進、水平のスライダーで左回転と右回転を行うことができます。どちらも0の位置で停止となります。
また、右上の[Stop]ボタンで、緊急停止することができます。


図4-9 新規ターミナルの起動


図4-10 操作用パソコン側の設定


(a) コマンドによる起動


(b) 起動直後のロボット


(c) Fixed Frameの設定後


(d) Show Names、Show Axesの設定後
図4-11 可視化ツールRvizとロボット


(a) コマンドによる起動


(b) Rvizとrqt_robot_steering画面
図4-12 Seed-Moverの移動プログラム rqt_robot_steering

d. 操作ターミナル3
4-2節で設定の操作用パソコンとロボットのパソコン(マスターPC)がWi-Fiで接続された状態で、さらに、操作用パソコンのターミナルでF2を押してByobuにウインドウ2を追加し、次のコマンドを実行します(図4-13)。

    rosrun rqt_joint_trajectory_controller rqt_joint_trajectory_controller

現れた画面の上部のcontrollerの項目により操作対象の部位を設定し、それぞれのスライダーの操作により画面と実際のロボットの関節の動きを制御することができます。
ここで、操作する前に中央の赤い非常停止ボタンをクリックして、緑色にする必要があります。

    () arm_controller
          elbow_joint         肘の上下
          shoulder_p_joint    ()の回転
          shoulder_r_joint    ()の前後
          wrist_p_joint       手首の回転
          wrist_r_joint       手首の上下
          wrist_y_jpint       手首の上下

    () hand_controller
          r_thumb_joint       手の把持

    () lifter_controller
          ankle_joint         足首(下段の関節)
          knee_joint           (中段の関節)



(a) コマンドによる起動


(b) Rvizとrqt_joint_trajectory_controller


図4-13 関節操作プログラム rqt_joint_trajectory_controller

(4) 終了
a. 操作用パソコンのターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

b. ロボットのパソコン(マスターPC)に接続されたターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

c. ロボットのパソコン(マスターPC)に接続されたターミナルで、「shutdown -h now」とパスワード「seed」を入力して、マスターPCの電源をOFFにします。

d. 必要に応じて、操作用パソコンの電源をOFFにするときは、c.の操作によりSSH接続の終了したロボットのパソコン(マスターPC)に接続されていたターミナル、または操作用パソコンのターミナルで「shutdown -h now」とパスワード「seed」を入力します。

4-3.ロボットの自律移動

導入したロボットは、予め作成された地図に対して台車Seed-Moverに搭載されたLiDARを利用して自己位置を確認しながら移動させることができます。また、ロボットの台車やアームの移動経路の探索に用いられるモーションプランニングツールのMoveItがインストールされていますので、可視化ツールのRvizと連携して地図上で目的地を設定するだけで、途中の障害物を迂回し目的地でのロボットの向きまで考慮した経路探索などを行うことができます。

ここでは、地図が与えられたときのロボットの自律移動の手順を示します。地図の作成は、台車Seed-Moverを利用したときの手順を5章で説明します。

(1) ロボットのパソコン(マスターPC)
a. SSH接続
操作用パソコンのターミナルを起動し、次のコマンドを実行してSSH接続し、ロボットのパソコンのIPアドレスを設定して、Byobuを起動します。

      ssh seed@192.168.0.50
      password: seed
      rossetip 192.168.0.50
      byobu

b. ロボット側のターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行します。

      roscore

c. ロボット側のターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。

      roslaunch seed_r7_bringup seed_r7_bringup.launch robot_model:=typeg_arm

d. ロボット側のターミナル3
F2を押して、Byobuにウインドウ2を追加し、次のコマンドを実行します。

      roslaunch seed_r7_navigation wheel_with_static_map.launch

(2) 操作用パソコン
a. ターミナルの起動
操作用パソコンで(1)のロボット側のパソコンと接続のターミナルとは別のターミナルを起動し、次のコマンドを実行して操作用パソコン側の設定を行い、Byobuを起動します。

      rossetip 192.168.0.200
      rossetmaster 192.168.0.50
      byobu

b. 操作ターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行し、ROSの可視化ツールRvizを起動してDSLに導入のアームロボットを表示します。

      rosrun rviz rviz -d `rospack find seed_r7_bringup`/rviz.rviz

ロボット以外のものが表示されて見難いときは、Displayペインで以下の項目の設定を行って下さい。

TFShow Names            : チェックを外す
    ・TFShow Axes             : チェックを外す

c. 操作ターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。

    rosrun rqt_robot_steering rqt_robot_steering

このプログラムは4-2節と同様にロボットの移動を制御できると共に、[Stop]をクリックしてロボットの移動を停止させることもできます。

(3) 自律移動
可視化ツールのRvizに表示の赤い点はLiDARによる輝点(位置情報)を表しています。
もし、表示の地図の境界と赤い点の位置がずれているときは、上段の[2D Pose Estimate]をクリックして、表示の地図と赤い点が合うように現在位置の補正(自己位置補正)を行って下さい(図4-14)。

ロボットの移動先(目的地)の設定は、上段の[2D Nav Goal]をクリックした後、ロボットの移動位置でマウスをクリックし、現れた矢印のドラッグでロボットの向きを設定します。ロボットは、そこまでのルートを探索して移動を始めます(図4-15)。ルートの探索は、地図上の障害物の回避と目的地での最終的なロボットの向き等も考慮して行われます。


図4-14 地図の境界とLiDARの赤い点がずれている例


図4-15 自律移動での目的地とロボットの向きの設定

(4) 終了
a. 操作用パソコンのターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

b. ロボットのパソコン(マスターPC)に接続されたターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

c. ロボットのパソコン(マスターPC)に接続されたターミナルで、「shutdown -h now」とパスワード「seed」を入力して、マスターPCの電源をOFFにします。

d. 必要に応じて、操作用パソコンの電源をOFFにするときは、c.の操作によりSSH接続の終了したロボットのパソコン(マスターPC)に接続されていたターミナル、または操作用パソコンのターミナルで「shutdown -h now」とパスワード「seed」を入力します。

4-4.マウスによるアームの操作

可視化ツールのRvizに描かれたロボットのアームをマウスでドラッグして目的位置を設定し、モーションプランニングツールのMoveItにより途中の姿勢動作を計画させて移動させます。このとき、実際のロボットの腕も連動して移動します。確認の手順を以下に示します。

(1) ロボットのパソコン(マスターPC)
a. SSH接続
操作用パソコンのターミナルを起動し、次のコマンドを実行してSSH接続し、ロボットのパソコンのIPアドレスを設定して、Byobuを起動します。

      ssh seed@192.168.0.50
      password: seed
      rossetip 192.168.0.50
      byobu

b. ロボット側のターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行します。

      roscore

c. ロボット側のターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。

      roslaunch seed_r7_bringup moveit.launch robot_model:=typeg2_arm

※ typeg2_armのロボットのイメージは拡大すると分かりますが、完全ではありません。

(2) 操作用パソコン
a. ターミナルの起動
操作用パソコンで(1)のロボット側のパソコンと接続のターミナルとは別のターミナルを起動し、次のコマンドを実行して操作用パソコン側の設定を行い、Byobuを起動します。

      rossetip 192.168.0.200
      rossetmaster 192.168.0.50
      byobu

b. 操作ターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行し、ROSの可視化ツールRvizを起動してDSLに導入のアームロボットを表示します。

      rosrun rviz rviz -d `rospack find seed_r7_bringup`/rviz.rviz

ロボットがうまく表示されないときは、Displayペインで以下の項目の設定を行って下さい。

    ・Global OptionsのFixed Frame : mapをodomに変更する
    ・TFShow Names            : チェックを外す
    ・TFShow Axes             : チェックを外す

c. 自己位置補正
表示の地図の境界と赤い点の位置がずれているときは、上段の[2D Pose Estimate]をクリックして、表示の地図と赤い点が合うように現在位置の補正(自己位置補正)を行って下さい。

d. MotionPlanningの追加
Rvizの左側にMotionPlanningのペインがないときは、次の手順により追加します。

    ・Displayペインの下側の[Add]をクリックする
    ・現れた画面の「By display type」タブを選択する
    ・「moveit_ros_visualization」の項目のMotionPlanningを選択する(4-16)

e. Planning Groupの設定とアームの移動
Rvizのロボットの移動させる部位を設定して、マウスで部位をドラッグします(図4-17)。

    ・MotionPlanningペインの「Planning」タブを選択する
    ・「Planning Group」に「arm_with_torso」を設定する
    ・ロボットに表示のマーカー(Interactive Marker)をマウスでドラッグする
    ・MotionPlanningペインの「Plan & Execute」をクリックする

マーカーの移動について、以下の操作ができます。

3軸に沿った矢印             :軸方向の移動
    ・3軸周りのドーナツ型の円板   :軸周りの回転
    ・3軸の中心の球               :3軸中心の移動

【注意】
マーカーが突然、意図しないところに移動し、操作性に問題もあるようですが、設定されたマーカーの位置に部位を移動することが確認できます。


図4-16 MotionPlanningの追加


図4-17 MotionPlanningによる腕の移動

(3) 終了
a. 操作用パソコンのターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

b. ロボットのパソコン(マスターPC)に接続されたターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」でByobuの各ウインドウを終了します。

c. ロボットのパソコン(マスターPC)に接続されたターミナルで、「shutdown -h now」とパスワード「seed」を入力して、マスターPCの電源をOFFにします。

d. 必要に応じて、操作用パソコンの電源をOFFにするときは、c.の操作によりSSH接続の終了したロボットのパソコン(マスターPC)に接続されていたターミナル、または操作用パソコンのターミナルで「shutdown -h now」とパスワード「seed」を入力します。

5. 地図の作成

SLAMにより4章で利用したロボットの移動範囲の地図の作成と保存の手順を示します。導入のロボットは、搭載しているLiDARを用いて周囲の障害物までの距離を測定して地図を作成し、同時に作成された地図上で現在位置を推定し、移動とともに地図の作成と現在位置の精度を向上させて行きます

5-1.ロボットの設定

(1) ロボットのパソコン(マスターPC)
a. SSH接続
操作用パソコンのターミナルを起動し、次のコマンドを実行してSSH接続し、ロボットのパソコンのIPアドレスを設定して、Byobuを起動します。

      ssh seed@192.168.0.50
      password: seed
      rossetip 192.168.0.50
      byobu

b. ロボット側のターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行します。

      roscore

c. ロボット側のターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。

      roslaunch seed_r7_bringup seed_r7_bringup.launch robot_model:=typeg_arm

d. ロボット側のターミナル3
F2を押して、Byobuにウインドウ2を追加し、次のコマンドを実行します。

      roslaunch seed_r7_navigation wheel_with_making_map.launch

(2) 操作用パソコン
a. ターミナルの起動
操作用パソコンで(1)のロボット側のパソコンと接続のターミナルとは別のターミナルを起動し、次のコマンドを実行して操作用パソコン側の設定を行い、Byobuを起動します。

      rossetip 192.168.0.200
      rossetmaster 192.168.0.50
      byobu

b. 操作ターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行し、ROSの可視化ツールRvizを起動してDSLに導入のアームロボットを表示します。

      rosrun rviz rviz -d `rospack find seed_r7_bringup`/rviz.rviz

ロボットがうまく表示されないときは、Displayペインで以下の項目の設定を行って下さい。

TFShow Names            : チェックを外す
    ・TFShow Axes             : チェックを外す

c. 操作ターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。

      rosrun rqt_robot_steering rqt_robot_steering

5-2.地図の作成

4-2節と同様にrqt_robot_steeringの画面からGUIの操作により、実際のロボットに同期してRvizのロボットを移動させ、移動範囲の境界の形成と塗り潰しを行います。

障害物上の赤い点はLiDARの認識したレーザー光の反射点の位置で、リアルタイムに表示が更新されます。ロボットの移動とその場での回転などを行いながら、効率的に地図を作成して行きます。


(a) Rvizの起動時


(b) ロボットの前進時


(c) ロボットが障害物の裏側


(d) ロボットが部屋を一周した後
図5-1 SLAMによる地図の作成

5-3.地図データの保存

作成された地図情報をファイルに保存します。

(1) ロボットのパソコン(マスターPC)
e. ロボット側のターミナル4
5-1節(1)のd.に続けて、F2を押して、Byobuにウインドウ3を追加し、次のコマンドを実行します。

      roslaunch seed_r7_navigation map_saver.launch

地図情報は、ロボットのパソコン(マスターPC)の次のフォルダにmap.pgm(画像データ)とmap.yaml(画像情報)のファイルが保存されます。

      /home/seed/ros/melodic/src/seed_r7_ros_pkg/seed_r7_navigation/maps



(a) データの保存コマンド


(b) データの保存の確認
図5-2 地図データの保存

(2) 終了
a. 操作用パソコンのターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

b. ロボットのパソコン(マスターPC)に接続されたターミナルで起動した各ウインドウのプログラムをCTRL+Cを押して終了し、「exit」またはCTRL+DでByobuの各ウインドウを終了します。

c. ロボットのパソコン(マスターPC)に接続されたターミナルで、「shutdown -h now」とパスワード「seed」を入力して、マスターPCの電源をOFFにします。

d. 必要に応じて、操作用パソコンの電源をOFFにするときは、c.の操作によりSSH接続の終了したロボットのパソコン(マスターPC)に接続されていたターミナル、または操作用パソコンのターミナルで「shutdown -h now」とパスワード「seed」を入力します。

6. プログラムによる操作

ROSではプログラミング言語C++やPythonを利用してロボットをプログラムにより操作することができます。ここではPythonによるプログラム(パッケージ)の作成手順を示し、簡単なロボットの移動とアーム等の部位の操作を行います。

6-1.環境設定

DSLに導入のアームロボットと操作用パソコンのLive USBに設定されているROSの環境はMelodicなので、公式に対応のPythonのバージョンは2.7です。

ROSのプログラムは、ワークスペース(作業場所)と呼ばれる専用のフォルダにパッケージという単位にまとめられて作成されます。また、プログラムは必ずいずれかのパッケージに属する必要があります。THK(株)で提供のファイルを設定したUbuntuネイティブまたはLive USBの環境では、フォルダ/home/seed/ros/melodicがワークスペースに設定され、build, devel, logs, srcのフォルダが作成されています。

6-2.プログラムの構成法

ロボットを操作するPythonの仮想のプログラムrobot_operation.pyを例として、作成と実行の手順の概要を示します。具体的な操作は次節に示します。また、ここで示す実行手順はLive USB環境を利用した場合です。

(1) パッケージの作成
a. 作成
プログラムrobot_operation.pyの属するパッケージをdsl_ros_pkgとして、次のコマンドにより作成します。

      cd /home/seed/ros/melodic/src/
      catkin_create_pkg dsl_ros_pkg rospy

2つ目のコマンドのrospyはプログラムの実行に必要な依存ファイルで、ロボットをROSで操作するときに必要なAPIを提供するPythonのモジュールです。

b. 確認
次のコマンドにより、dsl_ros_pkgフォルダ内にCMakeLists.txt, package.xml, src (フォルダ)の作成が確認できれは、パッケージは正常に作成されています。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/
      ls -l

c. ビルド
パッケージを作成したときは、ROSの環境が変わりますので、次のコマンドでビルドを実行して環境を更新する必要があります。

      cd /home/seed/ros/melodic
      source /home/seed/ros/melodic/devel/setup.bash
      catkin build dsl_ros_pkg

(2) Pythonプログラムの作成
Pythonのプログラムは、作成したパッケージのフォルダにscriptフォルダを作成し、保存します。また、プログラムはUbuntuのテキストエディタgeditで作成できます。次のコマンドにより、geditを起動し、プログラムrobot_operation.pyを作成、保存します。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg
      mkdir script
      cd script
      gedit robot_operation.py

(3) プログラムの実行権
Pythonはインタープリタ言語ですので、実行するためにコンパイルを行う必要はありませんが、次のコマンドによりプログラムファイルに実行権を設定する必要があります。
これは、作成したPythonプログラムをPython Scriptとして実行するためです。

      chmod a+x robot_operation.py

(4) プログラムの実行
a. 環境の更新
プログラムを実行するためには、オーバーレイの環境が変わっているかもしれませんので、次のスクリプトを実行します。

      source /home/seed/ros/melodic/devel/setup.bash

b. roscoreの起動
ROSのノード間の通信を行うためには、事前にroscoreを実行しておく必要があります。roscoreはROSベースのシステムに必要なノードとプログラムの集合です。

      roscore

c. 実行
新たに別のターミナルを起動し、rosrun コマンドに続けてパッケージとプログラムを設定し、実行します。Byobuを起動し、複数のウインドウを追加して実行することも可能です。

      source /home/seed/ros/melodic/devel/setup.bash
      cd /home/seed/ros/melodic
      rosrun dsl_ros_pkg robot_operation.py

d. 終了

      ・プログラムを起動したターミナルでCTRL+Cを押してプログラムを終了します。
      ・再度、プログラムを実行したり、別のプログラムを実行したりするときは、rosrunによるコマンドを実行します。
      ・ROSを終了するときは、roscoreをCTRL+Cを押して終了します。

【参考】
プログラムのビルドや実行などを行うときは、事前にROSの環境を設定するために次のスクリプトを実行する必要があります。
a. ROSシステムの環境(アンダーレイ環境)

      source /opt/ros/melodic/setup.bash

b.ワークスペースの環境(オーバーレイ環境)

      source /home/seed/ros/melodic/devel/setup.bash

この設定はターミナルを起動するたびに、行う必要がありますが、前者はターミナルの起動時の設定ファイルである.bashrcに記載されているため、実行の必要はありません。
後者も.bashrcに記載するとターミナルを起動する度に設定する手順を省略でき効率的です。
具体的には、ターミナルから次のコマンドを入力してgeditを起動します。

      gedit /home/seed/.bashrc

そして、ファイルの最後に次の行を追加して、上書き保存してgedit終了します。

      source /home/seed/ros/melodic/devel/setup.bash

6-3.プログラム環境の確認

ROSのプログラムの環境が正しく設定されていることを確認するために、ロボットの操作ではなく、端末にメッセージを表示する送信と受信のプログラムを作成します。

(1) トピック通信プログラム [4]
ROSではノード間の通信を行う方法として、「トピック」「サービス」「アクション」の3つを提供しています。ここでは、送信側(Publisher)から受信側(Subscriber)にメッセージを送る非同期の単方向通信のトピック通信のプログラムを作成します。

(2) パッケージの作成 (図6-1)
a. 作成
次のコマンドを入力して、パッケージdsl_ros_pkgを作成します。

      cd /home/seed/ros/melodic/src/
      catkin_create_pkg dsl_ros_pkg rospy 

b. 確認
次のコマンドにより、dsl_ros_pkgフォルダ内のCMakeLists.txt, package.xml, src (フォルダ)を確認をします。

      cd dsl_ros_pkg
      ls -l

c. ビルド
パッケージを作成したことで、ROSの環境が変わりましたので、次のコマンドによりビルドを行います。

      cd /home/seed/ros/melodic
      source /home/seed/ros/melodic/devel/setup.bash
      catkin build dsl_ros_pkg

d. フォルダの作成
Pythonのプログラムは、scriptフォルダに作成する必要がありますので、次のコマンドによりフォルダを作成します。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg
      mkdir script



(a) パッケージdsl_ros_pkgの作成


(b) パッケージのビルド


(c) scriptフォルダの作成
図6-1 パッケージの作成

(3) 送信側(Publisher)
a. プログラムの入力
次のコマンドを入力して、geditを起動し(図6-2)、リスト6-1のプログラムtime_pub.pyを入力します。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script
      gedit time_pub.py   

b. 実行権の設定
プログラムを保存して、実行権を設定します。

      chmod a+x time_pub.py



図6-2 送信側(Publisher)プログラムの作成

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float64

if __name__ == "__main__":
    rospy.init_node('time_pub')
    pub = rospy.Publisher('UnixTime', Float64, queue_size=1)

    time0 = rospy.get_time()
    rate = rospy.Rate(0.5)
    while not rospy.is_shutdown():
        now = rospy.get_time()
        pub.publish(now - time0)
        rate.sleep()


リスト6-1 time_pub.py

【参考】
・rospyはPythonでROSを扱うときに必要なモジュールです。
・rospy.init_node()によりノード名を設定します。
・UnixTimeというトピック名で、Float64のデータをメッセージとして送信します。
・rospy.Rate()とsleep()により、whileの繰返し時間(0.5Hz)を設定します。
・rospy.get_time()により、UNIX時間を取得します。
・nameとmainの前後の __ は、下線 _ が2個です。

(4) 受信側(Subscriber)
a. プログラムの入力
次のコマンドを入力して、geditを起動し(図6-3)、リスト6-2のプログラムtime_sub.pyを入力します。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script
      gedit time_sub.py

b. 実行権の設定
プログラムを保存して、実行権を設定します。

      chmod a+x time_sub.py



図6-3 受信側(Subscriber)プログラムの作成

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float64

def callback(message):
    print(message.data)

if __name__ == "__main__":
    rospy.init_node('time_sub')
    sub = rospy.Subscriber('UnixTime', Float64 , callback)
    rospy.spin()


リスト6-2 time_sub.py

【参考】
・rospy.Subscriber()により、PublishされたUnixTimeのトピックが受信されたとき、callback()関数が実行されます。
・受信したFloat64のデータは、callback()関数内でmessage.dataにより参照できます。

(5) プログラムの実行
a. 環境の更新
プログラムを実行するためには、オーバーレイの環境が変わっているかもしれませんので、次のスクリプトを実行します。

      cd /home/seed/ros/melodic/
      source /home/seed/ros/melodic/devel/setup.bash

b. roscoreの起動
次のコマンドを実行してROSの実行に必要なプログラムを起動します。

      roscore

c. 実行(受信側)
新たに別のターミナルを起動し、rosrunにより受信側のプログラムを先に実行して待ち状態とします。

      cd /home/seed/ros/melodic/
      source /home/seed/ros/melodic/devel/setup.bash
      rosrun dsl_ros_pkg time_sub.py

d. 実行(送信側)
新たに別のターミナルを起動し、同様に送信側のプログラムを実行します。

      cd /home/seed/ros/melodic/
      source /home/seed/ros/melodic/devel/setup.bash
      rosrun dsl_ros_pkg time_pub.py

(6) 実行の確認と終了
受信側のプログラムのターミナル画面に、2秒間隔で送信側のプログラムの起動からの経過時間が表示されれば正常です(図6-4、図6-5)。
プログラムの終了は、各ターミナルで起動したプログラムをCTRL+Cを押して終了し、「exit」を入力してターミナルを終了します。


図6-4 実行する3つのプログラム


(a) roscoreの実行


(b) 受信側time_sub.pyの実行画面


(c) 送信側time_sub.pyの実行画面
図6-5 送受信プログラムの実行

6-4.ロボットのプログラム操作

導入したロボットの台車の移動や関節を動作させるPythonによるROSのプログラムを示します[5][6]。

(1) ロボットのパソコン(マスターPC)
a. SSH接続
操作用パソコンのターミナルを起動し、次のコマンドを実行してSSH接続し、ロボットのパソコンのIPアドレスを設定して、Byobuを起動します。

      ssh seed@192.168.0.50
      password: seed
      rossetip 192.168.0.50
      byobu

b. ロボット側のターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行します。

      roscore

c. ロボット側のターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。実行中は、画面に文字が出力され続けます。

      roslaunch seed_r7_bringup moveit.launch robot_model:=typeg_arm

(2) 操作用パソコン
ターミナルを起動して操作用パソコン側の設定を行います。
a. ターミナルの起動
操作用パソコンで(1)のロボット側のパソコンと接続のターミナルとは別のターミナルを起動し、次のコマンドを実行して操作用パソコン側の設定を行い、Byobuを起動します。

      rossetip 192.168.0.200
      rossetmaster 192.168.0.50
      byobu

b. 操作ターミナル1
Byobuの最初のウインドウ0で次のコマンドを実行し、ROSの可視化ツールRvizを起動してDSLに導入のアームロボットを表示します。この可視化ツールRvizは起動しなくても、プロクラムにより実際のロボットは動作しますが、Rvizを起動することにより、実際のロボットとRvizのロボットが同じ動作を行うことが確認できます。

      rosrun rviz rviz -d `rospack find seed_r7_bringup`/rviz.rviz

ロボットがうまく表示されないときは、左側のDisplayペインで以下の項目の設定を行って下さい。

    ・Global OptionsのFixed Frame : mapをodomに変更する
    ・TFShow Names            : チェックを外す
    ・TFShow Axes             : チェックを外す

c. 操作ターミナル2
F2を押して、Byobuにウインドウ1を追加し、次のコマンドを実行します。ここで、プログラムの作成から実行権の設定までの手順c-1~c-3は、ロボットとSSH接続する前に実施し、SSH接続後はc-4の実行と修正などを行うと作業を効率的に進められます。

c-1. フォルダの移動

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script

c-2. プログラムの入力

      gedit プログラム名.py
      プログラム内容は(4)(6)に示します。

c-3. 実行権の設定

      chmod a+x プログラム名.py

c-4. 実行

      rosrun dsl_ros_pkg プログラム名.py

(3) 終了
プログラムを起動したターミナルのウインドウでCTRL+Cを押します。

(4) ロボットの移動 (Seed-Mover)プログラム
ロボットの移動は、ROSのインターフェースを提供するrospyを利用したプログラムを作成して行います。

次のコマンドを入力して、geditでプログラムを作成します。
robot_mover.py(リスト6-3)は、1辺50cmの矩形に沿って移動します。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script
      gedit robot_mover.py 


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from geometry_msgs.msg import Twist

if __name__ == "__main__":
    rospy.init_node("move_forward_node")

    pubTwist = rospy.Publisher('/cmd_vel', Twist, queue_size=1)

    loop = rospy.Rate(2)

    vel = Twist()
    vel.linear.x =  0.1
    vel.linear.y =  0.0
    vel.linear.z =  0.0
    vel.angular.x = 0.0
    vel.angular.y = 0.0
    vel.angular.z = 0.0
    for _ in range(10):
        pubTwist.publish(vel)
        loop.sleep()

    vel.linear.x =  0.0
    vel.linear.y =  0.1
    vel.linear.z =  0.0
    vel.angular.x = 0.0
    vel.angular.y = 0.0
    vel.angular.z = 0.0
    for _ in range(10):
        pubTwist.publish(vel)
        loop.sleep()

    vel.linear.x = -0.1
    vel.linear.y =  0.0
    vel.linear.z =  0.0
    vel.angular.x = 0.0
    vel.angular.y = 0.0
    vel.angular.z = 0.0
    for _ in range(10):
        pubTwist.publish(vel)
        loop.sleep()

    vel.linear.x =  0.0
    vel.linear.y = -0.1
    vel.linear.z =  0.0
    vel.angular.x = 0.0
    vel.angular.y = 0.0
    vel.angular.z = 0.0
    for _ in range(10):
        pubTwist.publish(vel)
        loop.sleep()

    vel.linear.x = 0.0
    vel.linear.y = 0.0
    vel.linear.z = 0.0
    vel.angular.x = 0.0
    vel.angular.y = 0.0
    vel.angular.z = 0.0
    pubTwist.publish(vel)


リスト6-3 robot_mover.py

(5) ロボットの膝、踵の操作 (Seed-Lifter) プログラム
ロボットの部位の動作計画を行うMoveItをPythonのプログラムから利用するときのインターフェースであるmoveit_commanderパッケージを利用して、ロボットの部位を操作できます。

次のコマンドを入力して、geditでプログラムを作成します。
robot_lifter.py(リスト6-4)は、リフターを屈曲、伸長をさせます。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script
      gedit robot_lifter.py 
      下段の第1関節(Ankle)の可動範囲 :  0.00 ~ 1.57
      中段の第2関節(Knee) の可動範囲 : -1.57 ~ 0.00
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import moveit_commander

if __name__ == '__main__':

    rospy.init_node("lifter_node")
    
    RobotLifter = moveit_commander.MoveGroupCommander("lifter")
    print("RobotLifter", RobotLifter.get_active_joints())
    RobotLifter.set_max_velocity_scaling_factor(1.)

    current_lifter_joint = RobotLifter.get_current_joint_values()
    print("RobotLifter", current_lifter_joint)
    
    RobotLifter.set_joint_value_target("ankle_joint", 0.00) 
    RobotLifter.set_joint_value_target("knee_joint",  0.00)
    RobotLifter.go(wait=True)

    RobotLifter.set_joint_value_target("ankle_joint", 0.80)
    RobotLifter.set_joint_value_target("knee_joint", -0.80)
    RobotLifter.go(wait=True)

    RobotLifter.set_joint_value_target("ankle_joint", 0.00)
    RobotLifter.set_joint_value_target("knee_joint",  0.00)
    RobotLifter.go(wait=True)


リスト6-4 robot_lifter.py

(6) ロボットの肘、肩、手首の操作 (Seed-Arm) プログラム
次のコマンドを入力して、geditでプログラムを作成します。
robot_arm.py(リスト6-5)は、各関節を順番に動かします。

      cd /home/seed/ros/melodic/src/dsl_ros_pkg/script
      gedit robot_arm.py 
      手首(wrist)   の可動範囲  : -0.30 ~ 0.30
      (elbow)     の操作範囲  : -1.57 ~ 1.57
      (shoulder_y)の可動範囲  : -2.09 ~ 2.09
      (shoulder_p)の可動範囲  :     0 ~ 1.57
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import moveit_commander

if __name__ == '__main__':

    rospy.init_node("arm_node")

    RobotArm = moveit_commander.MoveGroupCommander("arm") 
    print("RobotArm", RobotArm.get_active_joints())
    RobotArm.set_max_velocity_scaling_factor(1.)

    current_arm_joint = RobotArm.get_current_joint_values()
    print("RobotArm", current_arm_joint)

    RobotArm.set_joint_value_target("wrist_p_joint",     0.  )
    RobotArm.set_joint_value_target("elbow_joint",       0.  )
    RobotArm.set_joint_value_target("shoulder_y_joint",  0.  )
    RobotArm.set_joint_value_target("shoulder_p_joint",  0.  )
    RobotArm.go(wait=True)

    RobotArm.set_joint_value_target("wrist_p_joint",     0.30)
    RobotArm.go()
    RobotArm.set_joint_value_target("wrist_p_joint",    -0.30)
    RobotArm.go()
    RobotArm.set_joint_value_target("wrist_p_joint",     0.  )
    RobotArm.go()

    RobotArm.set_joint_value_target("elbow_joint",      -1.57)
    RobotArm.go()
    RobotArm.set_joint_value_target("elbow_joint",       1.25)
    RobotArm.go()
    RobotArm.set_joint_value_target("elbow_joint",       0.  )
    RobotArm.go()

    RobotArm.set_joint_value_target("shoulder_y_joint", -2.00)
    RobotArm.go()
    RobotArm.set_joint_value_target("shoulder_y_joint",  2.00)
    RobotArm.go()
    RobotArm.set_joint_value_target("shoulder_y_joint",  0.  )
    RobotArm.go()

    RobotArm.set_joint_value_target("shoulder_p_joint",  0.  )
    RobotArm.go()
    RobotArm.set_joint_value_target("shoulder_p_joint",  1.57)
    RobotArm.go()
    RobotArm.set_joint_value_target("shoulder_p_joint",  0.  )
    RobotArm.go()

    RobotArm.set_joint_value_target("wrist_p_joint",     0.  )
    RobotArm.set_joint_value_target("elbow_joint",       0.  )
    RobotArm.set_joint_value_target("shoulder_y_joint",  0.  )
    RobotArm.set_joint_value_target("shoulder_p_joint",  0.  )
    RobotArm.go(wait=True)


リスト6-5 robot_arm.py

7. まとめ

本手順書では、群馬産業技術センターに導入されたTHK(株)社製の移動台車を備えた単腕のロボットアームを操作するために必要な以下の項目について示しました。
  ・ROSの操作環境を含むUbuntuのLive USBの作成
  ・ロボットの電源の投入からWi-Fiを介した操作用パソコンとの接続
  ・GUIプログラムによるロボットの移動や関節の制御
  ・ロボットのLiDARを利用したSLAMによる地図の作成
  ・Pythonによるロボット操作の環境構築とプログラム例

ROSによるロボットの操作では、複数のターミナルを起動してコマンドを実行するため、はじめは戸惑いますが、Byobuなどのターミナルを整理するソフトを利用すると効率的に作業を進められます。
また、ここで、用いたROSはいわゆるROS1と呼ばれるものでその開発は既に終了し、次世代バージョンのROS2もリリースされています。しかし、実際に普及しているロボットでは、ROS1に対応のものも多いため、ROSによるロボットの操作に関心のある方の参考になればと思います。

最後に、実機のロボットを実際に制御できると状況を把握するのに良いと思いますが、一方で、思わぬ動きをすることもありますので、周囲のものとの衝突や人がケガ等をしないように注意して操作することも忘れないようにお願い致します。

付録 参考資料

本資料の作成ではインターネットにある多くのサイトに掲載の情報を利用しました。以下に本文で参考にした主なWebサイトを示します。

[1] SEED Solutions / Support
  https://www.seed-solutions.net/?q=seed_jp/node/7
 1-1. SEED R-7シリーズ取扱説明書
   OperationManual_SEED-R7_No.805.pdf
   Manual_TRX_V0.701.pdf
 1-2. NEDO特別講座用ISOファイル
   ubuntu-seed-18.04.5-desktop-amd64.iso
[2] GitHubで公開のseed_r7_ros_pkg
  https://github.com/seed-solutions/seed_r7_ros_pkg
[3] Byobuターミナルマルチプレクサ
  https://linuxfan.info/terminal-with-byobu
[4] ROSのトピック通信プログラム
  https://raspimouse-sim-tutorial.gitbook.io/project/ros_tutorial/how_to_write_topic
[5] MoveIt! Tutorial Documentation Release0.1.1
  https://github.com/tork-a/tork_moveit_tutorial/releases/tag/0.1.1
[6] MoveIt! Python インタフェース
  https://rtmros-nextage.readthedocs.io/en/latest/manual_ja_tutorial_moveit-python.html

以上

https://zenn.dev/dsl_gunma/articles/0e8b9b0049a4b6
https://zenn.dev/dsl_gunma/articles/2add9d5f362af4

Discussion