Blog Archives

Raspberry Pi Mouse 研修[7]

こんにちは。seyaです。

ロボットを動かすうえで制御は割り込み処理で一定時間間隔で行いたいということがあります。マイクロコンピュータではタイマ等を使用して一定時間ごとの割り込み処理を簡単に行うことができます。しかし、ラズベリーパイなどOSが積まれたものではOS上で動かしている実行ファイルからハードウェアの割り込み等を使用することは原則できません。

そこで、並列処理を行うことのできるマルチスレッドプログラムを実装することにしました。

はじめに、マルチスレッドプログラムを書く上で注意しなければならない点を以下にあげていきます。

  • 共通の資源に複数の場所から同時アクセスをしてはいけない。
  • 同じ変数に対して処理の順番が変わることで結果がかわるということを防ぐ必要がある。
  • デッドロックが起きないようにする。

これ以外にもありますが、特に問題が起きやすいことは上記の内容になると考えられます。これらを防ぐためにはセマフォとミューテックスと呼ばれる方法があります。ラズベリーパイマウスで迷路を走行する上で、共通資源をアクセスするタイミングは次のものがありました。

  • ペリフェラルの関数を使用するとき。
  • printfやscanfといった標準入出力を行うとき。
  • 一定時間で処理を行うために計測用の時間をラズベリーパイから取得するとき。

c++には標準ライブラリでミューテックスが提供されているためミューテックスを使用して排他処理を実装しました。

mutexをプログラムに読み込んで、mutexのクラスをグローバルで作成して、ひとつのmutexの変数をそれぞれのファイル間で共有しました。クリティカルな処理をする前にmutexクラスのlock関数を読み出して処理を行い、処理が終了後にunlock関数で処理を終了するというようにしています。

実装したプログラムのmain文はこちらです。

割り込み処理を実装したクラスとモード選択や実行を行うクラスをそれぞれ作成しておいて、それらのクラスの実態をグローバル変数として定義をして、スレッド用にセンサ割り込み、制御用割り込み、モード選択・処理用の関数をそれぞれ作成してスレッドを立てました。

マルチスレッドプログラムにして、センサで壁の有無を判定した結果迷路で走行することができるようになりました。

指定した距離を走るということ、90度回転するということ、迷路を走行することに関しては、マイクロマウスではじめよう ロボットプログラミング入門に丁寧に解説してあるので是非読んでみてください!

 

次回やること

壁制御を実装してマシンが区画の中心をまっすぐ走れるようにしていきたいと思います。迷路を走れるようになったので、走行の安定性を上げることが次の目標になりそうです。

続きを読む ›

Posted in Raspberry Pi Mouse


Raspberry Pi Mouse 研修[6]

こんにちは。seyaです。

C++にはクラスという概念が導入されているため、周辺機能をクラスにまとめてみました。

ほかのクラスから、同じインスタンスにアクセスをする方法として、クラスそれぞれに静的なインスタンスをもち、静的な関数からインスタンスを受け取るということを行いました。

やり方として正しいかどうかはわからないので何とも言えませんが、ソフトが動いているのでこのまま進めていきたいと考えています。

また、マイクロマウスでおなじみ(?)の台形加速を速度系で行い、ステップ周波数に変換するプログラムを書きました。

台形加速、速度系から、ステップ周波数への計算の仕方は、マイクロマウスではじめようロボットプログラミング入門を参考にしました。この本をよめばわかるので、計算式は割愛します。台形加速は下の画像のようにできました!

 

 

次回やること

c++の<thread>を使用して割り込み処理で制御の処理やセンサの値の取得を行えるようにしていきたいです!

いつになったらマウスがまっすぐ動くのでしょうか?

走るまでの道のりが長いです・・・。

続きを読む ›

Posted in Raspberry Pi Mouse


Ignition+ROS Melodicで走らせるRaspberry Pi Mouse

こんにちは!satoです。

前回はGitHub上で動かせるIgnition + ROSのサンプルを動かして移動台車のロボットをシミュレーションしてみました。

今回はIgnitionでRaspberry Pi Mouseを動かしてみましたので、Raspberry Pi Mouseのシミュレータについての簡単な説明とともにその使い方を軽く説明していきます。

なお、ここで紹介する内容は2019年10月6日の時点での情報です。その後のアップデートにより内容が変わる可能性があります。

Raspberry Pi Mouse Simlulatorとは

Raspberry Pi Mouse SimlulatorはGazebo + ROSで動かすRaspberry Pi Mouseのシミュレータです。

