2017年12月30日土曜日

ROSのimage_geometryを使ってみた。

tf上の点を画像の上に表示するためのパッケージであるimage_geometryを試してみました。チュートリアルを動かしただけで中身はよくわかっていませんが。
オムニホイールで移動→オドメトリから自分の位置を計算→targetの相対位置を計算→画面上に表示(ここがimage_odometry)でも思ったよりは精度が良かったです。
カメラは事前にキャリブレーションをしています。キャリブレーションで画角なども自動で計算してくれるみたいですね。

新型ロボットSRS004始動

現在作っているオムニホイール+エアガンのロボットが大体完成しました。プロジェクト名はSRS004で、エアガン搭載のオムニホイールで移動するロボットです。


オムニホイールを使用した滑らかな移動、エアガンの射撃、強力な前照灯のデモをご覧ください。

移動機構

オムニホイールをエンコーダー付きモーターで駆動しています。モーターはAliexpressで販売しているものを使っています(国内販売が無い)。モータードライバは前に紹介したVNH5019を使用(だいぶオーバースペックですが)。専用基板を起こしました。

 エアガン


今回も昔と同じ電動ガンボーイズのメカボックスを使用しました。しかしハーネスやマガジンを昔はアルミで使っていたものをすべて3Dプリンタやレーザーカッターで製作できるように設計を変更し、部品点数が大幅に削減されました。

ヒットセンサー

ロボット同士でサバゲーをするならロボットに弾が当たったことを感知できなくてはなりません。エアガンが当たった衝撃を感知するヒットセンサーを製作しました。

2017年11月15日水曜日

新型ロボットSRS004仮組み

現在設計している新型ロボットの仮組みが出来て、一通りの動作確認が出来ました。一部届いていない部品があるので完全には動きませんが大体動いています。
(電源ノイズの問題がまだ残っているけど......)

重さは完成で2.4kg程 1機4万円ほどで作れそう
量産したいな。

新ガンモジュール射撃動画

アルミ部品でできていた旧ガンモジュールを3Dプリントとレーザーカッターの部品で設計しなおした新モジュールの動作確認が出来ました。このモジュールではCANバスからの指令で
  • 2つのサーボによる旋回角、仰角の回転
  • レーザーサイトのON、OFF
  • エアガンの射撃
が出来ます。
オリジナルのマガジンは電動で、ステッピングモーターで歯車状の部品を回転して弾をチャンバーに送り届けています。またエアガンのギアボックスの動作レバーをマイクロスイッチで読み取ることにより正確な弾数を発射できます。

2017年11月8日水曜日

被弾センサー完成

今まで設計していた被弾センサーの動作確認が完了しました。
真ん中の緑の板(プリント基板)の裏に加速度センサーが付いていて、加速度の微分値(躍度)がある一定値(大体2.5kG/s)を超えたら反応するようになっています。
しかし、ただ板の加速度を取っただけでは取り付けているロボットの移動の振動や、ターゲット以外のロボット本体に当たったときの振動でも反応してしまっては意味がありません。今回はターゲットと外枠をゴムで宙吊りにすることで外枠からの振動をシャットアウトしています。
センサーは秋月のアナログタイプの物を使っています。 ターゲットには赤と黄色のLEDが外側に配置しています。サバゲーでは赤と黄色でチーム分けをするのでその表示も兼ねています。
今後実際にロボットに載せてエアガンでの撃ち合いをする予定です。

2017年11月2日木曜日

mbed(lpc1768)で複数の周期のPWMを使う方法(Motor Control PWM の使い方)

今回私の工作でサーボモーター用のPWM(周期14ms)とモータードライバの駆動用のPWM(周期10us: 100kHz)の2系統のPWMを使う機会がありました。LPC1768はPWMが6本ついているので足りると思い基板を製作してプログラムを組んでから気づいたのですが、
「LPC1768の6つのPWMの周期はすべて同じになる」
という落とし穴に気づきました。新しく基板を製作するのも手間なので対策をWebで調べていたところ「Motor Control PWM(以下MCPWM)」というモジュールに気づきました。この名前のモジュールがPWM用のモジュールとは別にあり、これを使うと複数の周期のPWMが使えそうです。
ただ残念ながら青mbedではMCPWMのピンは出ていません。改造mbed専用になります。

概要

このモジュールは名前の通り、モータードライブ用のモジュールです。正確に言うとブラシレスDCモーター(BLDC)駆動用の3相の矩形波を出すためのモジュールです。オリエンタルモーターのページに解説があります。以下がブロックダイヤグラムです(LPC176Xユーザーマニュアルより)。



このモジュールですがBLDC用の波形も出せるのですが、3組のタイマー+マッチレジスタが基本的な構成要素です。

ピン

MCOA0、MCOB0、MCOA1、MCOB1、MCOA2、MCOB2の6つの出力ピンがあります。
timer channelが3つありそれぞれの出力がA、Bの2つがあります。出力のAとBは基本的に逆位相(+デットタイムの設定)になるためにPWMとしては実質3つの出力になります。
通常のPWMとMCPWMを比較すると
Pin       PWM    MCPWM
P1.18    PWM1
P1.19                MCOA0
P1.20    PWM2
P1.21    PWM3
P1.22                MCOB0
P1.23    PWM4
P1.24    PWM5
P1.25                MCOA1
P1.26    PWM6    MCOB1
P1.27
P1.28                MCOA2
P1.29                MCOB2
というピン配置になっています。頑張ると最大で9つのPWMがLPC1768で使えます。

レジスタ説明

レジスタ名はmbed onlineコンパイラで使える名前です。[]内はビット位置
■Power Control Register (LPC_SC->PCONP)
[17]MCPWM control bit
MCPWMは初期設定で無効になっているので設定は必須です。

■Peripheral Clock Selection registers 1 (LPC_SC->PCLKSEL1)
[31:30]Peripheral clock selection for the Motor Control PWM
00 PCLK=CCLK/4
01 PCLK=CCLK
10 PCLK=CCLK/2
11 PCLK=CCLK/8
MCPWMへの入力クロックの設定です。Mbedの基本設定だと、CCLK=96MHzです。

■Pin Function Select Register 3 (LPC_PINCON->PINSEL3)
[7:6]P1.19(MCO0A)
[13:12]P1.22(MCO0B)
[19:18]P1.25(MCO1A)
[21:20]P1.26(MCO1B)
[25:24]P1.28(MCO2A)
[27:26]P1.29(MCO2B)
00 Other
01 MCPWM
10 Other
11 Other
ピンの機能選択です。使うピンだけ01に設定してください。

■MCPWM Control read address (LPC_MCPWM->MCCON)
■MCPWM Control set address (LPC_MCPWM->MCCON_SET)
■MCPWM Control clear address (LPC_MCPWM->MCCON_CLR)
[0]Stops/starts timer channel 0
[2]Selects polarity of channel 0
[8]Stops/starts timer channel1
[10]Selects polarity of channel 1
[16]Stops/starts timer channel 2
[18]Selects polarity of channel 2
Stops/starts...を1にすると該当するチャンネルのタイマーが動作します。
Selects polarityは出力を反転します。
読み込むときは一番上のレジスタを、レジスタの一部を1にしたければSetレジスタ、0にしたければClearレジスタに「1」を書き込みます。
普通のレジスタと書き込みが違いますね、ARMコアのペリフェラルでたまにある構成です。

