メカトロニクスにうってつけの日

ロボット開発や研究活動に関するメモ

DCモータのPWM制御2種の使い分け

DCモータの制御にはよくPWM制御が用いられます.PWM=Pulse Width Modulationであり,パルスの幅を変えることで印加電圧の時間平均を変化させ,実効的な電圧をコントロールするものです.その制御方式にはSign/Magnitude/Break方式(以下SMB)と,Locked Anti-Phase方式(以下LAP)の二種類があります.

tattatatakemori.hatenablog.com

上記の回路で用いたモータードライバ(Pololu G2 High-Power Motor Driver 24v21)ではどちらの方式も使えるのですが,それぞれ長所と短所があったのでうまく使い分けることにしました.その話を書きます.

1. 原理

二つのPWM制御方式については以下のページが参考になります.

NOTE - 回路設計編 - モータドライバと象限

1.1 Sign/Magnitude/Break方式の原理

SMBは[A. 正転or逆転の電圧印加]と[B. ショートブレーキ]を交互に繰り替えす方式です.1と0の波です.1の時間を長くすると印可電圧が上がります.[B. ショートブレーキ]の間は電圧は印加されないため,[B]の間は制御されていないと捉えていいかもしれません.「PWM制御」というとこちらがメジャーかと思います.

1.2 Locked Anti-Phase方式の原理

LAPは[A. 正転の電圧印加]と[B. 逆転の電圧印加]を交互に繰り返します.1と-1の波です.Dutyを変化させることで実効印加電圧は+MAX~-MAXまでシームレスに変化します.Duty50%で静止です.僕は「正転と逆転が綱引きしているイメージ」で捉えています.上記ページによると「DCモータの基本制御式が使える」とのことで,常に能動的に電圧をかけていることから直感的にもたしかに使えそう.

1.3 具体例

例えば上記モタドラ基板で使っているモジュールには制御入力用にPWMピンとDIRピンがあり,各方式で以下のように使い方が異なります.

  • SMBの場合はPWMピンにPWM信号を入力してDIRピンのH/Lで回転方向を指定
  • LAPではPWMピンはHighに固定してDIRピンにPWM信号を入力

2. 今回のモーター制御

レスキューロボットFUHGA用に,速度制御と位置制御を実装しています.

  • 速度制御はエンコーダ出力から計算した速度をフィードバッグとしてPI制御
  • 位置制御はポテンショとエンコーダを用いて現在位置を計測し,目標位置との差に応じた目標速度を目標に上記の速度制御

というのが大筋です.MAXON RE40が7本とRE35が1本搭載されており,4つを速度制御,4つを位置制御しています.PWM周波数はモタドラモジュール最大の100kHzで,電源電圧は24Vだったり28Vだったりです.電流センサも載っていますが計測値は使っていません.

まずはLAPを使っていたのですが,下記の問題があったためSMBも試してみて,使い分けるに至りました.

3. 二つの方式の長所と短所

理論的な話よりも実践してみた実感としてのことを中心に書きます.

3.1 Locked Anti-Phase方式の長所と短所

「DCモータの基本制御式が使える」ということを実感できる動作でとてもいい感じです.しかしながら消費電流がかなり大きく,目標速度0でも常に1A近く消費しています.モーター静止時も常に正転か逆転かの電圧がフルでかかってますので納得です.PWM周波数を上げることができれば改善されるでしょうが,100kHzを超える周波数が使えるドライバはなかなかありません.ロボット全体では制御を起動中は常時7A消費するというきつい状態です.

3.2 Sign/Magnitude/Break方式の原理

SMBはショートブレーキの間は電流を消費しないこともあり,電流消費がかなり少ないです.逆に言うとその分トルクの出方がよくわかりません.LAPのときと制御ゲインを変えておらず,SMBに合わせた最適化をしていないので正当な比較にはなっていませんが,動作はいまいちでした.特に,回転しているモーターを止めようとする力があまり働かないように見え,目標速度への追従がかなり悪くなりました.少なくともLAPに比べるとかなりフィードバッグゲインを上げる必要がありそうです.うれしいところは,静止時にはロボット全体で1Aも消費しないくらいになり,消費電力はかなり抑えられます.

4. 二つの方式の使い分け

  • LAPは〇制御性は高く,×消費電流は多い.
  • SMBは×制御性は低く,〇消費電流は少ない.

ということを踏まえ,モータ個別に状況に応じて二つの方式を切り替えることにしました.具体的には「ダイナミックな動作にはLAPを使い,スタティックな動作にはSMBを使う」という作戦です.

「スタティック」というのは,今回の場合は「速度制御において目標速度が0で,実際の速度も0付近」「位置制御において,目標位置と現在位置が概ね一致して数秒経過」の状態です.このような状態ではSMBに切り替えます.モータはほぼ回転しないので制御性の悪さがあまり問題になりません.そして,大きな動作が必要な時には再び制御性の高いLAPに切り替えて動作します.この使い分けにより,動作性能を損なわずに消費電流を劇的に抑えることができました.

5. まとめ

多くの要素を搭載したレスキューロボットでは,例えば移動中はアームは動かないことがほとんどですし,逆にアームを使った作業中はモビリティは動いていません.かといって制御しないと外力で勝手に動いてしまいます.このように静止させたいモータが多い場合には今回紹介した方法はかなり効くように思います.

来週はロボカップ世界大会,がんばります.

V-REPとROSの連携(V-REP Ver3.4.0版)

V-REPが3.4にバージョンアップして,ROSとの連携の勝手が変わった.連携のためにしたことをメモしておく.環境はubuntu14.04のROS indigo.従来の方法,および私流のremoteAPIの使い方は以下の記事を参照.

tattatatakemori.hatenablog.com

 