こちらに導入方法と使用方法をまとめています。

https://github.com/rt-net/raspimouse_sim/wiki

開発の記録はこの記事にまとめています。

Gazeboで走るRasPiMouse その6

Image from Gyazo

Ignition + ROSで自作ロボットを動かす

ros_ign_gazebo_demosを拡張したros_ign_gazebo_raspimouseを使ってRaspberry Pi Mouseを動かしてみます。

ros_ign_gazebo_raspimouseのインストール

ros_ign_gazebo_raspimouseをダウンロードします。ファイルを一部変更する必要があるので今の段階ではまだビルドはしません。

先程の移動台車をRaspberry Pi Mouseに置き換えたSDFを作成してworldディレクトリに保存しています。
https://github.com/Tiryoh/ros_ign_gazebo_raspimouse/blob/master/worlds/raspimouse_on_world.sdf

サンプルの簡単なSDFは以下に公開されています。

https://bitbucket.org/ignitionrobotics/ign-gazebo/src/default/examples/worlds/

例えば、tunnel.sdfを起動すると以下のようなモデルが起動します。中を読んでみるとuriでIgnition Fuelに公開されているモデルデータを指定していることを確認できます。

メッシュデータを含む複雑なSDFはIgnition Fuelに公開してSDFから呼び出すのが良いようです。

とりあえず手軽に試したいのでローカルに保存したまま呼び出すことにします。
Ignition Fuelに公開されているモデルデータはIgnition Fuel Toolsでダウンロードして$HOME/.ignition/fuelにダウンロードすることができるようです。

SDFが保存されている場所からの相対パスでvisual用のメッシュデータをuriで指定し、呼び出せれば簡単なのですが、現在プルリクエストが出されていてマージ待ちのようです。
https://bitbucket.org/ignitionrobotics/ign-gazebo/pull-requests/433/handle-relative-uris/diff

そこで今回はメッシュデータへのファイルパスをフルで指定します。ファイルパスを書き換えるために以下のスクリプトを実行します。configure_modelsを呼び出しています。

モデルデータの書き換えができたらビルドします。

ros_ign_gazebo_raspimouseの起動

それではIginitionでRaspberry Pi Mouseを起動してみましょう。以下のコマンドで呼び出します。

このようにかなり高くロボットを見下ろす位置からスタートします。スタート位置を調整する方法は今の所なさそうなようでした。

この状態で別のターミナルから以下のコマンドを実行するとロボットが3秒間走行して停止する様子が確認できます。

まとめ

前回はGitHub上で動かせるIgnition + ROSのサンプルを動かして移動台車のロボットをシミュレーションしました。
今回は開発途中のIgnitionを使用して弊社のロボットであるRaspberry Pi Mouseを起動してみました。
Raspberry Pi MouseはROS2にも対応しているロボットなのでシミュレーション環境についても開発を進めていきます。

更新履歴
2019年10月23日

osrf/ros1_ignがosrf/ros_ignにリネームされていたため、コマンドを更新しました。
詳細: https://github.com/osrf/ros_ign/commit/2ebaa77ea7ae67e25d431415ac860d02386dd652

続きを読む ›

Posted in Raspberry Pi Mouse
Tags: ,

Ignition+ROS Melodicでロボットのシミュレーション

こんにちは!satoです。

ROSConJP 2019にてLouise Poubelさんの基調講演で「これからのGazebo: ROSのシミュレーションの次世代」というタイトルでGazeboとIgnitionについての紹介がありました。

紹介されていたIgnitionでROSと組み合わせてサンプルを動かしてみましたので、Ignitionについての簡単な説明とともにその使い方を軽く説明していきます。

Open Robotics Louiseさんの基調講演が始まりした。ROSCon本家でお馴染みのGazeboを使ったライブスライドです。 #ROSConJP2019 pic.twitter.com/BHtbxk02P7

— ROSCon JP (@rosconjp) September 25, 2019

なお、ここで紹介する内容は2019年9月26日の時点での情報です。その後のアップデートにより内容が変わる可能性があります。

Ignitionとは

Ignitionはロボットのシミュレーションに特化したオープンソースなライブラリ群です。
Gazeboは物理シミュレーションやセンサシミュレーションなどロボットのシミュレーションに必要な要素が組み合わさり1つのソフトウェアとして公開されています。
※Gazeboの最近のバージョンではIgnitionのライブラリを取り込んで使用しているものもあります。こちらのページに解説が載っています。
それに対し、Ignitionではそれぞれを構成する要素がライブラリとしてわかれているため、シミュレータを簡単に拡張することができます。
例えば、GazeboではレンダリングエンジンにOGRE 1.0が採用されています。IgnitionではOGRE 1.0/2.0、NVIDIA OptiXなどの中から自由にレンダリングエンジンを選ぶことができます。