■MCPWM Limit 0-2 registers (LPC_MCPWM->MCPER0、MCPER1、MCPER2)
[31:0]Limit values for TC0, 1, 2.
タイマーの上限値を設定します。この値と一致するとタイマーの値は0に初期化されます。
データシート中では「MCLIM0-2」という名前ですが、Mbedのライブラリではこの名前です(何かとの互換性のため?)。

■MCPWM Match 0-2 registers (LPC_MCPWM->MCPW0、MCPW1、MCPW2)
[31:0]Match values for TC0, 1, 2.
タイマーの一致の値を設定します。
このレジスタもデータシート中では「MCMAT0-2」という名前ですが、変更されています。

プログラム例

// Power up MCPWM
LPC_SC->PCONP |= 1<<17;

// PCLK = CCLK (100MHz in our case)
LPC_SC->PCLKSEL1 |= 1<<30;

// Configuring P1.22 as MC0B
LPC_PINCON->PINSEL3 |= (1<<12);

//  Start MCPWM channels 1 and 2 and POLA = 1
LPC_MCPWM->MCCON_CLR = 0xffffffff;
LPC_MCPWM->MCCON_SET = (1<<0);

// Set the Limit register
LPC_MCPWM->MCPER0 = 960;

//Set the match register
LPC_MCPWM->MCPW0 = 96;

P1.22(MCO0B)を出力に設定しています。MCPWMに入っているクロックは96Mhzでそれを960で文集するので100kHzになります。また96/960=10%のデューティー非になります。

参考

https://os.mbed.com/users/mbed2f/notebook/mcpwm-in-lpc17xx/

2017年10月11日水曜日

オリジナルロボットでrviz、gazebo2-1: URDFファイルの記述

オリジナルのロボットモデルをURDFで記述して、それをrviz上で表示することを目標とします。
まずロボットモデルの記述ですがこれはURDFで行います。基本的にはROS Wikiを参照すればよいので、今回は大まかなところを注意点しか書きません。

パッケージの構成を以下のようにします。(黒はパッケージ作成時からあるもの、青は手動で追加するもの)
/package_name
   /src
   /include
   /urdf
     /robot.urdf
   /launch
     /display.launch
   /config
  /CMakeLists.txt
  /package.xml

この記事ではロボットモデルを記述するrobot.urdfの書き方と、モデルの確認を行うdisplay.launchの2つのファイルを書いていきます。

基本の表示

URDFの書き方


ロボットを可動部分で分割した部分であるlinkをjointでつなげてロボットを作ります。今回は2輪で動作するロボットを製作します。2つの動輪と2つの補助輪があるイメージです。
しかしとりあえず初めは上記のような複雑なことをせずにただの物体を表示することを目標とします。

##### robot.urdf #####
<robot name="my_robot">
  <link name="base_link">
   <visual>
     <geometry>
       <cylinder radius="0.15" length="0.10" />
     </geometry>

   </visual>
 </link>
</robot>

##### end #####

上記で原点を中心とする円柱を持つロボットモデル(これをロボットモデルというのは微妙ですが)が完成しました。
<link>タグに挟まれたところがlinkの定義です。name属性で名前を付けます。その下の<visual>タグで挟まれているのは「表示される形状」です。これとは別に衝突判定の形状を定義することが出来ます(衝突判定用の形状は処理を軽くするために細部を省略した形状を当てはめることが多い)。
geometryタグの中は形状の定義です。基本形状として、box、cylinder、sphere、それとstlファイルを読み込むmeshがあります。cylinderはz軸が軸になります。
各タグの詳細な意味はhttp://wiki.ros.org/urdf/XML/linkを見てください。

Launchの書き方

Launchではモデルのロードとrvizの起動を行います。

##### display.launch #####
<launch>
  <arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
  <param name="robot_description" textfile="$(arg model)" />
  <node name="rviz" pkg="rviz" type="rviz" />
</launch>

##### end #####

model変数に先ほど作ったurdfファイルの場所を入れて、その内容をrobot_descriptionというrosparamに格納します。疎下4行目でrvizの起動を行います。

次にTerminalに移ってlaunchを行います。

$roslaunch package_name display.launch

このようにroslaunch <パッケージ名> <launchファイル名>とコマンド入力することでlaunchファイルを実行します。rvizが表示されるのですが、初期状態では以下の様に何も表示されないのでrvizの設定を行います。
この時roslaunch paぐらいまで売った後にtabキーを押せば保管されるはずです。しかしrosの仕様なのかpackageを作った後の初回時だけは補完をしてくれません。


  1. displaysウィンドウのGlobal Options→Fixed Frame の中身をmapからbase_linkに書き換える。
  2. displaysウィンドウ下部のAddボタンを押しBy display_tipeタブの中でrviz→RobotModelを選択してOKボタンを押す。
すると以下の様にモデルが表示されます。(もしかしたら色が灰色になるかもしれません)


毎回この設定をするのは面倒なのでrvizの設定ファイルを製作してそれを読み込み用にします。
上記のrviz上でモデルが表示されている状態でメニューバーからFile→Save Config Asを選択します。これをはじめに作ったフォルダのpackge_name/config/SETTING.rvizとして保存します。
この設定ファイルを起動時に読み込むためにlaunchを編集します。

##### display.launch #####
<launch>
  <arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
  <param name="robot_description" textfile="$(arg model)" />
  <arg name="rvizconfig" default="$(find package_name)/config/SETTING.rviz" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
</launch>

##### end #####

こうすることで

$roslaunch package_name display.launch

だけでモデルが表示されます。

ロボットモデルの製作


他の部品も加えます。

##### robot.urdf #####
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
  <!-- links -->
  <link name="base_link" />

  <link name="body_link">
    <visual>
      <geometry>
        <box size="0.400 0.200 0.140"/>
      </geometry>
      <material name="gray">
        <color rgba="0.8 0.8 0.8 1.0"/>
      </material>
    </visual>
  </link>

  <link name="left_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.100" length="0.050"/>
      </geometry>
      <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <link name="right_wheel_link">
    <visual>
      <geometry>
        <cylinder radius="0.1" length="0.05"/>
      </geometry>
      <material name="green">
        <color rgba="0.0 1.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <link name="caster_link">
    <visual>
      <geometry>
        <sphere radius="0.080"/>
      </geometry>
      <material name="gray"/>
    </visual>
  </link>

  <!-- joints -->
  <joint name="body_joint" type="fixed">
    <parent link="base_link"/>
    <child link="body_link"/>
    <origin xyz="0.000 0.000 0.150"/>
  </joint>

  <joint name="left_wheel_joint" type="continuous">
    <parent link="body_link"/>
    <child link="left_wheel_link"/>
    <origin rpy="-1.5707 0 0" xyz="-0.100 0.105 -0.050"/>
    <axis xyz="0 0 1"/>
  </joint>

  <joint name="right_wheel_joint" type="continuous">
    <parent link="body_link"/>
    <child link="right_wheel_link"/>
    <origin rpy="1.5707 0 0" xyz="-0.100 -0.105 -0.050"/>
    <axis xyz="0 0 -1"/>
  </joint>

  <joint name="caster_joint" type="fixed">
   <parent link="body_link"/>
   <child link="caster_link"/>
   <origin xyz="0.100 0 -0.070" />
   <axis xyz="0.0 0.0 1.0"/>
  </joint>
