人工知能学会研究会資料
JSAI Technical Report
SIG-Challenge-047-5 (3/30)

一般社団法人 人工知能学会
Japanese Society for
Artificial Intelligence

ROS を使って移動ロボットを実現するためのマイコン用通信ライブラリの実装と移動ロボットの実現例
光永 法明，杉本 梓 （大阪教育大学)
Noriaki Mitsunaga and Azusa Sugimoto (Osaka Kyoiku University)
mitunaga@cc.osaka-kyoiku.ac.jp
ラットホーム用メタパッケージが利用できる．

概要
本論文では ROS (Robot Operating System) を使って

本 論 文 で は ，Yujin Robot 社 の 移 動 ロ ボット
Kobuki [2]用のメタパッケージが利用できるようにする

移動ロボットを実現する際に必要となる ROS パッケーこととし，その通信プロトコルを模擬するライブラリ

ジと通信するための，ハードウェアを制御するマイコンを実装する．そして実装したライブラリを用いたマイ用ライブラリを実装したので報告する．Yujin Robot 社の移動ロボット Kobuki の通信プロトコルを実装していコンボードでモータ制御等をする移動ロボットを製作し，表らの著書 [3]内で紹介されている Kobuki 用のメるため，ROS の Kobuki 用パッケージが少しの改変で利タパッケージを利用して，本学内で試走させる．以下，用できる．実装したライブラリを移動台車を制御するマ

まず Kobuki の通信プロトコルを説明し，ライブラリとイコンに載せ移動ロボットを製作した．移動ロボットは移動ロボットの実装方法を述べる．そして，必要になっKobuki 用メタパッケージを少し改変して利用することで，本学内を約 50m 移動できた．

た Kobuki 用パッケージの改変と試走結果を述べる．

1

2

はじめに

Kobuki の通信プロトコル

Kobuki と ROS のパッケージ (kobuki driver パッケー
最近ではロボットの開発用フレームワークとして ROS ジ，kobuki core メタパッケージに含まれる) 間の通(Robot Operating System) [1]が広く使われている． 信プロトコルは公開 [4]されており，非同期シリアル
ROS は研究用プラットホームとして開発されてきたこ (115.2kbps, 8bit, non parity, stop bit 1) で通信する．とから，パッケージという単位で機能を分割することが非同期シリアル上にはパケット (図 1) を載せる．パケッ

でき，研究成果をパッケージとして公開している研究者

トの長さは可変長で，プロトコル上の最短は，サブペイも多い．また複数のパッケージを組み合わせて複合的なロード数が 1，サブペイロードの長さが 3 のときで 7 バ機能を実現したメタパッケージも公開されており，市販イトである．最長はペイロードの長さが 255 バイトの時のハードウェアプラットホーム用のメタパッケージの中で 259 バイトである．には基本的な移動ロボットのナビゲーションを実現する

サブペイロードには ROS から Kobuki へ送るコマンものもある．ハードウェアにメタパッケージが対応してドパケット (最大 14 種類で，現在規定されているのは 7いれば，基本的な機能の実現についてはメタパッケージ種類，表 1) と Kobuki から ROS へ送るフィードバックに頼り，目的とする問題に素早く取り組むことが出来る． パケット（最大 21 種類で，現在規定されいてるのは 11
一方で，市販のハードウェアプラットホームを利用しな種類，表 2）がある．Kobuki は ID が 1,3,4,5,6,13,16 のい場合には，どのようにパッケージを組み合わせればよ

フィードバックパケットを ROS からの要求がなくてもいのか ROS になじみがないと戸惑う面もある．

20ms 周期 (50Hz) で送信を続ける．ほかのフィードバッ
クパケットは ROS からの要求があるときにのみ返す．
ROS から Kobuki へ送られるコマンドパケットの ID