Gazeboと同様にIgnitionもbitbucket上で開発が進められているようです。

ドキュメント
https://bitbucket.org/ignitionrobotics/docs

Ignition本体
https://bitbucket.org/ignitionrobotics/ign-gazebo

Gazeboは現在Gazebo 9が主流だとは思いますが、Gazebo 11まではOpen Roboticsによってサポートとメンテナンスが継続されるようです。

今後は安定して使いたい用途にはGazeboを、新しいプラグインを開発していきたければIgnitionを使い、両方を使い分けていくのが良さそうです。

Gazeboはバージョン11で開発が終了するが、Ignitionはこれから続々とバージョンリリースが続く。開発にはIgnitionを使おう。 pic.twitter.com/4G8545a30M

— ROSCon JP (@rosconjp) September 25, 2019

Ignition + ROSでサンプルのロボットを動かす

IgnitionとROSを組み合わせて使用するサンプルがGitHub上に公開されています。まずはすでに公開されているデモ用モデルを動かしてみます。

https://github.com/osrf/ros_ign

Ignitionのインストール

Ignition blueprintをインストールします。インストールは公式のドキュメントに従って進めます。

https://ignitionrobotics.org/docs/blueprint/install

Gazeboが問題なく動く環境ならば、いまのところ問題なくIgnitionも動かせそうです。

ros_ignのインストール

その他のROSパッケージと干渉しないよう、念のため新しいワークスペースを作成します。

ros_ignをダウンロードしてビルドします。

サンプルの実行

以下のlaunchファイルを実行すると緑と青の移動台車が出てきます。

rostopicを送るか、ign topicを送ることでロボットを動かすことができます。

いまのところtfがうまく取得できていないようです。分かり次第アップデートします。

まとめ

ROSConJP 2019で紹介されていたIgnitionは今後ロボットのシミュレーションに大活躍しそうな、ロボットのシミュレーションに特化したオープンソースなライブラリ群です。Gazeboが今後なくなるという噂もあるようですが、Gazeboがなくなるのではなく時間をかけてIgnitionに移行していきます。
今回は開発途中のIgnitionとROS Melodicを組み合わせて使用するサンプルをGitHubからダウンロードして使用してみました。
次回は弊社のロボットであるRaspberry Pi MouseをIgnitionで動かしてみようと思います。

更新履歴
2019年10月23日

osrf/ros1_ignがosrf/ros_ignにリネームされていたため、コマンドを更新しました。
詳細: https://github.com/osrf/ros_ign/commit/2ebaa77ea7ae67e25d431415ac860d02386dd652

続きを読む ›

Posted in Raspberry Pi Mouse
Tags: ,

Raspberry Pi Mouse 研修[5]

こんにちは。seyaです。

今回は、c++でラズベリーパイマウスのドライバへの書き込み、読み込みのプログラムを書きました。

マニュアルに載っているopen,close,writeはc++で使用できなかったので、cstdioライブラリのFILE構造体、fopen, fclose, fprintf,fscanf,fgetcを使用していきます。

ドライバへの書き込み(読み込み)は以下の順序で行いました。

  1. FILE構造体を定義する
  2. fopenで、/dev/rt~ を書き込みで開く
  3. fprintf(fgetc)で書き込み(読み込み)を行う
  4. fcloseでプログラムからファイルを閉じる

Lチカ、スイッチ入力のサンプルプログラムは以下の通りです。

sample program(lチカ、スイッチの入力)

次回やること

今後のプログラムではオブジェクト指向を取り入れていきたいと考えています。

次回以降は、周辺機能をクラスにまとめていきたいと思います。

 

続きを読む ›

Posted in Raspberry Pi Mouse


Raspberry Pi Mouse 研修[4]

今回は足立法の実装を行いました。

足立法の解説はマイクロマウスの競技に参加している方のブログや、弊社のblogのマイクロマウスのアルゴリズムについて①等にたくさんのっているので、そちらを見てみてください。

c++には、標準のライブラリでキューがあったので、キューを使用した歩数マップの更新のプログラムを書きました。

maze

足立法の次の動作を決める関数は空白にしたので、各自考えてみてください。

次の動作を決める関数を実装することでCUI上で、マウスがゴール座標に到達するまでのシミュレーションを動かすことができます。