</robot>

##### end #####

<visual>タグの中に<material>というものが増えました。
<material name="gray">
  <color rgba="0.8 0.8 0.8 1.0"/>
</material>
これはrviz上での色を定義するものです。
$ cd ~/catkin_ws/package_name
$ check_urdf robot.urdf
とするとurdfファイルが正しいかが分かります。

オリジナルロボットでrviz、gazevo1-2: rosの準備

ROSの準備

wikiについて

ROSには公式のwikiがあって、それがだいぶ充実しています。日本語化も一部していて、初心者が見るようなところは丁寧に日本語になっているので、実際はROS wikiを見て学ぶのが一番です。
  • wiki;
    http://wiki.ros.org/ja
  • インストールについて
    http://wiki.ros.org/kinetic/Installation/Ubuntu
    (日本語のページは古いバージョン(indigo)の内容なので少し違います)
  • チュートリアル
    http://wiki.ros.org/ja/ROS/Tutorials
    長いですがこれで一通りすべてが学べるので良い

1.インストール

前の記事で概要を示したので今回はROSのインストールを行います。ROSは色々なツールからなっていてその環境は複雑です。そのためにインストールはROSの最初の関門です。しかし環境さえ間違えなければ以下のスクリプトでインストールが出来ます。

環境
  • x86系のPC(普通のPCのこと、Raspberry Piは不可:ここを参照)
  • Ubuntu 16.04
インストールするのはROSのKineticというバージョンです。インストールには1時間ほどかかります。少なくともクリーンインストール状態からでの動作を確認しています。

###### script ######
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get -y update
sudo apt-get -y upgrade

sudo apt-get -y install ros-kinetic-desktop-full
apt-cache search ros-kinetic

sudo rosdep init
rosdep update

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

source /opt/ros/kinetic/setup.bash
sudo apt-get -y install python-rosinstall
###### script end ######

2. catkin_wsの製作

上記でROS自体のインストールが完了でここからcatkin workspaceを製作します。これはrosにおけるコンパイルを行う単位です。フォルダを製作して、一度makeをしてセットアップファイルの読み込みを行います。

###### script ######
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
###### script end ######

3.パッケージの製作

パッケージというのはROSの単位で、1つの機能を持ったソフトの集合です。例えばロボットアームに対応したパッケージ、色々場パッケージを統合して台車ロボットを制御するパッケージ等があります。またgitなどで分配するときでの最小単位になります。 package_nameは任意のパッケージ名でその後ろは依存するパッケージの一覧です。とりあえず以下の様にしておけば良いでしょう。

###### script ######
cd ~/catkin_ws/src
catkin_create_pkg package_name std_msgs rospy roscpp
###### script end ###### 

オリジナルロボットでrviz、gazebo1-1: 概要

概要


rvizとgazeboはロボット開発においては大変便利なROSに付属しているツールです。rvizは可視化ツールと呼ばれていてロボットの状態をGUIで表示するツールです。gazeboは物理シミュレーターでして、実機が無くてもロボットの動作をシミュレーションすることが出来ます。
これらはROSのツールに組み込まれていてROSとの親和性が高いのですが、やはり使い方が難しく、設定項目が多いために使うのは困難です。メモもかねてここに設定の仕方を残しておきます。

Rvizは下の図の様にロボットの状態を表示するツールです。このツール自体はシミュレーターではなく、ロボット実機やシミュレーションから出力されるタイヤの回転やロボットアームの関節角をデータをGUIに表示するツールです。また3次元空間上での表示に特化したシステムになります。
ロボット実機が動いている場合このツールの存在意義はあるのかと思ってしまうのですが、実機のロボットの状態を確認するもなかなか面倒なものです。またコンピューターからのコマンド通りにロボットが動いているのかといったことも確認できます。
またプラグインを使うことで電流値やエラー情報等も下の図のようにすっきりと表示することが出来ます。


gazeboは物理シミュレーターです。rosと連携していてROSのロボットモデルにいくらかの(という名の大量の)データを付加するだけでロボットモデルの物理シミュレーションができます。物理シミュレーションのカーネルはODEを使っています(ほかのシミュレーションカーネルと入れ替えできるらしいが不明)。ODEによる動力学、接触のシミュレーションができるだけでなく、カメラ画像を取得したり、LIDER(レーザーを使ったレーダー)のシミュレーションもできます。
ロボットの動力学シミュレーション(制御器など)よりもセンサーのシミュレーションに使われているという印象がある。
以下では2軸のロボットアームのシミュレーション画面で各関節には力駆動のモーターが入っていてそれをPID制御器でコントロールして関節を曲げることが出来ます。


構成

  1. ROSの準備
  2. URDFを学ぶ
    urdfはrosでロボットの形状や機能を定義するためのファイル形式で実態はxmlです。このファイルで形状を表すlinkに形や重さの属性を付与して、linkとlinkの接続点をjointで定義してロボットを製作します。
  3. Rvizで表示する
    rvizで上記のurdfを読み込んで表示します。
  4. gazeboで動かす
の順に説明していきます。

2017年9月29日金曜日

LPC1768で書き込みが出来ない。

私は色々なところに自作のmbedクローンを使っているのですが、初回書き込み時に書き込みがエラーになるという現象にたまに遭遇します。LPC1768はAliexpressから買った怪しい品なのでそれが悪いのかも?
書き込みはlpc21ispを(DDKarmToolというラッパーでGUIにして)使っています。現象としては書き込みのウィンドウが出た後しばらくしたらウィンドウが消えてしまい、書き込みがなされません。
そこで今度はFlash Magicというツールで見てみます。接続が確認された後、ISP→Read Securityで確認したところCode Read Protection (CRP)が掛かっていました。これはマイコン内部のイメージを吸い出しできなくする機能で、簡単に言うとコピー防止ですね。
ISP→Flash All(確か)をするとCRPごと中のイメージが全部消えるので正常に書き込みができるようになります。

2017年9月25日月曜日

次期ロボットSRS004

MFTに出展するなどがあり、今後のロボット製作の方針について考える機会がここ数か月に多くありました。今まで惰性でロボットを作っていて、いわば基礎技術開発のようなことをしていました。しかし結局作っているだけに終わってしまい、ロボットで何かするというところまでたどり着きませんでした。そこで今後は「安く」、「量産できる」、「遊べる」をもっとに新型を作り完成したロボットを使って遊べることを目指します。
とりあえず遊べるロボットを作り、ロボットで遊んだところどうなのか、どうすると良くなるのかについて考えていきたいと思います。
基本設計は実は完了しています。
足回りはオーソドックスに3軸のオムニホイール、しかしエアガンが付きます。個人的にエアガンは気に入っていて、撃ち合い(理想はFPS)が出来るロボットにしたいと思います。緑の板が前に紹介したヒットセンサーでこれを使えばロボット同士で撃ち合いが出来ます。
エアガンの取り付け具のところを試作しました。今まではここをアルミの削りだしで作っていたのでコストが高かったのですが、3Dプリンタとレーザーカッターを使えばいくらでも作れますね。

2017年9月20日水曜日

Maiker Faire Tokyo 2017の電波状況