そこで，自作のハードウェアについて，既存のハードウェアプラットホーム用メタパッケージを利用できるようにすることを考える．ROS のパッケージは Ubuntu 1 である Base Control には台車の直進速度と回転速度等の PC 上の OS で動作し，ハードウェア側のアクチュ が含まれ単位は mm/s である．したがってマイコン側
エータやセンサとは何らかの通信を行うことが一般的で で，モータの回転数（エンコーダパルス数）に変換するある．この通信を模擬できれば，既存のハードウェアプ必要がある．一方で Kobuki から ROS へ送るフィード18図 1: Kobuki と ROS のパッケージ間のパケット ([4] より引用)

while (Serial1.available() > 0) {char c = Serial1.read();

表 1: ROS から Kobuki へ送るコマンドパケット

ID

Name

1
3

Base Control
Sound

4
912

Sound Sequence
Request Extara
General Puropse Output

1314

Set Controller Gain
Get Controller Gainif (fbRecv.recv(c)) {// パケットを処理する
fbRecv.handle();if (fbRecv.isSet(fbRecv.flagSetPID)) {// PID ゲインの更新
kPIDs = fbRecv.kPIDs;
fbRecv.clearFlag(fbRecv.flagSetPID);}
if (fbRecv.isSet(fbRecv.flagUpdateVel)) {// 目標速度の更新
setWheel(fbRecv.spd, fbRecv.radius);

表 2: Kobuki から ROS へ送るフィードバックパケット

IDName13Basic Sensor Data
Docking IR}

45

Inertial Sensor
Cliﬀ

fbRecv.reset();break;

610
11

Current
Hardware Version
Firmware Version

13
16

Raw data of 3-axis gyro
General Purpose Input

1921

Unique Device Identiﬁer (UDID)
Controller Info (PID gain)

fbRecv.clearFlag(fbRecv.flagUpdateVel);}}

図 2: パケットを受信するプログラム例
してクラス内変数に代入する関数 handle() と，シリアルポートへ送るフィードバックパケットをサブペイロードとして詰め込む関数 addBasicSensor(), addDocikn-gIR(), addInertialSensor() 等とチェックサム計算用関数

バックパケットの ID 1 には左右のモータのエンコーダのsetCheckSum() である．ただし handle() 関数でコマンドパケットのうち ID 3, 4, 12 を無視している．

値 (0〜65535) が含まれる．エンコーダの値から台車の移動量への変換は ROS のパッケージ kobuki driver でコマンドパケットを受信し処理する例を図 2 に示す．

行っているため，台車に合わせて kobuki driver 内のパシリアルポートから 1 バイトずつ受信し，ステートマシラメータを改変する必要がある．

ンで構成された recv() 関数に渡す．recv() 関数の戻り値が真であればパケットを受信しているので handle 関3数で処理している．

ライブラリの実装

次にフィードバックパケットを送信する例を図 3 に示ライブラリは Arduino IDE で利用するものとして す．まず Basic Sensor Data パケットを組み立て，そのC++のクラスとして実装する．ライブラリは主に次の 後フィードバックパケットをリセットしてから順に ROSクラス内関数で構成されている．シリアルポートから受 へ送信するサブペイロードとして詰め込んでいく．最後
け取ったバイト列をパケットとして構築する関数 recv()， に setCheckSum() 関数でチェックサムを計算・追加し，パケット内のコマンドパケット (サブペイロード) を解釈 シリアルポートからパケットを送信する．

19

bs.t = millis();bs.leftEncoder = encL.read();bs.rightEncoder= -encR.read();// パケットの組み立て
fbPacket.reset();fbPacket.addBasicSensor(bs);fbPacket.addDockingIR(0, 0, 0);fbPacket.addInertialSensor(0, 0);fbPacket.addCliff(0, 0, 0);fbPacket.addCurrent(0, 0);fbPacket.addRawGyro2(gyroID,0,0,0,0,0,0);// Gyro のタイムスタンプをダミーで更新
gyroID += 2;

図 4: PC や Kinnect を載せた移動ロボット

4fbPacket.addGeneralPurposeInput(0,0,0,0,0);

移動ロボットの実装