ここで紹介するやり方は概ね公式のチュートリアルに従っている.

http://www.coppeliarobotics.com/helpFiles/en/rosTutorialIndigo.htm

 

1 V-REPの最新版をダウンロード

下記サイトから,適切なV-REPをダウンロードし,展開して適当な場所に置く.私の場合はV-REP PRO EDU V3.4.0 rev1のLinux64bit版.

Coppelia Robotics V-REP: Create. Compose. Simulate. Any Robot: Downloads

以下では,V-REPのrootフォルダは ~/V-REP としている.

2 V-REP用ROSパッケージのビルド

2.1  RosInterfaceのプラグイン?を配置

V-REP/compiledRosPlugins/ にある

  • libv_repExtRosInterface.so
  • libv_repExtRosSkeleton.so

を V-REP/ にコピー.

2.2 パッケージを取ってくる

V-REP/programming/ros_packages/ から以下のパッケージをROSのsrcフォルダにコピー.

  • ros_bubble_rob2
  • v_repExtRosInterface
  • vrep_skeleton_msg_and_srv
  • vrep_plugin_skeleton

2.3 V-REPのrootフォルダへのパスを設定

V-REPのrootフォルダへのパスを通す.

export VREP_ROOT=~/V-REP

bashrcに書いておくとよい?

2.4 ビルド

catkin build コマンドでビルドする.catkin_make では不可.

2.5 連携の確認

roscore したあと,別ターミナルで~/V-REPに移動して

./vrep.sh

でV-REPが起動する.このときにV-REPのノードとかが立ち上がる.

rostopic list で確認すると以下の結果に.

$ rostopic list 
/rosout
/vrep_ros_interface

3 時刻の同期

V-REP上の時刻をROS上の時刻にする.

ros::Rateやros::Timeのいろいろをシミュレーション時刻にするにはこれが必要.

3.1 sceneファイルから時刻情報をPub

sceneファイルから適当なオブジェクトを選んで,[Menu bar --> Add --> Associated child script --> non threaded] によってスクリプトを追加.このスクリプトの編集画面を開き,中身を以下の内容に置き換える.

if (sim_call_type==sim_childscriptcall_initialization) then
    -- The child script initialization
    -- Check if the required RosInterface is there:
    moduleName=0
    index=0
    rosInterfacePresent=false
    while moduleName do
        moduleName=simGetModuleName(index)
        if (moduleName=='RosInterface') then
            rosInterfacePresent=true
        end
        index = index+1
    end

    if rosInterfacePresent then
        -- add publisher /clock
        clockPub=simExtRosInterface_advertise('/clock','rosgraph_msgs/Clock')
    end
end

if (sim_call_type==sim_childscriptcall_actuation) then
    -- Send an updated simulation time message, and send the transform of the object attached to this script:
    if rosInterfacePresent then
        simExtRosInterface_publish(clockPub,{clock=simGetSimulationTime()})
    end
end

if (sim_call_type==sim_childscriptcall_cleanup) then
    -- Following not really needed in a simulation script (i.e. automatically shut down at simulation end):
    if rosInterfacePresent then
        simExtRosInterface_shutdownPublisher(clockPub)
    end
end

ここでは'rosgraph_msgs/Clock'型の'/clock'というトピックにシミュレーション時間を詰めてPubしている.次の設定により,ROSのシステムがこれを受け取ってくれる.

3.2 シミュレータ時刻を使うように設定

以下のコマンドでそのように設定.

rosparam set use_sim_time true

V-REPを立ち上げた後にしても前にしても特に問題はなかった.以下の様にlaunchファイルに書いておくと楽.

<param name="use_sim_time" value="true" />

 

以上.

シミュレーション時間の刻みがros::Timeの分解能になるのが荒くて嫌なので改善できるなら改善したい.

eclipceでROS開発 catkin build版

ROSにおいて,catkin_makeではなくcatkin build を使う場合のEclipse用プロジェクトの作成方法についてメモ.ubuntu14.04のros indigoである.

 

はじめに

ROSでの開発のためのIDEEclipseを使っている.色々うれしいところがあって,例えばctrl+Bでビルドできるし,エラー箇所に跳べるのは便利である.環境構築は以下の記事に従っていた.

coffeegkgk.hatenablog.com

 

しかしながら,今までcatkin_makeでビルドしていたが,catkin buildを使う必要性が出てきた.その差については詳しくないが,catkin buildの方が新しくていろいろ良いらしい.catkin buildではbuildフォルダやdevelフォルダを作り直す必要があるので,上記記事に従って作ったeclipceのプロジェクトの設定的なものがなくなってしまった.

catkin build版のEclipseでの環境構築方法をメモしておく.

 

1. Eclipseのインストールや設定

上記の記事と同じ.私はEclipseのバージョンはMarsを使っている.新しすぎるとうまく起動せず,特に闘わずにバージョンを下げて対応した.

 

2. Eclipse用のプロジェクトを生成

下記ページの2.3に従う.

IDEs - ROS Wiki

まずビルド.

catkin build  --force-cmake -G"Eclipse CDT4 - Unix Makefiles"

次にプロジェクト生成

ROOT=$PWD
cd build
for PROJECT in `find $PWD -name .project`; do
    DIR=`dirname $PROJECT`
    echo $DIR
    cd $DIR
    awk -f $(rospack find mk)/eclipse.awk .project > .project_with_env && mv .project_with_env .project
done
cd $ROOT

これでEclipseからROSで生成されたbuildフォルダをプロジェクトとしてImportすればよい.

 

catkin_makeで作ったものと違ってパッケージごとにしっかり分かれていた.あたらしいパッケージを追加した場合はプロジェクト生成の部分をやり直す必要があるかも.