もう1か月以上たってしまいましたけどMFT2017お疲れさまでした。
MFTの直前で当日の源波状況がとても気になったので、来年のためにレポートしておきます。

WiFiについて

WiFiには十分気を付ける必要があります。WiFiには2.4GHz帯と5GHz帯がありますが、結論から言うと2.4GHzは激混みでしたが、5GHzは普通に使えます。
僕はROS環境でリモートにあるロボットに積んだWebカメラの画像を見るというアプリを動かしていたのですが5GHzで通信したところ2日間何の問題もありませんでした。ただ2.4GHzで試しにつないだところSSHは通ったのですが、画像は送れませんでした。
僕はロボットを出していたので東8ホールだったのですが、一般の電子工作だと東7ホール割り当てられます。そちらの方がWiFiやBluetoothを使っている人が多そうなので、もしかしたらSSHすら通らないかもしれません。

インターネットについて

まずビックサイトにはフリーのWiFiスポットはありません(あっても混んで使えなさそう)。また会場からネット回線を引いてもらうこともできません。しかしdocomoの有料のWiFiがあります。docomoを契約している人なら月300円、契約していなくても日300円ぐらいで使えます。当日使った感じはあまり安定していないけど、調べもの程度なら出来そうな感じでした。

Raspberry Pi で5GHz帯の使い方

Pi 3でも2.4GHz帯しか使えません。家ではこれで大丈夫でも会場ではこれでは動かなくなってしまいます。そこで5Gz帯を使おうと思ってWiFiドングルを調べたのですが、5GHzが使えるものは標準のドライバーで動くものは無く、ソースを落としてコンパイルしたり、物によってはカーネルをバージョンアップする必要があります。なかなか面倒でこんなところで時間を使いたくないので今回はポータブルルーターを使いました(ポケットWiFiではない)。具体的にはエレコムのWRH-583XX2を使いました。ポータブルルーターとは本来はホテルに優先のネットしか着ていないときに、それを無線に変換するもので中身はただのWiFiルーター/APです。ただUSB電源で駆動するようになっているのでロボットに簡単に組み込めます。
またこの製品には子機モードというものがあって、上記の動作の逆で、無線子機として接続するモードがあります。これを使って
Raspberry Pi3<--Ethernet(有線)-->WRH-583XX2-S(子機モード)<--5GHz Wifi-->WRH-583XX2-S(ルーターモード)<--5GHz Wifi-->PC
という構成にしました。Raspberry Piはただ有線でつなげるだけなので特別な設定要りません。

2017年9月12日火曜日

マジックポインター紹介

現実と機械を結ぶデバイス:マジックポインター

従来のジョイスティックを使用した操作では、ロボットの位置や向きを考慮してロボットに移動方向を指示する必要がありました。マジックポインターなら、レーザーポインターで指した位置をコンピューターシステムが認識して自動でロボットを動かします。
今までロボットというと専属のオペレーターが動かすことがほとんどでしたが、マジックポインターを使えばより直感的ににロボットが操縦できるために人とロボットとの新しい共同作業の可能性を秘めています。


ミッション

ロボット技術の進展によりロボットが徐々に身近になってきています。しかし実際に普及しているロボットは工場内での生産用ロボットかせいぜい家庭向けのコミュニケーションロボットぐらいというのが現状です。今後ロボットが様々な場面に入り込み人と協調作業を行うことが予想されます。しかし現状のジョイスティックというインターフェイスではこの協調作業を十分に行うことが出来ません。
今後の人とロボットが協調作業をする未来に向けて新しいロボットインターフェイスが必要です。

システム

マジックポインター

一見ただのレーザーポインターですが、Viveコントローラーを使っていて、ポインター自身の位置、姿勢を取得することが出来ます。このマジックポインターで床を指すと、コンピューターはポインターの位置、姿勢からポインターで指した場所の座標を計算します。
現在の実装では床しか指すことはできませんが、将来的にはレーザー距離計を内蔵し、ありとあらゆるものを指し、座標を取得できるように改良されます。

ロボット

全方向移動ロボットにViveコントローラーを搭載し、ロボットの位置をリアルタイムに取得しています。これによりロボットから見てポインターで指されている位置がどの方向に見えるのかが計算できるために、ロボットを自動的に操縦することが出来ます。


HTC Vive LightHouse & コンピューターシステム

マジックポインター、ロボットの位置、姿勢をリアルタイムにセンシングして、ロボットを自動的に操縦しています。

動画1

説明用の動画です。


動画2

上記の動画1の中での動作デモは実はインチキ(裏で手動で動かしている)なので本当に動いてる様子を載せます。



2017年9月3日日曜日

STmicroのモータードライバ

ロボットを作っていて意外と悩むのがモータードライバです。モータードライバの使い方として
  1. モータードライバモジュールを使う
  2. モータードライバICを使う
  3. トランジスタでHブリッジを使う
僕は自作にこだわるので1は無いのですが、2と3で迷いどころです。最大1AぐらいならモータードライバICはいくらでもあるのですが、表面実装であること、最大4Aぐらい欲しいとなかなかありません。しかしSTmicroからなかなか良いICが出ています。それがVNH3SP30、VNH2SP30、VNH5019です。pololuのページを見れば分かりますが、主な違いを抜き出します。
  • 共通
    • パワー電源: 5.5-16V
    • 1ch
  • VNH3SP30
    • ロジック電源: 5V
    • 最大PWM: 10kHz
    • 最大平均電流: 9A
    • 電流センサー: なし
  • VNH2SP30
    • ロジック電源: 5V
    • 最大PWM: 20kHz
    • 最大平均電流: 14A
    • 電流センサー: あり
  • VNH5019
    • ロジック電源: 3.3V、5V
    • 最大PWM: 20kHz
    • 最大平均電流: 12A
    • 電流センサー: あり
基本的に3.3Vでも使えるのでVNH5019が良いかと思います。IC単体は国内では朱雀技研でしか買えません。1つ1500円ぐらいします。しかしおなじみのAliexpressなら1つ300円台で買えるみたいです。よほどのモーターでない限りはこれで足りますね。

URDFのplanarとfloatingの扱い

ROSでロボットの情報をURDFというファイルで記述します。URDFではロボットをLinkという単位で分けて、それをJointでつなげることでロボットを記述します。ROSwikiにあるようにjointには以下の6種類があります。
  • fixed(固定)
    例えばねじ止めをしている部品同士など固定されているものを表すタイプです。
  • revolute(回転1自由度)
    いわゆるヒンジで、回転できるジョイントですが、回転できる範囲に制限があります。
  • continuous(回転1自由度)
    タイヤの軸などを表すもので、回転するジョイントですが回転範囲に制限がありません。
  • prismatic(並進1自由度)
    リニアガイドやピストンなどの直線的に動くジョイントです。
  • planar(並進2自由度、回転1自由度)
    イメージとしては面と面がくっついている物で、上下左右に動けるのと回転が出来ます。例えば移動ロボットが地面に接触しているのを表すのに使えます。
  • floating(並進3自由度、回転3自由度)
    地面とドローンの関係など、いわば何も拘束が無い状態を示します。