メカニカルな部分 (モータ・エンコーダを含む) は著者等が以前に製作したロボット [5]の台車部分を利用し// PC から要求されているパケットがあれば追加if(fbRecv.isSet(fbRecv.flagHardwareVersion)){fbPacket.addHardwareVersion(1, 1, 0);ている (図 4)．Kobuki との差異を表 3 に示す．これらの差異を制御マイコンもしくは，ROS のメタパッケー

fbRecv.clearFlag(fbRecv.flagHardwareVersion);ジで吸収する必要がある．台車には ROS を載せた PC(Lenovo ThinkPad E420, Ubuntu 14.04 LTS, ROS In}
if(fbRecv.isSet(fbRecv.flagFirmwareVersion)){ digo)，Microsoft Kinect, モータと Kinect, PC 駆動用
バッテリ (12V, 7.2Ah), 12V から AC100V をつくるイ
fbPacket.addFirmwareVersion(1, 2, 9);fbRecv.clearFlag(fbRecv.flagFirmwareVersion);ンバータ，モータ制御用マイコンなどが載っている．
モータ制御用マイコンには STmicro の Nucleo}
F103RBT6
マイコンボード (MCU: Coretex-M3, max
if (fbRecv.isSet(fbRecv.flagUDID)) {72MHz, ROM 128kB, RAM 20kB) を選択した．理由はfbPacket.addUDID(1, 2, 3);
ハードウェアエンコーダを内蔵しており，3.3V 動作でfbRecv.clearFlag(fbRecv.flagUDID);}ありながら 5V トレラントピンが豊富であり，Arduino

if (fbRecv.isSet(fbRecv.flagPID)) {fbPacket.addControllerInfo(1, kPIDs.Kp,IDE で開発できて十分な速度で動作するからである．配線図を図 5 と図 6 に示す．配線図にはないがマイコンボード上の USB シリアルでは 115.2.kbps での連続通

kPIDs.Ki, kPIDs.Kd);
fbRecv.clearFlag(fbRecv.flagUDID);

信時に不具合が生じたので FTDI の FT232 ベースのUSB シリアル変換ケーブルを利用している．また ROS}

非利用時にリモートコントロールできるようにヴィスト// チェックサムの追加
fbPacket.setCheckSum();

ンのゲームパッド VS-C1 用受信機を載せているが，衝突検出スイッチやジャイロなどは搭載していない．そのため，センサ類はダミーのデータを返す．マイコン上で// パケットの送信
Serial1.write(fbPacket.packet,はモータの PID 制御 (制御周期 50ms)，Kobuki の通信処理（周期 20ms）と VS-C1 の受信をすべてメインルー

fbPacket.len());

プ内に記述している．VS-C1 の受信にはライブラリ [6]を利用している．

図 3: フィードバックパケットを送信するプログラム例20図 5: 電源とモータドライバ周りの配線図

図 6: エンコーダとマイコン周りの配線図

5

Kobuki 用パッケージの改変