また、mazeクラスのshow関数を使用することで壁情報の表示を行うことができ、CUI上でシミュレーションをすることもできるようにしました。

 

次回やること

ハードウェアのプログラムに戻り、周辺機器の設定プログラムを書いていきます。

 

 

 

続きを読む ›

Posted in Raspberry Pi Mouse


Raspberry Pi Mouse 研修[3]

こんにちは。seyaです。

今回は、迷路の壁情報の保存のプログラムをc++で書いてみました。

壁情報の保存の仕方は、クラシックマウスの迷路が16*16マスあることから縦、横がそれぞれ17こあるという考え方をもとに行いました。

縦、横壁の一次配列を2つ作成し、それぞれの配列の変数のビットに壁情報を保存するという方法をとりました。この方法の問題点は、プログラムをぱっとみたときにわからないということがあります。

なぜこの方法をとるかというと、マイクロマウス競技で使用されているマイコンではメモリをふんだんに使うことができないため、メモリの節約を意識したプログラムを書くことが多いです。

今回は、メモリを意識(?)してみました。

ソースコードは以下の通りです。

迷路で使用する変数を書いたヘッダファイル、マップ情報を保存するためのヘッダ、ソースコードです。

map

ここに挙げたソースコードでは、表示ができませんが、表示をすると下記の写真のようになります!次回以降に表示方法を書いていきたいと思います!

ソースコードを書いてから気づきましたが、ラズベリーパイのメモリはふんだんにあるので気にする必要がそこまでなかったような気がします。

メモリを意識しないでロボットを動かすためのソースコードをかけるのはいいですね!

 

次回やること

今回のマップ情報を使用して、マイクロマウスの迷路探索アルゴリズムでよく使用される足立法の実装を行う!

 

 

続きを読む ›

Posted in Raspberry Pi Mouse


Raspberry Pi Mouse / Cat を遠隔操作(音声通話編)

1.はじめに

こんにちは.鈴本です.
前回の記事「Raspberry Pi Mouse / Catを中継サーバー経由で遠隔操作」の続きとして
双方向音声通話機能を実装しました.

構成は前回記事と同様,

ロボット

  • Raspberry Pi Mouse / Cat
  • Ubuntu Server 16.04.5 LTS (Xenial Xerus)
  • Node.js v10.14.2

PC

  • Microsoft Windows 10 Home 1803 (64bit)
  • Google Chrome 72.0.3626.121 (Official Build) (64bit) or Firefox 65.0.2 (64 bit)

中継サーバー

  • Raspberry Pi 3 Model B
  • Ubuntu Server 16.04.5 LTS (Xenial Xerus)
  • Node.js v10.14.2

通信プロトコル

  • WebSocket

です.

また,これも前回同様ソースコードは
ソースコードを GitHub で公開しています.

どうやら,ChromeブラウザからPCのマイクへアクセスするには,
サイトがHTTPSであることが必須なようで,マイクの動作確認はFirefoxのみで行いました.

2.実装(ロボット→PC)

Node.jsの以下の2つのモジュールを利用しました.

ロボット側は

なかんじで,PC側も

なかんじ.

ロボット側ではマイク入力を, mic_input_stream のイベントを監視して取得し,WebSocketに流し,
PC側ではそれを中継サーバー経由で受け取って,Web Audio APIであるAudioContextで再生しています.

PC側のコードで,音声が途切れ途切れにならないようになっている部分は,
WebAudio+WebSocketでブラウザへの音声リアルタイムストリーミングを実装する
を参考に実装しました.

3.実装(PC→ロボット)

ラズパイでのスピーカーでの再生には,Node.jsの

モジュールを使いました.