自作ロボットのurdfを製作するブログ記事ではロボットのジョイントを動かす簡易的な方法としてjoint state publisherのGUIを使っています。これは記事を見てもらえばわかるのですが、rvizを起動するとスライダーのウィンドウが出てきて、スライダーを動かすとロボットが動くというものです。
またこのGUIを使わずにプログラムからrviz上のロボットを動かすために/joint_statesというROS topicを通じてjoint_state_publisherにデータを投げることが出来ます。
このようにjoint state publisherによって簡単にrvizでロボットを動作させれるのですが実はjoint state publisherは2自由度以上のジョイント(planarとfloating)に対応していません。joint state publisherではこの2つのタイプの関節はfixと同じものとして扱われます(つまり動かせません)。
ではこの2つのジョイントは使えないのかというとそうではなく、直接tfにデータを送れば動いてくれます。tfの使い方についてはまた別に記事を書きます。
ここで注意としてplanarでジョイントを作ってもtfでは初めに居た平面以外のところの座標も指定できます。またrevolute等の1自由度の関節もtfを使えば、本来設定できない位置を指定することも可能で、警告なども出ません。このあたりの拘束はユーザーの責任で満たさないといけないみたいです。

2017年8月16日水曜日

被弾センサーのテスト2

被弾センサーのテスト第2弾です。前回はナットドライバーで叩いただけでしたが、今回は実際にエアガンで撃ってみました。
 下の写真の様に被弾センサーから約1m離れたところからエアガンで撃ちます。(周りが散らかっていてごめんなさい)
撃った時の被弾センサーについている加速度センサーのZ軸(面に垂直な方向)のデータが以下です。2つの画像は別々の回です。上は1メモリ100ms、下は1メモリ50msです。各々2発弾が当たっています(本当は3発撃っているはずなんだけどな......)。
やはりエアガンを撃つと立ち上がりが急な波形が出来るみたいですね。ただ下のデータの様に絶対値がいつも振り切れるというわけではなさそう。


追記
詳細な波形の形が取れました。
右が1目盛り10msで左が1目盛り1msです。1ms以内にピークまで達するという条件でうまく検出できそうです。

2017年8月14日月曜日

ROSのPublish、Subscribeの遅れの対策

ROSで基本的なPub、Subをしていた時にどうもうまくいかないところがあったのでそれの対策をメモします。重要なところだけを抜き出すと下の様にmsg_pubとmsg_subを作って通信をさせてその遅延を測りました(本当は途中にデータの変換ノードがいくつかあったが)。本来ならいくらかの遅延が発生するだけなのですが、実際には送信受信するデータのずれや遅れが発生しました。
Publish側では、例えばdata0をpublish()しても実際はパブリッシュされず、次のループでdata1をpublish()すると実際はdata0がパブリッシュされるという現象です。
Subscribe側では、受信処理が行われるタイミングが受信してから1秒遅れるという不具合です。$rostopic echo /msg_outで表示されるタイミングよりも遅れて表示が起きます。
ネットを探したりと1時間ほど格闘していたら答えが分かりました。

Publisher側の解決策としては
ros::Publisher msg_pub = n.advertise<std_msgs_Float64>("/msg_out", 1000);

ros::Publisher msg_pub = n.advertise<std_msgs_Float64>("/msg_out", 1000, true);
に変更しました。
どうやらpublishをするとソケット通信をするプロセスが裏で立ち上がって、それが通信をするみたいです。しかし、元のスレッドが短い場合はタイミングの問題なのか1つ分をデータを内部でバッファしてしまうみたいです。ros::Publisherの3つ目のオプションであるlatchをtrueにすることでそれを防げます。

Subscliber側の解決策としては
ros::Rate loop_rate(1);

ros::Rate loop_rate(100);
に変更しました。
これはなかなか分かりにくい問題で、普通は受信処理はトピックが来たら即実行されると思っていたのですが、実はmain関数のfor文でloop_rate.sleep()している間は受信処理が起きず、スリープが解除されたときにトピックが来たら受信処理をするという仕様の様です。そのためにfor文中で何の処理をしていなくてもloop_rateはある程度細くしなければなりません。

==========msg_pub.c==========
#include "ros/ros.h"
#include "std_msgs/Float64.h" 

int main(int argc, char **argv)
{
    ros::init(argc, argv, "msg_pub");
    ros::NodeHandle n;
    ros::Publisher msg_pub = n.advertise<std_msgs_Float64>("/msg_out", 1000);
    ros::Rate loop_rate(1);
    while (ros::ok()){
        std_msgs::Float64 msg=1.0;
        msg_pub.publish(msg);
        //時間を計測
        ros::spinOnce();
        loop_rate.sleep();
    }
}
==========#####==========

==========msg_sub.c==========
#include "ros/ros.h"
#include "std_msgs/Float64.h" 

void msg_callback(const std_msgs::Float64& msg){
        //時間を計測
}
int main(int argc, char **argv)
{
    ros::init(argc, argv, "msg_sub");
    ros::NodeHandle n;
    ros::Subscriber msg_sub = n.subscribe("/msg_out", 10, msg_callback);
    ros::Rate loop_rate(1);
    while (ros::ok()){
        ros::spinOnce();
        loop_rate.sleep();
    }
     return 0;
}
==========#####==========

2017年8月10日木曜日

Raspberry PiとROSでロボット製作(インストール)

前の記事でRaspberry Pi3にUbuntu mate16とRos Kineticをインストールするという話をしました。今回はその方法を具体的に述べていきます。
  1. Ubuntu mate16用のイメージをSDに書き込み
  2. Raspberry Pi3上でUbuntu mateのセットアップ
  3. ROSのインストール
 という手順になります。

準備するもの

  • Raspberry Pi3
  • micro SDカード(8GB以上)
  • Raspberry Pi用の電源アダプタ
  • Raspberry Pi用のモニター、キーボード、マウス
  • Windows PC
  • インターネット回線(Wifi or 有線)

1. Ubuntu mate16用のイメージをSDに書き込み

Device Plusの記事を参考にしています。

  • イメージをダウンロード
    ダウンロードページ
    にアクセスします。「Ubuntu MATE 16.04.3 LTS」をクリック、その後に一番右の「Raspberry Pi」の部分をクリックします。

    下の方にスクロールしてVia Direct Downloadの部分の「Bytemark - ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz」をクリックしましょう。

    もしかしたらこの部分は時間がたつと更新されているかもしれません。バージョンが「16」であることが大切です。その時は読み替えを
  • 解凍
    Ubuntu mate16のイメージは「xz」というWindowsでは珍しい圧縮形式をしています。標準では解凍が出来ないので「Lhaplus」等のソフトを使って解凍してください。
  • SDの準備、SDのフォーマット
    SDカードのフォーマットに使います。セットアップのやり直しをしたりするときに使うのでここの段階でSDFormatterをインストールしておくと良いでしょう。ダウンロードサイトに行きまして、下の方の青い「Windows用ダウンロード」を押して次の画面の一番下の「同意します」を押すとインストーラーがダウンロードできます。それをインストールして起動しましょう。
    これでこれからイメージを書き込むSDカードを1度フォーマットします。オプション設定では論理サイズ調整をONにしておくと良いです。
  • DDWinでSDに書き込み
    イメージをSDカードに書き込みます。DD for Windowsというソフトを使います。ダウンロードページに行きダウンロードのところの最新バージョンをクリックします(おそらくver0.9.9.8のはずです)。zipなので解凍するとフォルダの中には「DDWin.exe」という実行ファイルがありますがこれを右クリックして「管理者として実行」を選択します。ディスク選択でSDカードを選び(おそらくすでに入力されているはずです)、ファイル選択で先ほどダウンロードしたUbuntu mateのイメージ(ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img のような名前をしている)を選択します。始めは.ddiファイルしか選択できないようになっているので、ファイルの選択画面で右下のドロップダウンリストでall filesに変更してください。最後に書き込みを押すと書き込みが開始されます。意外と長く10分ほどかかります。