径 (robot radius) と 衝 突 防 止 の た め の 半 径 (inﬂa-ケージ含む) が必要である．また kobuki navigation でパッケージ内の tf broadcaster.cpp に追加した．または Kobuki に北陽電機の LRF である UTM-30LX を載Kinect で得られるのは 3 次元距離画像 (point cloud とよせることを前提としている．

ばれる点群画像) で，ナビゲーションに必要とされる LRFtion radius) を 変 更 し た ．駆 動 輪 直 径 ，間 隔 ，エ ン
製作した移動ロボットを屋内でナビゲーションさせる コーダ係数については kobuki driver パッケージ内のために表らの著書 [3]にある kobuki navigation メタパッ diﬀ driver.cpp に記述があるので変更した．
ケージを利用することにした．これは公開されている git
Kinect を利用するためには，ロボット上での Kinect
リポジトリ [7]に含まれている．このメタパッケージの の位置を定義する tf を発行する必要がある．そのためほかに kobuki node メタパッケージ (kobuki driver パッ kobuki navigation メタパッケージに含まれる kobuki tf

表 3 の 差 異 を 吸 収 し LRF で は な く Microsoft

等で得られる 2 次元距離画像ではない．そこで depthimKinect を 利 用 す る た め に 次 の 改 変 を 必 要 と し た ． age to laserscan パッケージ [8]を利用し変換する．
ロ ボット の 形 状 と 大 き さ に つ い て は 形 状 は 円 形 のほかにシリアル通信部分（パケットの受信部分）に特

ま ま と し た が ，経 路 計 画 時 の パ ラ メ ー タ を 決 め る

定のタイミングで顕在化する不具合があり kobuki driver

costmap common params.yaml に あ る ロ ボット の 半 パッケージの packet ﬁnder.cpp を修正する必要があった．

21

表 3: Kobuki と製作したロボットの主要な差異

形状
大きさ [mm]

Kobuki

製作したロボット

円形

矩形

直径 352幅 600
×全長 700

駆動輪直径 [mm]70210

駆動輪間隔 [mm]2300.0024369...

6400.00026329...

ありなし

エンコーダ係数
ジャイロ
バンパーセンサ
脱輪センサ

図 7: 試走した環境の地図．ナビゲーション用に用意しクリフセンサたものに部屋名等を記載している．C4 は試走環境の棟

発音など

6を C3 は隣の棟を表す．

参考文献

本学内での試走[1]

ROS: http://wiki.ros.org/ (2017/3/1 閲覧)[2]

る．A 点と B 点間の距離は約 50m である．ナビゲーショ

Yujin robot: iClebo Kobuki,
http://kobuki.yujinrobot.com/about2/ (2017/3/1

ン用の地図は環境を実測したものであり，図 7 はナビ

閲覧)製作した移動ロボットを図 7 の地図上の A 点と B 点間を試走させる．場所は本学内の C4 棟 2F の屋内であゲーション用地図に部屋名等を記入したものである．環[3]

境中に移動ロボットが乗り越えにくい段差があったため，

トプログラミング. Kurazume laboratory, 2015.
(http://irvs.github.io/rosbook jp/)(2017/3/1 閲覧)

そこに簡易スロープをとりつけた．またローカルプラン
ナがグローバルプランナの計画した経路を追従するパラメータ等を事前に調整した．

[4]

A 点から B 点（往路）と，B 点から A 点（復路）のナビゲーションを各 2 回試した．その結果，往路は 2 回と表 允哲, 倉爪 亮, 渡邊 裕太: 詳説 ROS ロボッ

D. Stonier, Y. Ju, and J. S. Simon: kobuki driver
documentation, Appendix: Protocol speciﬁcation,(https://yujinrobot.github.io/kobuki/doxygen/
enAppendixProtocolSpeciﬁcation.html)

もナビゲーションができたが，復路は 1 回のみであった．
その原因は点 A のある廊下の幅がロボットの幅に対し(2017/3/1 閲覧)て狭く，廊下への進入角度が悪いため壁に近づきすぎてしまったためである．これはロボットの大きさを変える[5]

光永法明，江崎大樹，伊藤直也，按田翔悟: 人を乗か，ナビゲーションに使っているローカルプランナを改せて案内をするロボットの提案と試作. ロボティク

変する必要があると考える．一方で，通信ライブラリをス・メカトロニクス講演会’10, 2P1-E30, 2010.

含めロボットの動作に大きな不具合はみられなかった．

7[6]

Bill Porter: PlayStation 2 Controller Arduino
Library v1.0,
http://www.billporter.info/2010/06/05/
playstation-2-controller-arduino-library-v1-0/

まとめ
本論文では既存のロボットプラットホーム Kobuki 用(2017/3/1 閲覧)の ROS パッケージが利用出来る移動ロボットを実現す[7]

るためのライブラリを実装を提案し，それを利用した移rosbook kobuki の git リポジトリ:
https://github.com/irvs/rosbook kobuki.git(2017/3/1 閲覧)

動ロボットがナビゲーションできることを示した．本稿
が ROS パッケージを利用した移動ロボットの製作の参[8]考になれば幸いである．ライブラリについては github等で公開していきたいと考えている．

22

depthimage to laserscan パッケージ:
http://wiki.ros.org/depthimage to laserscan(2017/3/1 閲覧)