ラズパイにRaspbianをインストールしていると,ラズパイ上のオーディオジャックが簡単につかえるのですが,
代わりにUbuntuをインストールしている環境では, /boot/config.txt を編集する必要があるようです.
(出典:How to enable sound on Raspberry Pi 3 running Ubuntu 16 –

続きを読む ›

Posted in Raspberry Pi Cat, Raspberry Pi Mouse, ブログ


Raspberry Pi Mouse 研修[2]

こんにちは。seyaです。

本日の開発環境です!

上にモニターもあります。マウスの開発環境がキーボード,マウス、モニター、本体の4つでできるのがとてもいいですね!

手順書6の通り、UI用のledを光らせようとしましたが、rtled0なんてないよとエラーを返されてしまいました。

ラズベリーパイマウスの再起動を行うと、デバイス用ドライバの再インストールが毎回必要になるようです。

起動するたびにドライバのインストールをするためのコマンド打つのが大変なのでシェルスクリプトを書きました。

  • 使用する際にはecho 数値 /dev/rt*の間に > を入れてください。(例: echo 1 > /dev/rtled0)

ターミナル上で実行することでドライバを使用できるかどうかの 確認まで自動で行うことが可能になりました。どこかでエラーがあった場合は、ターミナル上にエラーが帰ってくるので確認が簡単にできます。

ターミナル上で実行する場合は以下のコマンドを入力することで可能です。

 

また、シェルスクリプトをラズベリーパイのスタートアップに追加をすることで、わざわざ自分で実行をしなくとも起動時に自動で実行するようにするということも可能なので後日紹介したいと思います。

 

説明書の手順に戻ります。

今回の内容は以下のことを行いました。

  • led,buzzerがそれぞれ光る、音がなるかの確認
  • 距離センサの値がとれるかどうかの確認
  • ステッピングモーターが回るかどうかの確認
  • c言語,pythonを使用したサンプルコードを動かしてみる

これらすべてを順調に行うことができました!

ステッピングモーターの回るかどうかの確認において、ステッピングモーターを回す際の注意点がいくつか分かったので紹介します。

ステッピングモーターを回すためには物理スイッチ、ソフトウェアスイッチの両方をONにする必要があります。

両方をONにすることでトルクがかかるようになりますが、長時間その状態にしておくと、最大で100度まで上がってしまうことや、モーターが壊れてしまうことがあるので、使わないときには必ず両方のスイッチを切りましょう!

また、ステッピングモーターの特性上遅い速度で回すと熱を持ちやすいので、遅い速度で回し続けるときは気を付けてください。

意外な落とし穴ですが、ステッピングモーターを回す際にはラズベリーパイのマウスの本体を浮かすようにしましょう!そうしないと、状況によってはマウスが机から落ちてしまい、マシンが壊れるという最悪の事態が起きてしまう可能性が浮上します。

 

今後の予定

マイクロマウスの迷路を完走するためには大雑把に以下の内容が必要になるため、これらをひとつずつ進めていきたます。

  • ステッピングモーターを用いて指定した距離進む、超信地旋回をできるようにする
  • マイクロマウスの迷路アルゴリズムを書く
  • 迷路の探索を行うことができる
  • スラロームの実装をする
  • 最短走行を行う

 

続きを読む ›

Posted in Raspberry Pi Mouse


Raspberry Pi Mouse 研修[1]

初めまして。こんにちは。アルバイトのseyaです。

アルバイトの研修として、弊社が販売する[Raspberry Pi Mouse V2]を動かしていきます。

動作までの過程をブログにつづっていきます。

Raspberry Pi のセットアップ

Raspberry Pi Mouse V2取扱説明書の手順に沿って開発環境のセットアップを行いました。今回は、説明書の5の内容まで行います。

以下の手順で行いました。

  1. PCを用いて、ラズパイOSをMicroSDに書き込む
  2. ラズベリーパイでOSのインストールを行う。
  3. SPI機能をオンにしてGitHubからRaspberry Pi Mouseのリポジトリをインストール
  4. カーネルのバージョンの確認を行う。
  5. ラズベリーパイマウスのドライバをインストールする。

1~4までは順調に行うことができましたが、5.で問題が起きました。

ラズベリーパイにインストールされたカーネルのバージョンが4.14.98-v7+でしたが、./RaspberryPiMouse /lib/Pi2B+/内に4.14.70-v7+よりも新しいカーネルバージョンの、ドライバのディレクトリがありませんでした。

この問題の解決を行うために、ラズベリーパイのカーネルのバージョンを4.14.70-v7+にダウングレードしました。

しかし、4.14.70-v7+のディレクトリ内で

と、説明書通りのコマンドを実行しても、Segmantion faultがターミナル上に表示され、ドライバのインストールができませんでした。

カーネルのバージョンを4.14.69-v7+に再挑戦をしたところインストールに成功しました。

 

ラズベリーパイのカーネルバージョンのダウングレードの仕方を紹介します。

GitHub のラズベリーパイのカーネルの更新リポジトリのコミットの中から4.14.14.69-v7+を探し、commit のhash番号をコピーしたのち、ターミナル上で

これらのコマンドを実行をすることでできました。

 

次回やること

説明書の手順6から先をやっていきたいと思います。

続きを読む ›

Posted in Raspberry Pi Mouse