2.Raspberry Pi3上でUbuntu mateのセットアップ

  • Raspberry Pi3の起動
    Raspberry Pi3にモニター、キーボード、マウスをつけて電源を挿します。しばらくすると立ち上がります。
  • 設定
    始めにWifiの設定を聞かれるので、Wifiにつなぐか、Ethernetを接続してください。後の設定は画面の指示通りに行ってください。30分ぐらいかかりますが、設定が終了すると再起動してログイン画面が出てきますのでログインしてください。
  • キーボード設定
    途中でキーボードの選択画面が出てきます。「日本語」→「OADG 109A」を選択するのが良いです。
  •  SSHの設定(オプション)
    いつかは必要になるのでここでしておきましょう。一番左上のMateのマークからたどってTerminal(Mate端末)を出します。
    $sudo raspi-config
    で設定画面が出てくるので、Interfacing Options→ssh→Enableで設定します。

3.ROS kineticをインストール

ROS Wikiに書いてある通りです。
  • リポジトリの登録
    $sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
    $sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
  • update
    $sudo apt-get -y update
    ($sudo apt-get -y upgrade)やってもよいが時間がかかるのでいつもは飛ばしている
  • ROSインストール
    $sudo apt-get -y install ros-kinetic-desktop
    ($sudo apt-get install ros-kinetic-desktop-full)←ROSのフルバージョンを入れたいなら代わりにこっちを入力
    $apt-cache search ros-kinetic
  • rosdepのインストール
    $sudo rosdep init
    $rosdep update 
  • 環境設定
    ターミナル起動時にROSにパスを通す必要があるので必要です
    $echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
    $source ~/.bashrc
  • rosinstallのインストール
    基本的に使わないと思うけど
    $sudo apt-get -y install python-rosinstall

カメラのパッケージの追加
基本的にロボット関連だと良く使うのでここで入れておきます。
  • $sudo apt-get -y install ros-kinetic-uvc-camer
これでRaspberry Pi3でROSを使う準備は完了です。

2017年8月9日水曜日

Raspberry PiとROSでロボット製作(概要)

ROSについて

Raspberry Piは強力なツールです。これを使うことで今までのマイコンでは扱うのが難しかったカメラや無線LANをロボットで簡単に使うことが出来ます。またROSを使うことでプログラムをモジュール化できるので、プログラムの再利用性が格段と上がります。
個人的にはROSの利点として以下の点をあげます。
  1. プログラム間の通信部分が規格化されている
    例えば(1)ジョイスティックの入力を読んで、それをもとに(2)タイヤの回転量を決めて、(3)タイヤを制御するというプログラムを書くとします。普通は(1)、(2)、(3)を1つのソースコードで記述して、その間の通信は自分で作ったデータ型を使うでしょう。
    これでは例えば(1)のジョイスティックをキーボード入力に変えようとすると、ソースコードを地道に直さなければなりません。
    しかしROSではジョイスティックのデータ型等のロボットで使われそうなものはすべて定義されていて、またプログラム間での通信の方法が規格化されています。そのために3つのプログラムを個々のノードに分離でき、前のような状況でもノードを置き換えることで実現できます。
  2. PC間接続が簡単にできる
    例えばロボットのWEBカメラの画像をコントローラーのPCで見たい時には、わざわざMJPEGのストリーマーを起動させる必要があったり、ラジコン化させようとしたときにはコマンドを送るソケット通信をわざわざ書く必要があります。しかしROSではそのようなことをする必要はありません。上記のプログラム間接続の規格というのは実はTCP/IP通信です。同じPCの中でもTCP/IP通信をしているのです。そのために同じPCで(1)WEBカメラの画像を取り込むプログラムと(2)画像を表示するプログラムの2つを使ってWEBカメラの画像を表示するのと同じように、(1)がロボットPCで起動していて、(2)がコントローラーPCで起動することが出来ます。
  3. 座標の管理が簡単にできる
    ROSにはtfという座標管理システムがあります。これを使うことでバグの多い座標管理を簡単に行えます。
  4. 公開されているパッケージが多い
    例えばWEBカメラの画像を取り込むソフトも十分にありますし、ロボットで使うそうなセンサーに対応するプログラムは大体あるみたいです。
  5. Launchファイルでプログラムを改変できる
    通常ロボットのプログラムに変更を加える場合はソースを編集してビルドする必要がありますが、それとは別にLaunchという起動スクリプトでパラメーターを変更することが出来ます。例えば移動速度をいくつかのパターンで試したいときにソースではスクリプトから変数を取得するようにします。そして起動スクリプトで変数をしていして起動します。この方式ではビルドすることなくプログラムを変更することが出来ます。
 さあここまで良いことを書いてきましたがROSにも欠点があります。
  1. インストールが面倒
    ROSを使うハードルが高いと言われる最大の原因です。ROSは複雑な移動関係を持つのでインストール時にトラブルが発生しやすいです。
  2. (特に駆動系統の)ハードウェアを自作する必要がある
    これはROSの問題というよりもロボット開発における問題ですが、現在IoTなどが流行っていてUSB接続できるセンサー等が増えています。しかし流通している大体のセンサーはSPIやI2C等の接続の物です。これらはArduinoでは簡単に使えるのですが、PCで使うのには工夫が必要です。またモータードライバも同様でUSB接続の物の無いことは無いのですが産業用で高価であり、これもPCとつなぐには間の通信する部分をArduinoなどで作る必要があります。
このような欠点がありますが、Raspberry Piを使えば、皆が同じハードウェアを使い、空の状態からインストールするので、インストール手順は皆同じになります。またハードウェアについては今後私オリジナルのハードウェアを順次公開していくつもりです。これは多脚歩行ロボットSRS002等で使われたもので、シリアルポート経由でサーボモーターやDCモーターを駆動できるシステムです。是非ROSでロボットを製作しましょう。

Ros on Raspberry Pi

ここからやっとRaspberry Piの話に入ります。Raspberry PiでROSを使う方法はいろいろあります。
  • Raspbianを使う(Raspberry Pi2、Raspberry Pi3)
    Raspbianは標準のOSですがROSをapt-getすることが出来ません。apt-getはdebian系のOSでプログラムを自動でタウンロードできる便器な機能ですが、何故かROSではできません。そのためにソースをgitからダウンロードして、ビルドする必要があります。また追加のパッケージもapt-getできなく、別途gitからソースをダウンロードしなくてはならないのですが、この辺りは慣れた人でも大変らしいです。
  • Ubuntu16を使う(Raspberry Pi2)
    Raspberry Pi2用のイメージデータがあります。これを使うと普通のデスクトップでROSを使うのと同じように使えます。しかしRaspberry Pi3用のイメージは無く、無理やり2用の物を入れても3の特徴であるWiFiを使うことは面倒です。
  • Ubuntu mate16をつかう(Raspberry Pi3)
    Ubuntu mateはデスクトップ環境にmateを使ったUbuntu派生ディストリビューションでUbuntuより軽量らしいです。Raspberyy Pi3用のUbuntu mate16イメージが公開されているので、Raspberry Pi3を使うならこれがベストです。また中身はUbuntuと変わらないので、apt-getでのインストールなどUbuntuと同じように使うことが出来ます。
ROSにもバージョンがいくつかあり、今では1年に1回更新されています。Ubuntu14に対応しているのがindigo、16がkineticというのを覚えておけば良いでしょう。

2017年8月7日月曜日

被弾センサーのテスト

前にロボットに取り付けられるエアガンを作りましたが、的が未だありません。適当な板を立てて、当たったら倒れるようにしたいのですが、どうせならエアガンをRapberry Piから操作できるので、Raspberry Piで当たったか検知できるような機構を作りたいと思います。そうするとロボットに載せてエアガンで撃ち合いもできますし。
「ロボでサバゲ」という大会ではアルミ箔を箱状に貼り、弾が当たって破けると箱の中の光センサが反応するという光を使って判定しています。
同じものを作るのは面白くないので、私は加速度センサーを使った方式で試したいと思います。しかし加速度センサーではロボットの振動などのノイズも拾ってみます。そこで今回は的を外枠とゴムでつないで宙づりにして的に加速度センサーを付けてみました。
真ん中にあるのは加速度センサーMNA7361です。このセンサーはアナログ出力で、今回はZ軸(面に垂直)をオシロスコープで見てみます。(横軸は1目盛りが10ms)
的をナットドライバで叩いた時が以下です。飽和しています。

外枠を斜めにナットドライバーで叩いたとき

外枠も思いっきり叩くとそこそこの加速度が掛かってしまいます。しかしよく見るとばねの遅れの分加速度の立ち上がりに1msほどかかっています。
加速度が閾値を超える&立ち上がりが早いの2つの条件で弾が的に当たったことと他の振動を区別できそうです。

2017年8月2日水曜日

MFT2017用の準備

MFT2017まで残り数日となりました。私は展示品の作成などに追われています。ビラなど今まではロボットについて書いていましたが、ロボット以外にも1つ製作物を出すので載せておきます。
ブースはG-07-04です。ぜひお越しください。

2017年7月31日月曜日

Maker Faire Tokyo 2017用のビラ

MFTまであと1週間を切っていて、修羅場に突入しつつあります。
先日注文していたビラが届いたのでデータを張ります。会場で配布予定です。

2017年7月9日日曜日

Cで非カノニカル、非ブロッキングなシリアル通信プログラム

シリアル通信では2種類の設定項目があります。

カノニカルor非カノニカル

  • カノニカル(デフォルト)
    通信の単位は「行」、つまり\nの文字が来たらデータを送信する。つまりwrite(fd,"hello",5);では送信を行わなく、write(fd,"hell\n",6);で初めて送信をする。また\nを受信したらそこまでのデータを1行だとして受信処理をする。
  • 非カノニカル
    通信の単位は「Byte」つまりwrite(fd,"hello",5);でも送信をするし、受信も\nが来ていなくてもreadでデータを読み出せる。

 ブロッキングorノンブロッキング

  • ブロッキング(デフォルト)
    read関数を使ったときに、データを受信するまで、そこでウェイトをする。カノニカルモードなら\nが来るまで待つし、非カノニカルモードなら1byteでもデータが来るまで待つ。
  • ノンブロッキング
    read関数を使ったときに何もデータが来ていなくてもウェイトは発生せず、何も受信しなかったという結果を返す。read関数の返り値が受信バイト数。
普通のPCのプログラミングだとカノニカルかつブロッキングが通信をすることが普通です。組み込み的なプログラムは非カノニカルかつノンブロッキングに書くのが普通でしょう。この設定を書く資料が微妙に見つけにくいのでメモ的に書いておきます。
ノンブロッキングモードはopenで_NONBLOCKINGをつけるだけで良いとありましたがUbuntu14.4ではそれではダメなようです。

########モード#########

#include <stdio.h>

#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main()
{   
    int fd1=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);
    fcntl(fd1, F_SETFL,0);
    //load configuration
    struct termios conf_tio;
    tcgetattr(fd1,&conf_tio);
    //set baudrate
    speed_t BAUDRATE = B1000000;
    cfsetispeed(&conf_tio, BAUDRATE);
    cfsetospeed(&conf_tio, BAUDRATE);
    //non canonical, non echo back
    conf_tio.c_lflag &= ~(ECHO | ICANON);
    //non blocking
    conf_tio.c_cc[VMIN]=0;
    conf_tio.c_cc[VTIME]=0;
    //store configuration
    tcsetattr(fd1,TCSANOW,&conf_tio);

    write(fd1,"#;",2);
    printf("Bytes sent\n");
   
    sleep(1);
   
    char buff[100]="=======================";
    int rd=read(fd1,buff,sizeof(buff));
    printf("Bytes sent are %s\n",buff);
    printf("rd:%d\n",rd);
    close(fd1);
    return 0;
}

2017年6月25日日曜日

USBハブ回路図


ロボットにUSBカメラやUSBシリアル変換アダプタがいくつか入っていて、USBハブもロボットの中に入れようと思うのですが、これが意外とスペースを使うので、今回USBハブを基板に起こしました。
使うICはuPD720114でおそらくUSB2.0にならすべて対応でアイテンドウに売っています。ただこれが30MHzの水晶が必要で、スルーホール部品なら秋葉原で売っているのですが、表面実装品は売ってないのでChipOneStopで買いました。
上流側はUSBマイクロBコネクタですが、下流側はPH4ピンにしてます(本当は4chあるけど2chしか実装していない)。


回路図は以下
データシートにもいくつか回路は載っているのですが、全体が載っているのは無いので載せます。セルフパワーオンリーで12V入力を想定しています。
抵抗はR3を除いてそこそこ正確な値が良いです(近い値の別のもので代替は良くない)。
R4+R5が2.43kΩ±5%になるようにしてください。

Partlist
IC1, UPD720114
IC2, レギュレーター3.3V
IC3, レギュレーター3.3V

C1,C9,C10,C11 0.1uF
C2,C3,C4,C12 1uF
C5,C6 10pF
C7 22u
C8 4.7u
F1,F2,F3,F4 ポリスイッチ300mA
L1,L2 フェライトビーズ(http://akizukidenshi.com/catalog/g/gP-04053/を使用)
Q1 30MHz
R1 51kΩ
R2 75kΩ
R3 12kΩ
R4 R5 合計で2.43kΩ
(私の実装ではR4:2.2kΩ、R5:220Ω)

2017年6月11日日曜日

ポリスイッチの勧め

ヒューズの代替として便利なものにポリスイッチがあります。これはリセッタブルヒューズとも呼ばれていて、ヒューズは1回切れると交換するしかありませんが、ポリスイッチは電源を入れなおすとまた導通します。ただヒューズは低下電流以上がかかると瞬間的に切れるのに対して、ポリスイッチではある程度時間がかかります。モーターの過電流防止や、USB機器の過電流防止に良いかもしれません。
秋月でも売っていますが、例えばRGEF300は定価3A(6Aで切断)などと雑なデータしか書いていなかったのでデータシートを調べました。

目安として
定価x1.4 1000sで切れる
定価x1.6 20sで切れる
定価x2.0 7sで切れる
定価x3.0 1sで切れる
という感じのようです。

2017年6月1日木曜日

MFT2018に出展します。

Maker Faire Tokyo 2018 への出展が決まりました。今まで作っていた6脚歩行ロボットや電子工作の作品を展示します。実はこの1つ前のエントリの内容が重いのはMFTの審査用の資料だったりもします。
今あるものに加えMFTまでにいろいろと物を製作する予定なので是非8月5、6日は東京ビックサイトまでお越しください。


2017年4月6日木曜日

多脚戦車を作ったよ

5年間の歳月をかけて製作をした多脚戦車「SRS002」がひとまず完成しました。
各部の紹介をしていきたいと思います。

概要

6脚で移動する機構の上に旋回するエアガンを乗せたものです。PCからの指令を受けて6脚の各足のモーションを生成し歩行をします。指令はWiFiでまた電源もバッテリーを積むことができるので、完全無線で動くことができます。まずは多脚の移動部の動作。前後左右と旋回を自由に行うことができます。


砲塔が乗った状態での動作また遠隔の指示で砲塔の旋回やLED投光器、レーザー照準器などを操作することができます。


最後に搭載されているエアガンの射撃テスト、射撃する前にレーザーで標準をつけています。まだ調整をしていないので レーザーの場所とあっていませんが、1m離れていても直径5cmの円に収まりそうです。


レッグユニット

6脚移動部はほぼ同じレッグユニットを6つつなげることで実現しています。このために各足には互換性があり高い整備性を持ちます。(以下はテスト用の台に接続した状態)

関節部分には動力ユニットであるサーボモーターが入っています。サーボモーターは近藤科学のKRS4031(スピード0.16s/rad、トルク13.0kgm、約7000円)とKRS4034(スピード0.17s/rad、トルク41.7kgm、約15000円)を使用しています。子のサーボモーターはシリアル通信をすることができるために正確な位置の指示や、現在のサーボモーターの状態の取得ができるために、精密な制御ができます。このように2種類のサーボモーターを適宜使い分けることで安価にシステム全体を製作することができます。またサーボモーターが過熱するとモーターの出力が落ちてしまうために、冷却用のファンを搭載しています。
 

また足先には加重センサ(FSR400)が搭載されています。このために足先に掛かっている加重を各足ごとにセンシングすることができます。今後荒地での歩行を行うときに使用する予定です。このセンサは加重と抵抗値が反比例するためにそのままでは使いにくく。OPアンプを使って加重と比例した電圧が出力されるようにしています。また装飾用のLEDも搭載しています。

制御基板はmbed互換のボードをオリジナルで製作して使っています。 LPC1768を使用しています。mbed互換にしているためにOnlineのmbed compilerやmbedの豊富なライブラリをそのまま使用することができます。ロボットに合わせたオリジナルの基板なので省スペース、省配線でメンテナンス性に貢献しています。

少し古いものですが、レッグユニット単体での動作テストです。マイコンが補完動作を行うために滑らかな脚の動作が実現できました。

ガンユニット

エアガンを操り、砲塔の旋回や、給弾機構、光学系のコントロールを行うユニットです。
 

エアガンは空圧を扱うための気密性や適切な威力を出す機構など複雑な部分が多いので既製品を使います。市販されているエアガンはBB弾の射出を行うメカボックスを、実銃の形を模した外枠が覆うという構成をとっています。東京マルイの「電動ガンボーイズ」シリーズは通常のエアガンよりも威力が低く、また小型軽量のメカボックスを使用しているために、これを使用することにしました。今回は電動ガンボーイズのG36Cを分解してメカボックスとバレルを手に入れました(ほかのものでも中身は一緒だと思います)。

このメカボックスやバレルは複雑な形をしていて簡単には固定できないので治具を作ってがんユニットに固定をしています。これらの部品の採寸にはだいぶ苦労しました。3次元測定器がないのでノギスで測るのですが、微妙な長さがあったりすると整合性を取るのが大変です。

メカボックスと一緒にマガジンも流用しようとしたのですが、マガジンの形状が複雑で固定するのが困難だったこと、付属のマガジンがゼンマイをまいた分しか給弾できないために、給弾を電動化するのと一緒にマガジンを1から設計しなおしました。およそ100発のBB弾をためることができ、歯車状のツメをステッピングモーターで回して給弾をします。マガジンから出たBB弾はステンレス製の引きばねの中を通ってメカボックスに送られます。

これらをmbed互換の専用ボードで制御しています。左側がメイン基板で各種センサーやライトなどが接続されています。右側の縦に長い基板はガンドライバーでメカボックスのモーターの制御とメカボックスのセンサーの入力とつながっています。メカボックスのモーターにはかなりの負荷が掛かっているため、また他の回路に影響を与えるノイズを抑えるために専用のモータードライブ回路を設計しました。


これ以外にガンユニットには光学系としてWebカメラ、標準用レーザー、LED投光器が搭載されています。

ボディーユニット

上記のレッグユニット、ガンユニットを接続する機能を持つほか、電源や全体制御用のPC、正面カメラを搭載しています。レッグユニットを接続できるポイントがいくつかあり、そのうちの6つにレッグユニットを実際に取り付けています。ねじを数本外すだけで、ユニットをボディーユニットから外すことができます。


全体制御用に後部にRaspberry Piが搭載しています。今回はRaspberry Piを接続するための治具とアドオンボードを製作しました。アドオンボードは全体のソース電源の12VからRaspberry Pi用の電源を作り、またRaspberry PiのttyターミナルにPCから物理的に接続するコネクタを持ちます。

メカ系製作

メカ系は3D-CADであるSolidEdgeを用いて製作しました。3D-CADを用いれば実物がなくてもパーツをモデリングして組み立てることができます。また既存のパーツとうまく組み合わさるようなパーツの設計も3D-CADを用いれば迅速にできます。

部品の設計が終わったらこれを図面に起こします。私は薄板は外注して業者に製作してもらっていて、厚みのあるブロック材は自分でフライス盤や旋盤を用いて加工をしています。それぞれを目的に合わせて図面を製作します。

これらの加工を終えると以下のようなアルミパーツが出来上がります。これを組み立てればメカパーツの製作は終了です。

電気系製作

電気系はEagleというCADを用います。まず使用したい部品のパーツライブラリを製作し、それを使って回路図を製作します。基本的なパーツについてはEagle自体に入っているのですが、秋葉原で手に入るようなものはあまりないので、骨の折れる作業です。

ここからレイアウトの作業です。電子基板のサイズや外形を引き、その中に納まるように配置をしていきます。

レイアウトが完成したらガーバーデータという形式に変換してプリント基板製造業者に送ります。最近はプリント基板の値段がどんどん安くなっていて、10cm四方程度ですと10ドル+送料ほどで2週間もあれば届きます。届いたプリント基板に部品を乗せると完成です。プリント基板なので量産しやすく、接触不良も起きにくいです。

全体システム


全体的なシステムについて解説していきます。操縦者の手元にコントロールPCがあり、それから発行された指令が無線LAN経由でロボットに乗っているロボットPCに送られます。ロボットPCからUSBポートを通じてロボット内の各マイコンに指令が流れ、マイコンが指示された動作を行います。