Raspberry Pi Mouse Case Study

Raspberry Pi Mouse (以下ラズパイマウス) はアールティが販売している二輪方式の移動ロボットです。 Raspberry Pi を搭載しているため Linux (Raspbian) 等での開発が可能です。

s_DSC00444.JPG

このドキュメントではラズパイマウスでの OpenRTM-aist の利用方法等を紹介します。

仕様

ラズパイマウスの仕様
CPU Raspberry Pi 2 Model B
モーター ステッピングモーターST-42BYG020 2個
モータードライバー SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

Tutorial (Raspberry Pi Mouse)

このページでは RTM講習会での Raspberry Pi Mouse 操作手順を説明します。

/jp/node/6005

Raspberry Pi Mouse (以下ラズパイマウス)はアールティが販売している二輪方式の移動ロボットです。 Raspberry Pi を搭載しているため Linux(Raspbian) 等での開発が可能です。

仕様

ラズパイマウスの仕様
CPU Raspberry Pi 2 Model B
モーター ステッピングモーターST-42BYG020 2個
モータードライバ SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

ダウンロード

最初に PC側で使用する RTC 等をダウンロードしてください。

ZIPファイルを Lhaplus 等で展開してください。

電源の入れ方/切り方

電源の入れ方

内側のスイッチが Raspberry Pi の電源スイッチです。 このスイッチをオンにすると電源が投入できます。


rpm9.png

電源の切り方

電源を切る場合は真ん中のスイッチを1秒ほど押すと OS がシャットダウンするため、その後にスイッチを切ってください。
※スイッチを直接切るのはデータの破損などの危険があるため絶対にやらないでください。


rpm8.png

Raspberry Pi への接続

Raspberry Pi へは原則として無線LANで接続するようにしてください

無線LANアクセスポイントへの接続

まずは無線LANアダプタを取り付けた状態で Raspberry Pi Mouse の電源スイッチをオンにしてください。

しばらくすると無線LANアクセスポイントが起動するので、指定の SSID のアクセスポイントに接続してください。

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。

アクセスポイントへの接続方法は以下のページを参考にしてください。

まず右下のネットワークアイコンをクリックしてください。


tu_ev3_14.png

次に一覧から raspberrypi_*** を選択してください。


tu_ev3_15.png

パスワードを入力してください。


tu_ev3_12.png

LANケーブルでの接続

以下の作業は有線で接続する場合の作業なので、無線で接続する場合は不要です。

まず最初にLANケーブルで PC と Raspberry Pi を接続してください。


s_DSC00465.JPG

次に Raspberry Pi Mouse の電源スイッチをオンにしてください。

事前準備

このページ の手順に従ってネームサーバー、RTシステムエディタを起動してください。 予めネームサーバーを起動してある場合は再起動してください。

またネットワークインターフェースが2つ以上ある場合に通信に失敗する可能性があるため、有線で接続した場合は他のネットワークデバイスを無効にしてからネームサーバーを起動してください。


tu_ev3_16.png


raspi_tu25.png

ネームサーバー追加

続いて RTシステムエディタの [ネームサーバー追加] ボタンをクリックして 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が起動します。

tutorial_raspimouse2.png

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。


tutorial_raspimouse18.png

RaspberryPiMouseRTC
InPort
名前 データ型 説明
target_velocity_in RTC::TimedVelocity2D 目標速度
pose_update_in RTC::TimedPose2D 位置設定
buzzer_hz_in RTC::TimedShort ブザー
led4bit_in RTC::TimedBooleanSeq LED
OutPort
名前 データ型 説明
current_velocity_out RTC::TimedVelocity2D 現在の速度
current_pose_out RTC::TimedPose2D 現在位置
ir_sensor_out RTC::TimedShortSeq 距離センサーの計測値
switch3bit_out RTC::TimedBooleanSeq スイッチのオンオフ

TimedVelocity2D 型について

TimedVelocity2D 型は以下のように定義されています。

     struct Velocity2D
     {
         double vx;
         double vy;
         double va;
     };

     struct TimedVelocity2D
     {
         Time tm;
         Velocity2D data;
     };

vx、vy、va はロボット中心座標系での速度を表しています。


tu_ev3_20.png

vx は X方向の速度、vy は Y方向の速度、va は Z軸周りの角速度です。

ラズパイマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定すると vy は 0 になります。

vx、va を指定することでロボットの操作を行います。

サンプルコンポーネント起動

付属資料のstart_component_raspimouse.batを起動してください。 ※OpenRTM-aist Python版をインストールしていない場合、もしくはインストールに失敗している場合は個別に実行ファイル入りの USBメモリーを配布しますので、start_component_raspimouse_exe.batを利用してください。

すると以下の2つの RTC が起動します。

tutorial_raspimouse3_2.png

動作確認

まずはジョイスティックでラズパイマウスを操作してみます。

動作の前にモーター電源スイッチをオンにしておいてください。動作確認が終了したら、モーター電源はオフにするようにしてください。

rpm10.png

RTシステムエディタで RaspberryPiMouseRTC、FloatSeqToVelocity、TkJoyStick を以下のように接続します。

tutorial_raspimouse4.png

そして RTC をアクティブ化するとジョイスティックでラズパイマウスの操作ができるようになります。

tutorial_raspimouse6.png
tutorial_raspimouse5.png

自作の RTC で制御

まずは FloatSeqToVelocity の out と RaspberryPiMouseRTC の target_velocity_in のコネクタを切断してください。

tutorial_raspimouse7.png

FloatSeqToVelocity と RaspberryPiMouseRTC の間に自作の RTC を接続して、距離センサーの値が一定以上になった場合に停止して音を鳴らすようにします。

ひな形コードの作成

RTC ビルダを起動してください。


tutorial_raspimouse8.png

起動したら新規にプロジェクトを作成します。


tutorial_raspimouse9.png

プロジェクト名は TestRasPiMouseCPP(TestRasPiMousePy) にします。

以下のように設定を行ってください。 C++、もしくは Python で作成します。

基本
モジュール名 TestRasPiMouseCPP、もしくはTestRasPiMousePy
アクティビティ
有効アクション onInitialize、onExecute、onActivated、onDeactivated
データポート
InPort
名前 データ型 説明
velocity_in RTC::TimedVelocity2D 入力目標速度
distance_sensor RTC::TimedShortSeq 距離センサーの計測値
OutPort
名前 データ型 説明
velocity_out RTC::TimedVelocity2D 出力目標速度
buzzer RTC::TimedShort ブザー
コンフィギュレーション
名前 説明
stop_distance short 距離センサーで物体を検知した場合に前進しなくなる距離センサーの計測値、デフォルト値は300
言語・環境
言語 C++、もしくはPython

[コード生成] ボタンをクリックするとコードが生成されます。

tutorial_raspimouse10.png

距離センサー

ラズパイマウスの距離センサーは近ければ近いほど大きな値を出力します。

参考までにですが、/dev/rtlightsensor0のデバイスファイルから取得できる数値とセンサーまでの距離との関係は以下のようになっています。


rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

プロジェクト生成

コードが生成できたら C++ の場合は CMake で Visual Studio のプロジェクト(Ubuntu の場合は Code::Blocks)を生成してください。

まずCMake (cmake-gui) を起動します。

  • Windows 7

tu_ev3_10.png

  • Windows 8.1


tutorial_raspimouse12.png

起動したらソースコードのディレクトリー、ビルドを行うディレクトリーに以下を指定します。 括弧内は eclipse の作業ディレクトリーをC:\workspaceにした場合の例です。

Where is the source code RTCBuilder で生成したコードのフォルダー(C:\workspace\TestRasPiMouseCPP)
Where to build the binaries RTCBuilder で生成したコードのフォルダーの下に作成した build フォルダー(C:\workspace\TestRasPiMouseCPP\build)


raspi_tu26.png

[Configure] ボタン → [Generate] ボタンをクリックすると Visual Studio のプロジェクトが生成されます。

ソースコードの編集

build ディレクトリーの TestRasPiMouseCPP.sln を開いてください。

次にコードの編集を行います。

Python の場合はまず変数の初期化部分を修正してください。

  • TestRasPiMousePy.py

     def __init__(self, manager):
         #self._d_velocity_in = RTC.TimedVelocity2D(*velocity_in_arg)
         self._d_velocity_in = RTC.TimedVelocity2D(RTC.Time(0,0),RTC.Velocity2D(0,0,0))

         #self._d_distance_sensor = RTC.TimedShortSeq(*distance_sensor_arg)
         self._d_distance_sensor = RTC.TimedShortSeq(RTC.Time(0,0),[])

         #self._d_velocity_out = RTC.TimedVelocity2D(*velocity_out_arg)
         self._d_velocity_out = RTC.TimedVelocity2D(RTC.Time(0,0),RTC.Velocity2D(0,0,0))

         #self._d_buzzer = RTC.TimedShort(*buzzer_arg)
         self._d_buzzer = RTC.TimedShort(RTC.Time(0,0),0)

まずは onExecute で入力速度をそのまま出力するコードを書いてみます。
C++の場合は以下のようになります。
isNew 関数で新規の入力データが存在するかを確認して、read 関数で変数(m_velocity_in)に格納します。 そして m_velocity_out に出力データを格納してwrite 関数を呼び出すとデータが送信されます。

  • src/TestRaspiMouseCPP.cpp

     if (m_velocity_inIn.isNew())
     {
         m_velocity_inIn.read();
         //入力速度をそのまま出力
         m_velocity_out.data.vx = m_velocity_in.data.vx;
         m_velocity_out.data.vy = m_velocity_in.data.vy;
         m_velocity_out.data.va = m_velocity_in.data.va;
         setTimestamp(m_velocity_out);
         m_velocity_outOut.write();
 
 
     }

Pythonの場合は以下のようになります。

  • TestRasPiMousePy.py

         if self._velocity_inIn.isNew():
             data = self._velocity_inIn.read()
             #入力速度をそのまま出力する
             self._d_velocity_out.data.vx = data.data.vx
             self._d_velocity_out.data.vy = data.data.vy
             self._d_velocity_out.data.va = data.data.va
             OpenRTM_aist.setTimestamp(self._d_velocity_out)
             self._velocity_outOut.write()

次に距離センサーの計測値が一定以上の場合に停止する処理を記述します。
常に距離センサーのデータが入力されるとは限らないので、センサーのデータを格納する変数を宣言します。


C++の場合は TestRasPiMouseCPP.h に記述します。

  • include/TestRasPiMouseCPP/TestRasPiMouseCPP.h

  private:
      int m_last_sensor_data[4];

Pythonの場合はコンストラクタに記述します。

  • TestRasPiMousePy.py

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         self._last_sensor_data = [0, 0, 0, 0]

次に onExecute に停止する処理を記述します。
C++の場合は以下のようになっています。
まずインポート distance_sensor に isNew 関数で新規にデータが入力されたかを確認して、入力されている場合は read 関数で読み込みます。そして変数 m_last_sensor_data に格納します。
そしてインポート velocity_in で受信したデータの vx が0以上の場合には前進しているため障害物に接触するかもしれないと判定して、距離センサーの値が一定以上の場合は停止してブザーを鳴らします。

  • src/TestRaspiMouseCPP.cpp

 RTC::ReturnCode_t TestRasPiMouseCPP::onExecute(RTC::UniqueId ec_id)
 {
     //データを新規に受信した場合に、データを m_last_sensor_data を格納する
     if (m_distance_sensorIn.isNew())
     {
         m_distance_sensorIn.read();
         if (m_distance_sensor.data.length() == 4)
         {
             for (int i = 0; i < 4; i++)
             {
                 m_last_sensor_data[i] = m_distance_sensor.data[i];
             }
         }
     }
 
     if (m_velocity_inIn.isNew())
     {
         m_velocity_inIn.read();
         //vxが0以上(前進)のときのみ停止するか判定する
         if (m_velocity_in.data.vx > 0)
         {
             for (int i = 0; i < 4; i++)
             {
                 //センサーの計測値がstop_distance以上の時に前進しないようにする
                 if (m_last_sensor_data[i] > m_stop_distance)
                 {
                     //停止する
                     m_velocity_out.data.vx = 0;
                     m_velocity_out.data.vy = 0;
                     m_velocity_out.data.va = 0;
                     setTimestamp(m_velocity_out);
                     m_velocity_outOut.write();
                     
                     //ブザーを鳴らす
                     m_buzzer.data = 50;
                     setTimestamp(m_buzzer);
                     m_buzzerOut.write();
 
                     return RTC::RTC_OK;
                 }
             }
         }
         //ブザーを止める
         m_buzzer.data = 0;
         setTimestamp(m_buzzer);
         m_buzzerOut.write();
 
         //入力速度をそのまま出力
         m_velocity_out.data.vx = m_velocity_in.data.vx;
         m_velocity_out.data.vy = m_velocity_in.data.vy;
         m_velocity_out.data.va = m_velocity_in.data.va;
         setTimestamp(m_velocity_out);
         m_velocity_outOut.write();
      }
     
   return RTC::RTC_OK;
 }

Pythonの場合は以下のようになっています。

  • TestRasPiMousePy.py

     def onExecute(self, ec_id):
         #データを新規に受信した場合に、データをm_last_sensor_dataを格納する
         if self._distance_sensorIn.isNew():
             data = self._distance_sensorIn.read()
             if len(data.data) == 4:
                 self._last_sensor_data = data.data[:]
 
 
         
         if self._velocity_inIn.isNew():
             data = self._velocity_inIn.read()
             #vxが0以上(前進)のときのみ停止するか判定する
             if data.data.vx > 0:
                 for d in self._last_sensor_data:
                     #センサーの計測値がstop_distance以上の時に前進しないようにする
                     if d > self._stop_distance[0]:
                         #停止する
                         self._d_velocity_out.data.vx = 0
                         self._d_velocity_out.data.vy = 0
                         self._d_velocity_out.data.va = 0
                         OpenRTM_aist.setTimestamp(self._d_velocity_out)
                         self._velocity_outOut.write()
 
                         #ブザーを鳴らす
                         self._d_buzzer.data = 50
                         OpenRTM_aist.setTimestamp(self._d_buzzer)
                         self._buzzerOut.write()
                         
                         return RTC.RTC_OK
 
             #ブザーを止める
             self._d_buzzer.data = 0
             OpenRTM_aist.setTimestamp(self._d_buzzer)
             self._buzzerOut.write()
 
             #入力速度をそのまま出力する
             self._d_velocity_out.data.vx = data.data.vx
             self._d_velocity_out.data.vy = data.data.vy
             self._d_velocity_out.data.va = data.data.va
             OpenRTM_aist.setTimestamp(self._d_velocity_out)
             self._velocity_outOut.write()
 
         return RTC.RTC_OK

コードの編集が終わったら C++ の場合はビルドしてください。
ビルドに成功すると build\src\Release(Debug) に TestRasPiMouseCPPComp.exe が生成されます。

動作確認

TestRasPiMouseCPPComp.exe (TestRasPiMouseCPPComp.py) をダブルクリックして起動してください。
TestRaspiMouseCPP (TestRaspiMousePy) を以下のように接続してください。

tutorial_raspimouse11.png

最後に RTC をアクティブ化して動作確認してください。

RTシステム保存

RTシステムを保存する場合は System Diagram 上で右クリックして [Save As...] を選択してください。


tutorial_raspimouse15.png

tutorial_raspimouse14.png

RTシステム復元

復元する場合は [Open and Restore] を選択して、先ほど保存したファイルを選択してください。


raspi_tu28.png

RTC 終了

RTC を終了する場合はRTシステムエディタ上で RTC を [exit] してください。


tutorial_raspimouse16.png

Tutorial (Raspberry Pi Mouse, RTM Seminar)

Tutorial (RTM Seminar, Windows, Part 2)

Introduction

This page describes the procedure for creating components for operating the Raspberry Pi mouse on the simulator.

/ja/node/6198

Downloading materials

Please download the materials first.

Please unarchives ZIP file by tools such as Lhaplus.

The seminar may be held in an environment where you cannot connect to the Internet. In that case, it is stored in the distributed USB memory.

Simulator

The simulator is developed using a physics engine called Open Dynamics Engine (ODE): http and a drawing library (drawstuff) that comes with ODE. It works if OpenGL works, so it should work in most environments.

You can simulate the following robot Raspberry Pi mouse.

/jp/node/6005

Not only the dynamic calculation and contact response of the Raspberry Pi mouse on the simulator, but also the data of the distance sensor reproduces the values ​​close to those of a real robot.

Raspberry Pi mouse specifications

The Raspberry Pi mouse is an independent two-wheel drive mobile robot sold by RT corp..

/ja/node/6550

RaspberryPi Mouse Specification
CPU Raspberry Pi 2 Model B
Motor Stepping motor ST-42BYG020 x2
Motor Driver SLA7070MRPT x2
Distance sensor Red LED + Photo-transistor(ST-1K3) x4
Monitor red LEDs x4
Buzzer x1
Tact switch x3
Battery LiPo3-cells (11.1V) 1000mAh x1

RT-Component to be developed

  • RobotController Component

An RT-Component to control the robot on the simulator by connecting with the RaspberryPiMouseSimulator Component.

Creating the RobotController Component

An RT-Component which can operate the robot on the simulator with the GUI (slider) and automatically stops when the sensor value exceeds a certain level will be created.

/ja/node/6310

Development process

The development process is as follows.

  • Confirmation of development environment
  • Determine component specifications
  • Creating a source code template with RTC Builder
  • Edit source code
  • Checking the operation of components

Confirmation of development environment

The following development environment is assumed.

RT-Component's specification

The RobotController has an OutPort that outputs the target speed, an InPort that inputs the sensor value, and configuration parameters that set the target speed and the sensor value to stop.

Name of RT-Component RobotController
InPort
Name of InPort in
Type TimedShortSeq
Description Sensor value
OutPort
Name of OutPort out
Type TimedVelocity2D
Description Target velocity
Configuration
Name of configuration parameter speed_x
Type double
Default value 0.0
Constraints -1.5<x<1.5
Widget slider
Step 0.01
Description The speed of straight-ahead
Configuration
Name of configuration parameter speed_r
Type double
Default value 0.0
Constraints -2.0<x<2.0
Widget slider
Step 0.01
Description The rotational speed
Configuration
Name of configuration parameter stop_d
Type int
Default value 30
Description The sensor value to be stopped the robot

About TimedVelocity2D type

We use the TimedVelocity2D type, which is a data type that stores the moving speed of a moving robot on a two-dimensional plane.

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

This data type can store the velocity vx along the X axis, the velocity vy along the Y axis, and the velocity va around the Z axis.

vxvyva represents the velocity in the robot center coordinate system.


/ja/node/6042

vx is the velocity in the X direction, vy is the velocity in the Y direction, and va is the angular velocity around the Z axis.

For a robot with two wheels mounted on the left and right, such as a Raspberry Pi mouse, vy would be 0 assuming no skidding.

The robot is operated by specifying the straight-ahead speed vx and the rotation speed va.

About distance sensor data

The data of the distance sensor of the Raspberry Pi mouse is designed to output a larger value as the distance to the object gets closer.


rpm14.png

Value from sensor Actual distance[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

The simulator reproduces this value and outputs it. The RobotController component implements a process that automatically stops when this value exceeds a certain level.

RobotController component template generation

RTCBuilder is used to generate the template for the RobotController component.

Start RTCBuilder

In Eclipse, the folder where you do various tasks is called a "workspace", and as a general rule, all products are stored under this folder. You can create a workspace in any folder that you can access, but this tutorial assumes the following workspace.

  • C:\workspace

First, start Eclipse. For Windows 10, you can start it by clicking Start menu> "OpenRTM-aist 1.2.1"> "OpenRTP", or search OpenRTP from the search window in the next of the Start Button.

You will first be asked for the location of the workspace, so specify the workspace above.

/ja/node/6550

Then, the following Welcome page will be displayed.


/ja/node/6550
Eclipse Screen at initial startup

The Welcome page is no longer needed, so click the x button in the upper left to close it.

Click the [Open Perspective] button in the upper right.

/ja/node/6026
Switch perspective

Select RTC Builder to start RTC Builder. The RTCBuilder icon for Hammer and RT appears in the menu bar.

/ja/node/6550
Select perspective

Create a new project

You need to create a new project in RTCBuilder to create the RobotController component.

Click the Open New RTCBuilder Editor icon in the upper left.

/ja/node/6057
Creating a project for RTCBuilder

Enter the project name (here, RobotController) to be created in the Project Name field and click the [Finish] button.

/ja/node/6310

A project with the specified name will be generated and added to the Package Explorer.

/ja/node/6310

The RTC profile XML (RTC.xml) with default values is automatically generated in the generated project.

Launch RTC Profile Editor

When RTC.xml is generated, the RTCBuilder editor should open as the workspace associated with this project. If it doesn't start, double-click RTC.xml in Package Explorer.

/ja/node/6026

Profile information input and code generation

First, select the Basics tab on the far left and enter the basic information. In addition to the RobotController component specifications (name) you decided earlier, enter the outline, version, etc. Items with red labels are required items. Others can be the default.

  • Module name: RobotController
  • Module description: Any (Robot Controller component)
  • Version: Any (1.0.0)
  • Vendor name: Any
  • Module category: Any (Controller)


/ja/node/6310
Input basic information


Then select the Activity tab and specify the action callback to use.

For RobotController component uses the onActivated(), onDeactivated(), onExecute() callbacks. As shown in the figure below, after clicking onAtcivated in (1), check [ON] with the radio button in (2). Just double-clicking the onActivated label toggles [ON] and [OFF]. Follow the same procedure for onDeactivated and onExecute.


/ja/node/6310
Select activity callbacks


In addition, select the DataPort tab and enter the DataPort information. Enter the following based on the specifications you decided above. The variable name and display position are optional and can be left as they are.


  • InPort Profile:
    • Port name: in
    • Data type: TimedShortSeq

  • OutPort Profile:
    • Port name: out
    • Data type: TimedVelocity2D


/ja/node/6310
Input DataPort information


Then select the Configuration tab and enter the Configuration information based on the specifications you just decided. Constraints and widgets are used to change values in the GUI, such as sliders, spin buttons, and radio buttons, when displaying component configuration parameters in RTSystemEditor.

The straight speed speed_x and the rotation speed speed_r make it easier to operate with the slider.


  • speed_x
    • Name: speed_x
    • Data type: double
    • Default value: 0.0
    • Constraints: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • Name: speed_r
    • Data type: double
    • Default value: 0.0
    • Constraints: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • Name: stop_d
    • Data type: int
    • Default value: 30
    • Widget: text


/ja/node/6310
Input configuration parameter information


Next, select the Language / Environment tab and select the programming language. Here, select C++ (language). In addition, defaults etc. are not set for the language and environment, and if you forget to specify it, an error will occur at the time of code generation, so be sure to specify the language.

/ja/node/6310
Select programming language


Finally, click the Generate Code button on the Basic tab to generate a template for the component.


/ja/node/6310
Generate template code


You can open the workspace in Explorer by right-clicking on the project and selecting View> System Explorer.

/ja/node/6550

Generating the files needed to build with CMake

The code generated by RTCBuilder includes CMakeLists.txt to generate various files required for building by CMake. By using CMake, Visual Studio project files, solution files, Makefiles, etc. can be automatically generated from CMakeLists.txt.

Operation of CMake (cmake-gui)

Use CMake to configure the build environment. First, start CMake (cmake-gui). You can start it by clicking Start button> App View (lower right arrow)> CMake X.Y.X> CMake (cmake-gui), or search with cmake-gui from the search window next to the start buttont.

/ja/node/6310
Launch the CMake GUI and specifying the project folder

There are the following text boxes at the top of the screen, so specify the source code location (where CMakeList.txt is) and the build directory, respectively.

  • Where is the soruce code
  • Where to build the binaries

The source code location is where the RobotController component source was generated and where CMakeList.txt resides. The default is <workspace directory>/RobotController.

This directory is set by dragging and dropping from Explorer to cmake-gui without any manual input.

The build directory is the place to store project files, object files, and binaries for building. The location is arbitrary, but in this case it is recommended that you specify a subdirectory of RobotController with a descriptive name, such as <workspace directory>/RobotController/build.

Where is the soruce code C:\workspace\RobotController
Where to build the binaries C:\workspace\RobotController\build

Once specified, click the Configure button below. Then a dialog like the one below will be displayed, so specify the type of project you want to generate. This time, let's call it Visual Studio 16 2019. If you are using Visual Studio 2013 or Visual Studio 2015, please change it. Also set the platform to x64. If you have installed the 32-bit version, select Win32.

/ja/node/6310
Specify the type of project to be generated

Click the [Finish] button in the dialog to start Configure. If there are no problems, Configuring done will be output in the log window at the bottom, so click the [Generate] button. If Generating done is displayed, the output of the project file, solution file, etc. is completed.

Note that CMake generates a cache file at the stage of Configure, so if you change the settings or change the environment due to trouble etc., delete the cache with [File]> [Delete Cache] and start over from Configure.

Editing headers and sources

Then double-click RobotController.sln in the build directory you specified earlier to start Visual Studio.

NOTE: In the new version of cmake-gui, you can start it by clicking the button on cmake-gui.


/ja/node/6310

Edit the header (include/RobotController/RobotController.h) and the source code (src/RobotController.cpp) respectively. Click RobotController.h, RobotController.cpp from the Solution Explorer of Visual Studio to open the edit screen.
/ja/node/6550

Implementation of activity processing

In the RobotController component, the configuration parameters (speed_x, speed_y) are operated with sliders and the values are output from the outport (out) as the target speed. The value input from import (in) is stored in the variable, and if the value exceeds a certain value, it stops.

The following figure shows the processing contents of onActivated(), onExecute(), and onDeactivated().

/ja/node/6310
Overview of activity processing


Editing the header file (RobotController.h)

Declare the variable sensor_data to temporarily store the sensor value.

   private:
      int sensor_data[4];    // A variable that stores the sensor value

Editing the source file (RobotController.cpp)

Implement onActivated(), onDeactivated(), onExecute() as shown below.

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
         // Initialize sensor vaiables
         for (int i = 0; i < 4; i++)
         {
                 sensor_data[i] = 0;
         }
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
         // Stopping the robot
         m_out.data.vx = 0;
         m_out.data.va = 0;
         m_outOut.write();
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
         // Check if data is arrving
         if (m_inIn.isNew())
         {
             // Read input data from InPort
             m_inIn.read();
             for (int i = 0; i < m_in.data.length(); i++)
             {
                 // Storing input data
                 if (i < 4)
                 {
                     sensor_data[i] = m_in.data[i];
                 }
             }
         }
 
         // Determine if robot is stopped only when moving forward
         if (m_speed_x > 0)
         {
             for (int i = 0; i < 4; i++)
             {
                 // Determine if the sensor value is greater than certain value
                 if (sensor_data[i] > m_stop_d)
                 {
                         //Stop if the sensor value is greater than the set value
                         m_out.data.vx = 0;
                         m_out.data.va = 0;
                         m_outOut.write();
                         return RTC::RTC_OK;
                 }
             }
         }
         // If there is no sensor with a value higher than the set value,
        // operate with the value of the configuration parameter.
         m_out.data.vx = m_speed_x;
         m_out.data.va = m_speed_r;
         m_outOut.write();
           return RTC::RTC_OK;
 }

Building on Visual Studio

Run build

Select [Build] > [Build Solution] on the Visual Studio to build.


/ja/node/6026
Run build


Checking the operation of RobotController component

Connect the created RobotController to the simulator component and check the operation.

Start NameService

Start the name service to register the component reference.


Press the name service start button of RT System Editor to start it.

/ja/node/6550

&color(red){NOTE: If omniNames does not start when you click Start Naming Service, make sure the full computer name is set to 14 characters or less.}

Launch the RobotController component

Please start the RobotController component. Run the RobotControllerComp.exe file in the RobotController\build\src\Debug (or Release) folder.

Launching the simulator component

This component starts when you run EXE / RaspberryPiMouseSimulatorComp.exe in the folder where you extracted the file you downloaded earlier (RTM_Tutorial_2018.zip).

Component connection

As shown in the figure below, connect the RobotController component and RaspberryPiMouseSimulator component by using RTSystemEditor.

/ja/node/6310
Component connection

Activate component

Click the All Activate icon at the top of RTSystemEditor to activate all components. If activated successfully, the component will be displayed in yellow-green as shown below.


/ja/node/6550
Activate components


Operation check

You can change the configuration from the [Edit] button in the configuration view as shown below.


/ja/node/6310

Check if you can operate the [Raspberry Pi] mouse on the simulator by operating the slider.


/ja/node/6310
Change the configuration parameters


Operation check on the actual machine

If you have prepared an actual Raspberry Pi mouse on the seminar, you can check the operation on the actual robot, so if you have time to spare, please try it.

The procedure is as follows.

  • Power on the Raspberry Pi mouse
  • Connect to a Raspberry Pi mouse access point
  • Port connection
  • Component activation

Turn on the power

The Raspberry Pi mouse has two power switches, one is the Raspberry Pi power switch and the other is the motor power switch.


rpm8.png


Turn on the power switch on the inside to start the Raspberry Pi.


rpm9.png


Turning off the power

When turning off the Raspberry Pi, do not turn it off directly from the power switch. Press the button in the middle of the three buttons for a few seconds to start shutting down. The Raspbian shutdown will be completed in about 10 seconds, so turn off the power switch after that.


/ja/node/6042

Connect to an access point

Please refer to the following page for how to connect to the access point.

The SSID and password are printed on the sticker attached to the Rasoberry Pi mouse. First, click on the network icon at the bottom right.


/ja/node/6042

Then select raspberrypi _ *** from the list.


/ja/node/6042

Please input password.


/ja/node/6042

If the network is switched, component registration to the name server and port connection may fail, so close all name servers and components once. If you start it after switching the network, there is no problem, so you do not need to stop it.

To restart the Name Server on the RT System Editor, click the "Start Name Service" button again.

/ja/node/6550

Connecting to the Name-Server

Then add 192.168.11.1 with the [Add Name Server] button in the RTSystemEditor.


tutorial_raspimouse0.png tutorial_raspimouse1.png



Then you will see the following three RTCs.

/ja/node/6550

RaspberryPiMouseRTC is an RT-Component for controlling Raspberry Mouse, which is being developed in the Robot System Design Laboratory of Meijo University.

Port connection

Connect the RaspberryPiMouseRTC and RobotController components in the RTSystemEditor as follows.

/ja/node/6310

Turn on the motor

Please turn on the power switch of the motor before operation. Be sure to turn off the power of the motor frequently.


rpm10.png


Activation

Then activate the RTC and you will be able to operate the Raspberry Pi mouse.

Tutorial (RTM Seminar, Ubuntu, Part 2)

Introduction

This document describes the procedure for creating RT-Components for controlling the Raspberry Pi mouse on the simulator.

/jp/node/6198

Downloading materials

Please download the materials first.

 git clone https://github.com/OpenRTM/RTM_Tutorial

The seminar may be held in an environment where you cannot connect to the Internet. In that case, it is stored in the distributed USB memory.

Simulator

The simulator is developed using a physics engine called Open Dynamics Engine (ODE): http and a drawing library (drawstuff) that comes with ODE. It works if OpenGL works, so it should work in most environments.

You can simulate the following robot Raspberry Pi mouse.

/jp/node/6005

Not only the dynamic calculation and contact response of the Raspberry Pi mouse on the simulator, but also the data of the distance sensor reproduces the values ​​close to those of a real robot.

Raspberry Pi mouse specifications

The Raspberry Pi mouse is an independent two-wheel drive mobile robot sold by RT corp..

/ja/node/6550

RaspberryPi Mouse Specification
CPU Raspberry Pi 2 Model B
Motor Stepping motor ST-42BYG020 x2
Motor Driver SLA7070MRPT x2
Distance sensor Red LED + Photo-transistor(ST-1K3) x4
Monitor red LEDs x4
Buzzer x1
Tact switch x3
Battery LiPo3-cells (11.1V) 1000mAh x1

RT-Component to be developed

  • RobotController Component

An RT-Component to control the robot on the simulator by connecting with the RaspberryPiMouseSimulator Component.

Creating the RobotController Component

An RT-Component which can operate the robot on the simulator with the GUI (slider) and automatically stops when the sensor value exceeds a certain level will be created.

/ja/node/6310

Development process

The development process is as follows.

  • Confirmation of development environment
  • Determine component specifications
  • Creating a source code template with RTC Builder
  • Edit source code
  • Checking the operation of components

Confirmation of development environment

The following development environment is assumed. Setup the development environment on Linux (assuming Ubuntu 18.04 here).

Installation of dependent libraries

 sudo apt-get install gcc g++
 sudo apt-get install libomniorb4-dev omniidl omniorb-nameserver
 sudo apt-get install python-omniorb-omg omniidl-python
 sudo apt-get install cmake
 sudo apt-get install doxygen
 sudo apt-get install openjdk-8-jdk

 # Switch to java8 for Ubuntu 18.04
 sudo update-alternatives --config java

Installation of OpenRTM-aist

For ubuntu 18.04 (64bit)

 # Installation of all the OpenRTM-aist packages
 wget https://raw.githubusercontent.com/OpenRTM/OpenRTM-aist/master/scripts/pkg_install_ubuntu.sh
 bash pkg_install_ubuntu.sh -l all --yes
 
After starting eclipse, RTSystemEditor may not be able to connect to the name server. In that case, add your host name to the localhost line in /etc/ hosts.

 $ hostname
 ubuntu1804 <-- hostname is ubuntu1804
 $ sudo vi /etc/hosts

 127.0.0.1       localhost
 chage this line as follows
 127.0.0.1       localhost ubuntu1804

Installation of CMake

 $ sudo apt-get install cmake cmake-gui

Installation of cmake-gui

 $ sudo apt-get install cmake-qt-gui

Installation of Code::Blocks

Code::Blocks is a integrated development environment which supports C/C++ languages. Please install it with the following commands.

 $ sudo apt-get install codeblocks

If you want to get the latest version, enter the following command.

 $ sudo add-apt-repository ppa:damien-moore/codeblocks-stable
 $ sudo apt-get update
 $ sudo apt-get install codeblocks

Installation of Premake

Required for building ODE.

 $ sudo apt-get install premake4 freeglut3-dev

Build RaspberryPiMouseSimulator component

Build the simulator components manually. Enter the following command.

 $ wget https://raw.githubusercontent.com/OpenRTM/RTM_Tutorial_ROBOMECH2019/master/script/install_raspimouse_simulator.sh
 $ sudo sh install_raspimouse_simulator.sh

The seminar may be held in an environment where you cannot connect to the Internet. In that case, start the script in the distributed USB memory.

 $ sudo sh install_raspimouse_simulator_usb.sh

Component specifications

The RobotController has an outport that outputs the target speed, an import that inputs the sensor value, and configuration parameters that set the target speed and the sensor value to stop.

Name of RT-Component RobotController
InPort
Name of InPort in
Type TimedShortSeq
Description Sensor value
OutPort
Name of OutPort out
Type TimedVelocity2D
Description Target velocity
Configuration
Name of configuration parameter speed_x
Type double
Default value 0.0
Constraints -1.5<x<1.5
Widget slider
Step 0.01
Description The speed of straight-ahead
Configuration
Name of configuration parameter speed_r
Type double
Default value 0.0
Constraints -2.0<x<2.0
Widget slider
Step 0.01
Description The rotational speed
Configuration
Name of configuration parameter stop_d
Type int
Default value 30
Description The sensor value to be stopped the robot

About TimedVelocity2D type

We use the TimedVelocity2D type, which is a data type that stores the moving speed of a moving robot on a two-dimensional plane.

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

This data type can store the velocity vx along the X axis, the velocity vy along the Y axis, and the velocity va around the Z axis.

vxvyva represents the velocity in the robot center coordinate system.


/ja/node/6042

vx is the velocity in the X direction, vy is the velocity in the Y direction, and va is the angular velocity around the Z axis.

For a robot with two wheels mounted on the left and right, such as a Raspberry Pi mouse, vy would be 0 assuming no skidding.

The robot is operated by specifying the straight-ahead speed vx and the rotation speed va.

About distance sensor data

The data of the distance sensor of the Raspberry Pi mouse is designed to output a larger value as the distance to the object gets closer.


rpm14.png

Value from sensor Actual distance[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

The simulator reproduces this value and outputs it. The RobotController component implements a process that automatically stops when this value exceeds a certain level.

RobotController component template generation

RTCBuilder is used to generate the template for the RobotController component.

Start RTCBuilder

In Eclipse, the folder where you do various tasks is called a "workspace", and as a general rule, all products are stored under this folder. You can create a workspace in any folder that you can access, but this tutorial assumes the following workspace.

  • /home/<User name>/workspace

First, start Eclipse with the following command.

 $ openrtp

You will first be asked for the location of the workspace, so specify the workspace above.

/ja/node/6058

Then, the following Welcome page will be displayed.


/ja/node/6026
Eclipse の初期起動時の画面

The Welcome page is no longer needed, so click the x button in the upper left to close it.

Click the [Open Perspective] button in the upper right.

/ja/node/6026
Switch perspective

Select RTC Builder to start RTC Builder. The RTCBuilder icon for Hammer and RT appears in the menu bar.

/ja/node/6026
パースペクティブの選択

Create a new project

You need to create a new project in RTCBuilder to create the RobotController component.

Click the Open New RTCBuilder Editor icon in the upper left.

/ja/node/6057
Creating a project for RTCBuilder

Enter the project name (here, RobotController) to be created in the Project Name field and click the [Finish] button.

/ja/node/6310

A project with the specified name will be generated and added to the Package Explorer.

/ja/node/6310

he RTC profile XML (RTC.xml) with default values is automatically generated in the generated project.

Launch RTC Profile Editor

When RTC.xml is generated, the RTCBuilder editor should open as the workspace associated with this project. If it doesn't start, double-click RTC.xml in Package Explorer.

/ja/node/6026

Profile information input and code generation

First, select the Basics tab on the far left and enter the basic information. In addition to the RobotController component specifications (name) you decided earlier, enter the outline, version, etc. Items with red labels are required items. Others can be the default.

  • Module name: RobotController
  • Module description: Any (Robot Controller component)
  • Version: Any (1.0.0)
  • Vendor name: Any
  • Module category: Any (Controller)


/ja/node/6310
Input basic information


Then select the Activity tab and specify the action callback to use.

For RobotController component uses the onActivated(), onDeactivated(), onExecute() callbacks. As shown in the figure below, after clicking onAtcivated in (1), check [ON] with the radio button in (2). Just double-clicking the onActivated label toggles [ON] and [OFF]. Follow the same procedure for onDeactivated and onExecute.


/ja/node/6310
Select activity callbacks


In addition, select the DataPort tab and enter the DataPort information. Enter the following based on the specifications you decided above. The variable name and display position are optional and can be left as they are.


  • InPort Profile:
    • Port name: in
    • Data type: TimedShortSeq

  • OutPort Profile:
    • Port name: out
    • Data type: TimedVelocity2D


/ja/node/6310
Input DataPort information


Then select the Configuration tab and enter the Configuration information based on the specifications you just decided. Constraints and widgets are used to change values in the GUI, such as sliders, spin buttons, and radio buttons, when displaying component configuration parameters in RTSystemEditor.

The straight speed speed_x and the rotation speed speed_r make it easier to operate with the slider.


  • speed_x
    • Name: speed_x
    • Data type: double
    • Default value: 0.0
    • Constraints: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • Name: speed_r
    • Data type: double
    • Default value: 0.0
    • Constraints: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • Name: stop_d
    • Data type: int
    • Default value: 30
    • Widget: text


/ja/node/6310
Input configuration parameter information


Next, select the Language / Environment tab and select the programming language. Here, select C++ (language). In addition, defaults etc. are not set for the language and environment, and if you forget to specify it, an error will occur at the time of code generation, so be sure to specify the language.

/ja/node/6310
プログラミング言語の選択


Finally, click the Generate Code button on the Basic tab to generate a template for the component.


/ja/node/6310
雛型の生成(Generate)


The generated code set are generated in the workspace folder specified when eclipse is started. You can see your current workspace in File> Switch Workspace ...

Generating the files needed to build with CMake

The code generated by RTCBuilder includes CMakeLists.txt to generate various files required for building by CMake. By using CMake, Visual Studio project files, solution files, Makefiles, etc. can be automatically generated from CMakeLists.txt.

Operation of CMake (cmake-gui)

Use CMake to configure the build environment. First, start CMake (cmake-gui).

 $ cmake-gui
/ja/node/6311
Launching CMake GUI and specifying target directory

At the top of the window, there are text boxes like the one below, so specify the source code location (where CMakeList.txt is) and the build directory, respectively.

  • Where is the soruce code
  • Where to build the binaries

The source code location is where the RobotController component source was generated and where CMakeList.txt resides. The default is <workspace directory>/RobotController.

This directory is set by dragging and dropping from Explorer to cmake-gui without any manual input.

The build directory is the place to store project files, object files, and binaries for building. The location is arbitrary, but in this case it is recommended that you specify a subdirectory of RobotController with a descriptive name, such as <workspace directory>/RobotController/build.

Where is the soruce code /home/<user name>/RobotController
Where to build the binaries /home/<user name>/RobotController\build

Once specified, click the [Configure] button below. Then a dialog like the one below will be opened, so specify the type of project you want to generate. This time, specify CodeBlocks -- Unix Makefiles. If you don't use Code::Blocks, use Unix Makefiles.

/ja/node/6026
Specify the type of project to be generated

If you don't use cmake-gui, you can generate a Makefiles with the following command.

 $ mkdir build
 $ cd build
 $ cmake .. -G "CodeBlocks - Unix Makefiles"

Click the [Finish] button in the dialog to start Configure. If there are no problems, Configuring done will be output in the log window at the bottom, so click the [Generate] button. If Generating done is displayed, the output of the project file, solution file, etc. is completed.

Note that CMake generates a cache file at the stage of Configure, so if you change the settings or change the environment due to trouble etc., delete the cache with [File]> [Delete Cache] and start over from Configure.

Editing headers and sources

Then double-click RobotController.cbp in the build directory you specified earlier to start Code::Blocks.

Edit the header (include/RobotController/RobotController.h) and the source code (src/RobotController.cpp) respectively. Click RobotController.h, RobotController.cpp from the Project explorer of Code::Blocks to open the edit screen.

/ja/node/6311

Code::Blocks may become unstable in a 64-bit environment. In that case, disabling the code completion plugin may work.

Please select [Plugins]>[Manage plugins...].

/ja/node/6057/

Select [code completion] and click the [Disable] button.

/ja/node/6057/

If it doesn't work, try this procedure.

アクティビティ処理の実装

Implementation of activity processing

In the RobotController component, the configuration parameters (speed_x, speed_y) are operated with sliders and the values are output from the outport (out) as the target speed. The value input from import (in) is stored in the variable, and if the value exceeds a certain value, it stops.

The following figure shows the processing contents of onActivated(), onExecute(), and onDeactivated().

/ja/node/6310/
Overview of activity processing


Editing the header file (RobotController.h)

Declare the variable sensor_data to temporarily store the sensor value.

   private:
      int sensor_data[4];    // A variable that stores the sensor value

Editing the source file (RobotController.cpp)

Implement onActivated(), onDeactivated(), onExecute() as shown below.

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
         // Initialize sensor vaiables
         for (int i = 0; i < 4; i++)
         {
                 sensor_data[i] = 0;
         }
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
         // Stopping the robot
         m_out.data.vx = 0;
         m_out.data.va = 0;
         m_outOut.write();
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
         // Check if data is arrving
         if (m_inIn.isNew())
         {
             // Read input data from InPort
             m_inIn.read();
             for (int i = 0; i < m_in.data.length(); i++)
             {
                 // Storing input data
                 if (i < 4)
                 {
                     sensor_data[i] = m_in.data[i];
                 }
             }
         }
 
         // Determine if robot is stopped only when moving forward
         if (m_speed_x > 0)
         {
             for (int i = 0; i < 4; i++)
             {
                 // Determine if the sensor value is greater than certain value
                 if (sensor_data[i] > m_stop_d)
                 {
                         //Stop if the sensor value is greater than the set value
                         m_out.data.vx = 0;
                         m_out.data.va = 0;
                         m_outOut.write();
                         return RTC::RTC_OK;
                 }
             }
         }
         // If there is no sensor with a value higher than the set value,
        // operate with the value of the configuration parameter.
         m_out.data.vx = m_speed_x;
         m_out.data.va = m_speed_r;
         m_outOut.write();
           return RTC::RTC_OK;
 }

Building on Code::Blocks

Run build

Please click [Build] button oon the Code::Blocks to build the project.


/ja/node/6311
Run build


Checking the operation of RobotController component

Connect the created RobotController to the simulator component and check the operation.

Start NameService

Start the name service to register the component reference as follows.


 $ rtm-naming

Launch the RobotController component

Please start the RobotController component. Run the RobotControllerComp file in the RobotController/build/src folder.

 $ ./RobotControllerComp

Launching the simulator component

After moved to the directory where the RaspberryPiMouseSimulator component is installed ({the directory where the install_raspimouse_simulator.sh script is run}/RasPiMouseSimulatorRTC/build), launch with the following command.

 $ ./src/RaspberryPiMouseSimulatorComp

Component connection

As shown in the figure below, connect the RobotController component and RaspberryPiMouseSimulator component by using RTSystemEditor.

/ja/node/6310
コンポーネントの接続

Activate component

Click the All Activate icon at the top of RTSystemEditor to activate all components. If activated successfully, the component will be displayed in yellow-green as shown below.


/ja/node/6310
Activate components


Operation check

You can change the configuration from the [Edit] button in the configuration view as shown below.


/ja/node/6311

Check if you can operate the [Raspberry Pi] mouse on the simulator by operating the slider.


/ja/node/6310
コンフィギュレーションパラメーターの変更


Operation check on the actual machine

If you have prepared an actual Raspberry Pi mouse on the seminar, you can check the operation on the actual robot, so if you have time to spare, please try it.

The procedure is as follows.

  • Power on the Raspberry Pi mouse
  • Connect to a Raspberry Pi mouse access point
  • Port connection
  • Component activation

Turn on the power

The Raspberry Pi mouse has two power switches, one is the Raspberry Pi power switch and the other is the motor power switch.


rpm8.png


Turn on the power switch on the inside to start the Raspberry Pi.


rpm9.png


Turning off the power

When turning off the Raspberry Pi, do not turn it off directly from the power switch. Press the button in the middle of the three buttons for a few seconds to start shutting down. The Raspbian shutdown will be completed in about 10 seconds, so turn off the power switch after that.


/ja/node/6042

Connect to an access point

Please refer to the following page for how to connect to the access point.

If the network is switched, the component registration to the name server and the port connection may fail, so close all the name server and components once. If you start it after switching the network, there is no problem, so you do not need to stop it.

To restart the Name Server on the RT System Editor, click the "Start Name Service" button again.

/ja/node/6550

Connecting to the Name-Server

Then add 192.168.11.1 with the [Add Name Server] button in the RTSystemEditor.


tutorial_raspimouse0.png tutorial_raspimouse1.png



Then you will see the following two RTCs.

/ja/node/6311

RaspberryPiMouseRTC is an RT-Component for controlling Raspberry Mouse, which is being developed in the Robot System Design Laboratory of Meijo University.

Port connection

Connect the RaspberryPiMouseRTC and RobotController components in the RTSystemEditor as follows.

/ja/node/6310

Turn on the motor

Please turn on the power switch of the motor before operation. Be sure to turn off the power of the motor frequently.


rpm10.png


Activation

Then activate the RTC and you will be able to operate the Raspberry Pi mouse.

Tutorial (RTM Seminar, Part 3)

このページではRaspberry PiマウスとLEGO Mindstorms EV3を連携したRTシステムの構築を行います。

Raspberry Piマウスをアクセスポイントとして、ノートPCとEV3をアクセスポイントに接続します。

※Raspberry Piマウスと同じ番号のEV3を使用するようにしてください。


/ja/node/6552

EV3のデバイス

EV3 には以下のデバイスが付属しています。

ジャイロセンサー
45505_GyroSensor.jpg
確度モード: 精度 +/- 3°
角速度モード: 最大 440 deg/sec
サンプリングレート 1,000 Hz
カラーセンサー
45506_color.jpg
計測: 赤色光の反射光、 周囲の明るさ、色
検出カラー数: 8色 (無色、黒、青、緑、黄、赤、白、茶)
サンプリングレート 1,000 Hz
距離 約1mm~18mm(アフレル調査値)
タッチセンサー
45507_TouchSensor.jpg
オン (1), オフ (0)
スイッチ可動域: 約4mm
超音波センサー
45504_UltrasonicSensor.jpg
距離計測可能範囲: 3cmから250cm
距離計測精度: +/- 1 cm
前面電飾: 点灯:超音波発信中、 点滅:超音波観測中
EV3 Lモーター
45502_LargeMotor.jpg
フィードバック: 1°単位
回転数: 160から170RPM
定格トルク: 0.21 N・m (30oz*in)
停動トルク: 0.42 N・m (60oz*in)
重さ: 76 g
EV3 Mモーター
45503_MediumMotor.jpg
フィードバック 1°単位
回転数: 240から250RPM
定格トルク: 0.08 N・m (11oz*in)
停動トルク: 0.12 N・m (17oz*in)
重さ: 36 g

EV3の組立て

まず、EV3本体を土台に装着します。


/ja/node/6552

次に25cmケーブルでEV3と左右のLモーターを接続します。


45502_LargeMotor.jpg
Lモーター


Lモーター右 ポート C 25cmケーブル
Lモーター左 ポート B 25cmケーブル


/ja/node/6552

ケーブルに接続するポート、デバイス名は記載してあります。

他のデバイスを取り付ける場合は、チュートリアル(EV3)を参考にしてください。

EV3との接続

ノートPCとRaspberry Piの接続

第二部の、実機での動作確認まで完了してください。 この時点でノートPCとアクセスポイントのRaspberry Piが接続されているはずです。


/ja/node/6552

EV3の電源の入れ方/切り方

電源の入れ方

中央のボタンを押せば電源が投入されます。


/ja/node/6041

電源の切り方

EV3 の電源を切る場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Power Off」を選択してください。


/ja/node/6041


/ja/node/6041

再起動

再起動する場合は最初の画面で EV3 本体の左上の戻るボタンを押して「Reboot」を選択してください。

リセット

ev3dev の起動が途中で停止する場合には、中央ボタン、戻るボタン(左上)、左ボタンを同時押ししてください。画面が消えたら戻るボタンを離すと再起動します。


/ja/node/6041

Raspberry PiとEV3の接続

EV3の電源を投入してください。

起動後にRaspberry Piに自動接続します。 自動接続できた場合は、EV3の画面左上にIPアドレスが表示されます。 IPアドレスは192.168.11.yyyが表示されます。


/ja/node/6384

ネームサーバー、RTCの起動

EV3の画面上の操作でネームサーバーとRTCを起動します。

EV3 の操作画面から「File Browser」→「scripts」を選択してください。

ネームサーバー、RTCはstart_rtcs.shのスクリプトを実行することで起動します。

 ------------------------------
 192.168.11.yyy
 ------------------------------
         File Browser
 ------------------------------
 /home/robot/scripts
 ------------------------------
 ../
 Component/
 ・・
 [start_rtcs.sh                 ]
 ------------------------------


/ja/node/6384

ネームサーバー追加

RTシステムエディタから、192.168.11.yyyのネームサーバーに接続してください。


tutorial_raspimouse0.png tutorial_ev3_irex22.png



この時点でRTシステムエディタのネームサービスビューにはlocalhost、192.168.11.1、192.168.11.yyyのネームサーバーが登録されています。 192.168.11.yyyのネームサーバーに登録されているRTCの名前はEducatorVehicle1となります。


/ja/node/6552

  • localhost
    • RobotController0
  • 192.168.11.1
    • RaspberryPiMouseRTC0
    • OpenCVCamera0
    • artp0
  • 192.168.11.yyy
    • EducatorVehicle1

動作確認

RaspberryPiMouseRTC0(192.168.11.1)とEducatorVehicle1(192.168.11.yyy)をシステムダイアグラム上で接続してください。 EducatorVehicle0の現在の速度出力をRaspberryPiMouseRTC0の目標速度入力に接続することで、EV3の動きにRaspberry Piマウスが追従するようになります。


/ja/node/6552

RTCをアクティベートしてEducator Vehicleの車輪を転がすと、Raspberry Piマウスがそれに合わせて動作します。


/ja/node/6552

自由課題

これで実習は一通り終了ですが、時間が余っている場合は以下のような課題に挑戦してみてください。

EV3のタッチセンサのオンオフでRaspberry Piマウスを操作

EV3のタッチセンサーのオンオフでRaspberry Piマウスを前進後退させるRTシステムを作成します。


45507_TouchSensor.jpg
タッチセンサー


タッチセンサー接続

EV3とタッチセンサーを35cmケーブルで接続してください。

タッチセンサー右 ポート 3 35cmケーブル
タッチセンサー左 ポート 1 35cmケーブル

RTCの作成

以下のような仕様のRTCを作成します。

コンポーネント名称 SampleTouchSensor
InPort
ポート名 touch
TimedBooleanSeq
説明 タッチセンサーのオンオフ
OutPort
ポート名 target_velocity
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed
double
デフォルト値 0.2
説明 タッチセンサがオンの時の直進速度の設定

アクティビティでonExecuteを有効にしてください。

SampleTouchSensorのonExecute関数に以下のように記述します。

 RTC::ReturnCode_t SampleTouchSensor::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_touchIn.isNew())
     {
         //データの読み込み
         m_touchIn.read();
         //配列の要素数が1以上かを確認
         if (m_touch.data.length() == 2)
         {
             //0番目のデータがオンの場合は直進する指令を出力
             //0番目のデータは右側のタッチセンサに対応
             if (m_touch.data[0])
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = m_speed;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
             //1番目のデータがオンの場合は後退する指令を出力
             //1番目のデータは左側のタッチセンサに対応
             else if (m_touch.data[1])
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = -m_speed;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
             //オフの場合は停止する
             else
             {
                 //目標速度を格納
                 m_target_velocity.data.vx = 0;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 //データ出力
                 m_target_velocityOut.write();
             }
         }
     }
   return RTC::RTC_OK;
 }

RTシステム作成

データポートを以下のように接続後、タッチセンサをオンオフするとRaspberry Piが前進後退します。


/ja/node/6552

ジョイスティックコンポーネントで2台同時に操作

以下GUIジョイスティックでRaspberry Piマウス、EV3を操作するRTシステムを作成します。


/ja/node/6552

ジョイスティックコンポーネント起動

ジョイスティックコンポーネントはOpenRTM-aist Python版のサンプルにあります(TkJoyStickComp.py)。 ジョイスティックコンポーネントは、Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.2.0」>「Python_Examples」をクリックして、エクスプローラーで「TkJoyStickComp.bat」をダブルクリックして起動してください。

RTC作成

TkJoyStickComp.pyのアウトポートのデータ型はTimedFloatSeq型であるため、TimedVelocity2D型に変換するRTCを作成する必要があります。

以下のような仕様のRTCを作成してください。

コンポーネント名称 FloatSeqToVelocity
InPort
ポート名 in
TimedFloatSeq
説明 変換前のデータ
OutPort
ポート名 out
TimedVelocity2D
説明 変換後のデータ
Configuration
パラメーター名 rotation_by_position
double
デフォルト値 -0.02
説明 ジョイスティックのX座標の位置に対する角速度の変化量
Configuration
パラメーター名 velocity_by_position
double
デフォルト値 0.002
説明 ジョイステックのY座標に対する速度の変化量

アクティビティはonExecuteをオンにしてください。

onExecute関数を以下のように編集してください。

 RTC::ReturnCode_t FloatSeqToVelocity::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_inIn.isNew())
     {
         //データの読み込み
         m_inIn.read();
         //配列のデータ数確認
         if (m_in.data.length() >= 2)
         {
             //目標速度格納
             m_out.data.vx = m_in.data[1] * m_velocity_by_position;
             m_out.data.vy = 0;
             m_out.data.va = m_in.data[0] * m_rotation_by_position;
             setTimestamp(m_out);
             //目標速度出力
             m_outOut.write();
         }
     }
   return RTC::RTC_OK;
 }

RTシステム作成

以下のようにデータポートを接続してください。


/ja/node/6552

EV3をしゃべらせる

EducatorVehicleRTCのsoundという名前のインポートに文字列(TimedString型)を入力すると、EV3が発声します。

RTC作成

以下のような仕様のRTCを作成してください。

コンポーネント名称 SpeechSample
OutPort
ポート名 out
TimedString
説明 発話する文字列

アクティビティはonExecuteをオンにしてください。

onExecute関数を以下のように編集してください。

 RTC::ReturnCode_t SpeechSample::onExecute(RTC::UniqueId ec_id)
 {
     std::cout << "Please input: ";
     std::string ret;
     //文字入力
     std::cin >> ret;
     //データに格納
     m_out.data = CORBA::string_dup(ret.c_str());
     setTimestamp(m_out);
     //データ出力
     m_outOut.write();
 
   return RTC::RTC_OK;
 }

文字列(const char*)をデータポートで出力する際はCORBA::string_dup関数で文字列をコピーする必要があります。

 m_out.data= CORBA::string_dup("abc");

RTシステム作成

以下のようにデータポートを接続してください。


/ja/node/6552

マーカーの追従

Raspberry Piマウスを起動すると、OpenCVCameraコンポーネントとarptコンポーネントが起動します。 OpenCVCameraコンポーネントは画像を取得するコンポーネント、artpコンポーネントは画像データからマーカの位置姿勢を計算して出力するコンポーネントです。


/ja/node/6552

Raspberry Piマウスがマーカーに追従するRTシステムを作成します。

カメラの装着

まずはカメラをRaspberry Piマウスに装着します。

以下の土台部品をRaspberry Piマウスに取り付けていきます。


/ja/node/6552

部品①をRaspberry Piマウスの上部に装着してください。 左から押し込むようにして取り付けます。


/ja/node/6552


この時、左側の突起がプレートを挟むように取り付けてください。


/ja/node/6552

部品②を部品①の左側に上から差し込んでください。


/ja/node/6552



/ja/node/6552

部品③を左側から部品②に差し込んでください。


/ja/node/6552

最後にカメラを搭載して、USBケーブルをRaspberry Piに差し込んだら完成です。


/ja/node/6552



/ja/node/6552


RTC作成

以下の仕様でRTCを作成してください。

コンポーネント名称 testARToolKit
InPort
ポート名 marker_pos
TimedPose3D
説明 マーカーの位置
OutPort
ポート名 target_vel
TimedVelocity2D
説明 ロボットの目標速度
Configuration
パラメーター名 x_distance
double
デフォルト値 0.5
説明 マーカーまでの目標距離(X軸)
Configuration
パラメーター名 y_distance
double
デフォルト値 0
説明 マーカーまでの目標距離(Y軸)
Configuration
パラメーター名 x_speed
double
デフォルト値 0.1
説明 X軸方向移動速度
Configuration
パラメーター名 r_speed
double
デフォルト値 0.2
説明 回転方向移動速度
Configuration
パラメーター名 error_range_x
double
デフォルト値 0.1
説明 X軸方向目標距離の許容範囲
Configuration
パラメーター名 error_range_y
double
デフォルト値 0.05
説明 Y軸方向目標距離の許容範囲

アクティビティはonExecuteをONにしてください。

onExecuteを以下のように編集してください。

 RTC::ReturnCode_t testARToolKit::onExecute(RTC::UniqueId ec_id)
 {
     //新規データの確認
     if (m_marker_posIn.isNew())
     {
         m_target_vel.data.vx = 0;
         m_target_vel.data.vy = 0;
         m_target_vel.data.va = 0;
 
         //データの読み込み
         m_marker_posIn.read();
         //マーカーの位置(X軸)が目標距離(X軸)よりも大きい場合
         if (m_marker_pos.data.position.x > m_x_distance + m_error_range_x/2.0)
         {
             m_target_vel.data.vx = m_x_speed;
         }
         //マーカーの位置(X軸)が目標距離(X軸)よりも小さい場合
         else if (m_marker_pos.data.position.x < m_x_distance - m_error_range_x/2.0)
         {
             m_target_vel.data.vx = -m_x_speed;
         }
         //マーカーの位置(Y軸)が目標距離(Y軸)よりも大きい場合
         else if (m_marker_pos.data.position.y > m_y_distance + m_error_range_y/2.0)
         {
             m_target_vel.data.va = m_r_speed;
         }
         //マーカーの位置(Y軸)が目標距離(Y軸)よりも小さい場合
         else if (m_marker_pos.data.position.y < m_y_distance - m_error_range_y/2.0)
         {
             m_target_vel.data.va = -m_r_speed;
         }
         setTimestamp(m_target_vel);
         //データ書き込み
         m_target_velOut.write();
     }
   return RTC::RTC_OK;
 }

RTシステム作成

データポートを以下のように接続してください。


/ja/node/6552

RTCをアクティベートしてカメラの前でマーカーを動かして、Raspberry Piマウスが移動するかを確認してください。

Tutorial (RTM Seminar, Part 4)

はじめに

このページではLibreOffice Calc用RTCによるRTCの動作確認手順について説明します。 Calcのセルの値をInPortに入力、OutPortの出力した値をセルに表示することで対象RTCの挙動を確認できます。

/jp/node/6586

RTM講習会ではUSBメモリでポータブル版LibreOfficeとRTCを配布します。 Windowsで実行できます。 UbuntuはPython3用のomniORBのパッケージがないため実行できません。講習会ではノートPCを貸し出します。

この実習では第2部で作成したRobotControllerコンポーネントを使用します。

LibreOfficeとは?

表計算、パワーポイント、ワープロ機能等を提供するオフィススイートです。 フリーソフトとして公開されており、今回の講習会では以下のポータブル版を使用します。

LibreOffice Calc用RTCの起動

配布したUSBメモリ内のポータブル版LibreOffice\run_CalcRTC.batを実行します。

LibreOffice Calcが起動するため、RTC起動ボタンをクリックすることでOOoCalcControlというRTCを起動します。

/jp/node/6586

OutPortの接続

RobotControllerのOutPortと接続し、Calcで出力データの確認ができるようにします。 Calcの操作ダイアログ起動ボタンをクリックしてください。

/jp/node/6586

まずは出力データを確認するOutPortと接続します。 ツリー表示ボタンを押下してネームサーバーに登録されたRTCのポート一覧を表示後、ツリーからRobotController0のoutを選択します。

/jp/node/6586

次に一部設定を変更します。

列を移動させるのチェックを外してください。 このチェックが有効の場合、データを受信する度にセルの位置が移動するモードで動作します。 グラフに描画する場合は位置が移動するモードを使用しますが、今回は単純に値を確認したいだけのためチェックを外します。

列番号の右のボックスにCと入力してください。 これで2行目のAC列のセルにOutPortの出力データを表示するようになりました。

設定完了後、作成ボタンを押してください。

/jp/node/6586

OutPortの動作確認

RT System Editor上でRTCをアクティブ化して動作を確認してください。

/jp/node/6586

この状態でコンフィギュレーションパラメータを操作してCalcのセルの値が変化するかを確認してください。

/jp/node/6586

InPortの接続

RobotControllerのInPortと接続し、Calcからデータの入力を行うようにします。

ツリー表示ボタンを押下してネームサーバーに登録されたRTCのポート一覧を表示後、ツリーからRobotController0のinを選択します。

/jp/node/6586

次に一部設定を変更します。

列を移動させるのチェックを外してください。

列番号の右のボックスにDと入力してください。 これで3行目のAC列のセルにOutPortの出力データを表示するようになりました。

設定完了後、作成ボタンを押してください。

/jp/node/6586

InPortの動作確認

RT System Editor上でRTCをアクティブ化して動作を確認してください。

この状態でコンフィギュレーションパラメータで前進する速度をOutPortから出力するように操作してください。 その後、Calcの3行目のAC列のセルに31以上の値を入力するか、30以下の値を入力するかで動作が変化するかを確認してください。

/jp/node/6586

Tutorial (Raspberry Pi Mouse, Bootcamp)

Tutorial (Raspberry Pi Mouse, C++, Windows, Bootcamp)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/ja/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。

ZIPファイルは Lhaplus 等で展開してください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

Raspberry Piマウスの仕様

Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。

/ja/node/6550

ラズパイマウスの仕様
CPU Raspberry Pi 2 Model B
モーター ステッピングモーターST-42BYG020 2個
モータードライバー SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

作成する RTコンポーネント

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builderによるソースコードのひな形の作成
  • ソースコードの編集
  • コンポーネントの動作確認

開発環境の確認

以下の環境を想定しています。

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Pi マウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型の生成

RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • C:\workspace

まずは Eclipse を起動します。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.2.0」>「OpenRTP」をクリックすると起動できます。

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6550

すると、以下のようなWelcomeページが表示されます。


/ja/node/6550
Eclipse の初期起動時の画面

Welcomeページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilder が起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが表示されます。

/ja/node/6550
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] ボタンをクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

プロファイル情報入力とコードの生成

まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた RobotController コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


/ja/node/6310
基本情報の入力


次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、C++(言語)を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。

/ja/node/6310
プログラミング言語の選択


最後に、「基本」タブにあ [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。


/ja/node/6310
雛型の生成(Generate)


プロジェクトを右クリックして、「表示方法」→「システム・エクスプローラー」を選択するとワークスペースをエクスプローラーで開くことができます。

/ja/node/6550

CMake によるビルドに必要なファイルの生成

RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt からVisual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。

CMake(cmake-gui) の操作

CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。「スタート」>「アプリビュー(右下矢印)」>「CMake 3.11.2」>「CMake (cmake-gui)」をクリックすると起動できます。

/ja/node/6310
CMake GUI の起動とディレクトリーの指定

画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txtがある場所) と、ビルドディレクトリーを指定します。

  • Where is the soruce code
  • Where to build the binaries

ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。

このディレクトリーはエクスプローラから cmake-gui にドラックアンドドロップすると手入力しなくても設定されます。

ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。

Where is the soruce code C:\workspace\RobotController
Where to build the binaries C:\workspace\RobotController\build

指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は Visual Studio 15 2017 とします。Visual Studio 2013や Visual Studio 2019を利用している方はそれぞれ変更してください。 またプラットフォームにはx64を設定します。32bit版をインストールしている場合はWin32を選択してください。

/ja/node/6310
生成するプロジェクトの種類の指定

ダイアログで [Finish] ボタンをクリックすると Configure が始まります。 問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。

なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] でキャッシュを削除して Configure からやり直してください。

ヘッダ、ソースの編集

次に先ほど指定した build ディレクトリーの中の RobotController.sln をダブルクリックして Visual Studio 2013 を起動します。

※cmake-gui の新しいバージョンでは cmake-gui 上のボタンをクリックすることで起動できます。


/ja/node/6310

ヘッダ (include/RobotController/RobotController.h) およびソースコード (src/RobotController.cpp) をそれぞれ編集します。 Visual Studio のソリューションエクスプローラから RobotController.h、RobotController.cpp をクリックすることで編集画面が開きます。
/ja/node/6550

アクティビティ処理の実装

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

/ja/node/6310
アクティビティ処理の概要


ヘッダファイル (RobotController.h) の編集

センサー値を一時的に格納する変数 sensor_data を宣言します。

   private:
      int sensor_data[4];    //センサー値を一時格納する変数

ソースファイル (RobotController.cpp) の編集

下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
         //センサー値初期化
         for (int i = 0; i < 4; i++)
         {
                 sensor_data[i] = 0;
         }
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
         //ロボットを停止する
         m_out.data.vx = 0;
         m_out.data.va = 0;
         m_outOut.write();
 
         return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
         //入力データの存在確認
         if (m_inIn.isNew())
         {
             //入力データ読み込み
             m_inIn.read();
             for (int i = 0; i < m_in.data.length(); i++)
             {
                 //入力データ格納
                 if (i < 4)
                 {
                     sensor_data[i] = m_in.data[i];
                 }
             }
         }
 
         //前進するときのみ停止するかを判定
         if (m_speed_x > 0)
         {
             for (int i = 0; i < 4; i++)
             {
                 //センサー値が設定値以上か判定
                 if (sensor_data[i] > m_stop_d)
                 {
                         //センサー値が設定値以上の場合は停止
                         m_out.data.vx = 0;
                         m_out.data.va = 0;
                         m_outOut.write();
                         return RTC::RTC_OK;
                 }
             }
         }
         //設定値以上の値のセンサーが無い場合はコンフィギュレーションパラメーターの値で操作
         m_out.data.vx = m_speed_x;
         m_out.data.va = m_speed_r;
         m_outOut.write();
           return RTC::RTC_OK;
 }

Visual Studio によるビルド

ビルドの実行

Visual Studioの [ビルド] >「ソリューションのビルド」を選択してビルドを行います。


/ja/node/6026
ビルドの実行


RobotController コンポーネントの動作確認

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


RT System Editorのネームサービス起動ボタンを押すと起動します。

/ja/node/6550

&color(red){※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController\build\src\Debug(もしくは、Release)フォルダーの RobotControllerComp.exe ファイルを実行してください。

シミュレーターコンポーネントの起動

このコンポーネントは先ほどダウンロードしたファイル(RTM_Tutorial_RaspberryPiMouse.zip)を展開したフォルダーの EXE/RaspberryPiMouseSimulatorComp.exe を実行すると起動します。

コンポーネントの接続

下図のように、RTSystemEditor にて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントのActivate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6550
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


/ja/node/6310

スライダーを操作してシミュレーター上の Raspberry Pi マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能ですので、時間に余裕がある人は試してみてください。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


rpm8.png


内側の電源スイッチをオンにするとRaspberry Piが起動します。


rpm9.png


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

アクセスポイントへの接続方法は以下のページを参考にしてください。

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。

まず右下のネットワークアイコンをクリックしてください。


/ja/node/6042

次に一覧から raspberrypi_*** を選択してください。


/ja/node/6042

パスワードを入力してください。


/ja/node/6042

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の3つの RTC が見えるようになります。

/ja/node/6550

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


rpm10.png


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

Tutorial (Raspberry Pi Mouse, C++, Ubuntu, Bootcamp)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/jp/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。

 git clone https://github.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

Raspberry Piマウスの仕様

Raspberry Piマウスはアールティが販売している独立二輪駆動型の移動ロボットです。

/ja/node/6550

ラズパイマウスの仕様
CPU Raspberry Pi 2 Model B
モーター ステッピングモーターST-42BYG020 2個
モータードライバー SLA7070MRPT 2個
距離センサー 赤色LED+フォトトランジスタ(ST-1K3) 4個
モニター用赤色LED 4個
ブザー 1個
スイッチ 3個
バッテリー LiPo3セル(11.1V)1000mAh 1個

作成する RTコンポーネント

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builder によるソースコードのひな形の作成
  • ソースコードの編集
  • コンポーネントの動作確認

動作環境・開発環境

Linux (ここでは Ubuntu 18.04 を仮定) 上に開発環境を構築します。

OpenRTM-aistのインストール

 ubuntu 18.04 (64bit) の場合
 
 
 $ wget https://raw.githubusercontent.com/OpenRTM/OpenRTM-aist/master/scripts/pkg_install_ubuntu.sh
 $ sudo sh pkg_install_ubuntu.sh

JREのインストール

 $ sudo apt-get install openjdk-8-jdk

Ubuntu 18.04、18.10の場合は以下のコマンドでjava8に切り替えます。

 $ sudo update-alternatives --config java

eclipse起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。

 $ hostname
 ubuntu1804 ← ホスト名は ubuntu1804
 $ sudo vi /etc/hosts
 
 127.0.0.1       localhost
 を以下のように変更
 127.0.0.1       localhost ubuntu1404

CMake のインストール

 $ sudo apt-get install cmake cmake-gui

Code::Blocks のインストール

Code::Blocks は C/C++ に対応した統合開発環境です。 以下のコマンドでインストールできます。

 $ sudo apt-get install codeblocks

最新版を入手したい場合は以下のコマンドを入力します。

 $ sudo add-apt-repository ppa:damien-moore/codeblocks-stable
 $ sudo apt-get update
 $ sudo apt-get install codeblocks

Premakeのインストール

ODEのビルドに必要です。

 $ sudo apt-get install premake4

RaspberryPiMouseSimulator コンポーネント

シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。

 $ wget https://raw.githubusercontent.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse/master/script/install_raspimouse_simulator.sh
 $ sh install_raspimouse_simulator.sh

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。

 $ sh install_raspimouse_simulator_usb.sh

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.5<x<1.5
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
         /// Velocity along the x axis in metres per second.
         double vx;
         /// Velocity along the y axis in metres per second.
         double vy;
         /// Yaw velocity in radians per second.
         double va;
     };
 
 
     struct TimedVelocity2D
     {
         Time tm;
         Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Piマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型の生成

RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • /home/ユーザー名/workspace

まずは Eclipse を起動します。 OpenRTP を展開したディレクトリーに移動して以下のコマンドを入力します。

 $ ./openrtp

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6058

すると、以下のような Welcome ページが表示されます。


/ja/node/6026
Eclipse の初期起動時の画面

Welcome ページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilderが起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが現れます。

/ja/node/6026
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] をクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xmlが生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

プロファイル情報入力とコードの生成

まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた RobotController コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


/ja/node/6310
基本情報の入力


次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.5<x<1.5
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、C++(言語) を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。

/ja/node/6310
プログラミング言語の選択


最後に、「基本」タブにある [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。


/ja/node/6310
雛型の生成(Generate)


※ 生成されるコード群は、eclipse起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え...] で確認することができます。

CMake によるビルドに必要なファイルの生成

RTC Builder で生成したコードの中には CMake でビルドに必要な各種ファイルを生成するための CMakeLists.txt が含まれています。 CMake を利用することにより CMakeLists.txt から Visual Studio のプロジェクトファイル、ソリューションファイル、もしくは Makefile 等を自動生成できます。

CMake(cmake-gui) の操作

CMake を利用してビルド環境の Configure を行います。 まずは CMake(cmake-gui) を起動してください。

 $ cmake-gui
/ja/node/6311
CMake GUI の起動とディレクトリーの指定

画面上部に以下のようなテキストボックスがありますので、それぞれソースコードの場所 (CMakeList.txt がある場所) と、ビルドディレクトリーを指定します。

  • Where is the soruce code
  • Where to build the binaries

ソースコードの場所は RobotController コンポーネントのソースが生成された場所で CMakeList.txt が存在するディレクトリーです。 デフォルトでは <ワークスペースディレクトリー>/RobotController になります。

このディレクトリーはエクスプローラから cmake-gui にドラックアンドドロップすると手入力しなくても設定されます。

ビルドディレクトリーとは、ビルドするためのプロジェクトファイルやオブジェクトファイル、バイナリを格納する場所のことです。 場所は任意ですが、この場合 <ワークスペースディレクトリー>/RobotController/build のように分かりやすい名前をつけた RobotController のサブディレクトリーを指定することをお勧めします。

Where is the soruce code /home/ユーザー名/RobotController
Where to build the binaries /home/ユーザー名/RobotController\build

指定したら、下の [Configure] ボタンをクリックします。すると下図のようなダイアログが表示されますので、生成したいプロジェクトの種類を指定します。 今回は CodeBlocks - Unix Makefiles を指定します。 Code::Blocks を使わない場合は Unix Makefiles を使ってください。

/ja/node/6026
生成するプロジェクトの種類の指定

また cmake-gui を使用しない場合は以下のコマンドでファイルを生成できます。

 $ mkdir build
 $ cd build
 $ cmake .. -G "CodeBlocks - Unix Makefiles"

ダイアログで [Finish] をクリックすると Configure が始まります。問題がなければ下部のログウインドウに「Configuring done」と出力されますので、続けて [Generate] ボタンをクリックします。 「Generating done」と出ればプロジェクトファイル・ソリューションファイル等の出力が完了します。

なお、CMake は Configure の段階でキャッシュファイルを生成しますので、トラブルなどで設定を変更したり環境を変更した場合は [File] > [Delete Cache] を選択して、キャッシュを削除してから Configure からやり直してください。

ヘッダ、ソースの編集

次に先ほど指定した build ディレクトリーの中の RobotController.cbp をダブルクリックしてCode::Blocks を起動します。

ヘッダ (include/RobotController/RobotController.h) およびソースコード (src/RobotController.cpp) をそれぞれ編集します。 Code::BlocksのProjectsからRobotController.h、RobotController.cpp をクリックすることで編集画面が開きます。

/ja/node/6311

64bitの環境の場合に Code::Blocks の動作が不安定になることがあります。 その場合は code completion というプラグインを無効化すると動作することがあります。

「Plugins」>「Manage plugins...」を選択します。

/ja/node/6057/

「code completion」を選択して [Disable] ボタンをクリックします。

/ja/node/6057/

動作しないときはこの手順を試してください。

アクティビティ処理の実装

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in)から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

/ja/node/6310/
アクティビティ処理の概要


ヘッダファイル (RobotController.h) の編集

センサー値を一時的に格納する変数 sensor_data を宣言します。

   private:
      double sensor_data[4];    //センサー値を一時格納する変数

ソースファイル (RobotController.cpp) の編集

下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

 RTC::ReturnCode_t RobotController::onActivated(RTC::UniqueId ec_id)
 {
     //センサー値初期化
     for (int i = 0; i < 4; i++)
     {
         sensor_data[i] = 0;
     }
 
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onDeactivated(RTC::UniqueId ec_id)
 {
     //ロボットを停止する
     m_out.data.vx = 0;
     m_out.data.va = 0;
     m_outOut.write();
 
   return RTC::RTC_OK;
 }

 RTC::ReturnCode_t RobotController::onExecute(RTC::UniqueId ec_id)
 {
     //入力データの存在確認
     if (m_inIn.isNew())
     {
         //入力データ読み込み
         m_inIn.read();
         for (int i = 0; i < m_in.data.length(); i++)
         {
             //入力データ格納
             if (i < 4)
             {
                 sensor_data[i] = m_in.data[i];
             }
         }
     }
 
     //前進するときのみ停止するかを判定
     if (m_speed_x > 0)
     {
         for (int i = 0; i < 4; i++)
         {
             //センサ値が設定値以上か判定
             if (sensor_data[i] > m_stop_d)
             {
                 //センサ値が設定値以上の場合は停止
                 m_out.data.vx = 0;
                 m_out.data.va = 0;
                 m_outOut.write();
                 return RTC::RTC_OK;
             }
         }
     }
     //設定値以上の値のセンサーが無い場合はコンフィギュレーションパラメーターの値で操作
     m_out.data.vx = m_speed_x;
     m_out.data.va = m_speed_r;
     m_outOut.write();
   return RTC::RTC_OK;
 }

Code::Blocks によるビルド

ビルドの実行

Code::Blocksの [ビルド] ボタンをクリックしてビルドを行います。


/ja/node/6311
ビルドの実行


RobotController コンポーネントの動作確認

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


 $ rtm-naming

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController\build\srcフォルダーの RobotControllerComp ファイルを実行してください。

 $ RobotControllerComp

シミュレーターコンポーネントの起動

RaspberryPiMouseSimulator コンポーネントをインストールしたディレクトリーに移動後、下記のコマンドにて起動できます。

 $ src/RaspberryPiMouseSimulatorComp

コンポーネントの接続

下図のように、RTSystemEditorにて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントの Activate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6310
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


/ja/node/6311

スライダーを操作してシミュレーター上の Raspberry Pi マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


rpm8.png


内側の電源スイッチをオンにするとRaspberry Piが起動します。


rpm9.png


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあるので、その SSID に接続してください。

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が見えるようになります。

/ja/node/6311

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


rpm10.png


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

Tutorial (Raspberry Pi Mouse, Python, Windows, Bootcamp)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/ja/node/6198

シミュレーター

シミュレーターは Open Dynamics Engine(ODE) という物理演算エンジンと ODE 付属の描画ライブラリ(drawstuff)を使用して開発しています。 OpenGL が動作すれば動くので、大抵の環境で動作するはずです。

以下の Raspberry Piマウス というロボットのシミュレーションができます。

/jp/node/6005

シミュレーター上の Raspberry Pi マウスの動力学計算、接触応答だけではなく、距離センサーのデータも現実のロボットに近い値を再現するようにしています。

作成する RTコンポーネント

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

robotcomp.png

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builderによるソースコードのひな形の作成
  • ソースコードの編集
  • コンポーネントの動作確認

開発環境の確認

以下の環境を想定しています。

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.0<x<1.0
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
           /// Velocity along the x axis in metres per second.
           double vx;
           /// Velocity along the y axis in metres per second.
           double vy;
           /// Yaw velocity in radians per second.
           double va;
     };
 
 
     struct TimedVelocity2D
     {
           Time tm;
           Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Pi マウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型の生成

RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • C:\workspace

まずは Eclipse を起動します。 Windows 8.1の場合は「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」>「OpenRTP」をクリックすると起動できます。

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6026

すると、以下のようなWelcomeページが表示されます。


/ja/node/6026
Eclipse の初期起動時の画面

Welcomeページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilder が起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが表示されます。

/ja/node/6026
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] ボタンをクリックします。

RT-Component-BuilderProject_1.png

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

PackageExplolrer_1.png

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xml が生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

プロファイル情報入力とコードの生成

まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた RobotController コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


Basic_1.png
基本情報の入力


次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


Activity_1.png
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


DataPort_1.png
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.0<x<1.0
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


Configuration_1.png
コンフィグレーション情報の入力


次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、Python(言語)を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。

Language_1_2.png
プログラミング言語の選択


最後に、「基本」タブにあ [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。


Generate_1.png
雛型の生成(Generate)


※ 生成されるコード群は、eclipse 起動時に指定したワークスペースフォルダーの中に生成されます。現在のワークスペースは、[ファイル] > [ワークスペースの切り替え..]で確認することができます。

ソースコードの編集

<ワークスペースディレクトリー>/RobotController/RobotController.pyをPython用エディタで開いて編集してください。 Pythonに標準で付属しているIDLEを使う場合は、ファイルを右クリックしてEdit with IDLEをクリックするとファイルを開きます。


idle_1.png


変数初期化部分の修正

OpenRTM-aist 1.1.2のRTC Builderを使用している場合は、変数初期化部分を修正する必要があります。(OpenRTM-aist 1.2.0では修正される予定です)

まずは、init関数のself._d_in変数初期化部分を修正してください。

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         #in_arg = [None] * ((len(RTC._d_TimedShortSeq) - 4) / 2) ←削除
         #self._d_in = RTC.TimedShortSeq(*in_arg) ←削除
         #以下の行を追加
         self._d_in = RTC.TimedShortSeq(RTC.Time(0,0),[])

次にself._d_out 変数初期化部分を修正してください。

         #out_arg = [None] * ((len(RTC._d_TimedVelocity2D) - 4) / 2) ←削除
         #self._d_out = RTC.TimedVelocity2D(*out_arg) ←削除
         #以下の行を追加
         self._d_out = RTC.TimedVelocity2D(RTC.Time(0,0),RTC.Velocity2D(0.0,0.0,0.0))

これで完了です。

アクティビティ処理の実装

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

RCRTC_State_1.png
アクティビティ処理の概要


下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

     def onActivated(self, ec_id):
         #センサー値初期化
         self.sensor_data = [0,0,0,0]
         return RTC.RTC_OK

     def onDeactivated(self, ec_id):
         #ロボットを停止する
         self._d_out.data.vx = 0
         self._d_out.data.va = 0
         self._outOut.write()
         return RTC.RTC_OK

     def onExecute(self, ec_id):
         #入力データの存在確認
         if self._inIn.isNew():
             data = self._inIn.read()
             #この時点で入力データがm_inに格納される
             #入力データを別変数に格納
             self.sensor_data = data.data[:]
         #前進するときのみ停止するかを判定
         if self._speed_x[0] > 0:
             for d in self.sensor_data:
                 #センサ値が設定値以上か判定
                 if d > self._stop_d[0]:
                     #センサ値が設定値以上の場合は停止
                     self._d_out.data.vx = 0
                     self._d_out.data.va = 0
                     self._outOut.write()
                     return RTC.RTC_OK
                 
         #設定値以上の値のセンサが無い場合はコンフィギュレーションパラメータの値で操作
         self._d_out.data.vx = self._speed_x[0]
         self._d_out.data.va = self._speed_r[0]
         self._outOut.write()
                 
         return RTC.RTC_OK

RobotController コンポーネントの動作確認

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

以下より RaspberryPiMouseSimulator コンポーネントをダウンロードしてください。

ZIPファイルは Lhaplus 等で展開してください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


「スタート」>「アプリビュー(右下矢印)」>「OpenRTM-aist 1.1.2」の順に辿り、「Start Naming Service」をクリックしてください。

※ 「Start Naming Service」をクリックしても omniNames が起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotControllerComp.pyファイルをダブルクリックして実行してください。

シミュレーターコンポーネントの起動

このコンポーネントは先ほどダウンロードしたファイル(RTM_Tutorial_2017.zip)を展開したフォルダーの EXE/RaspberryPiMouseSimulatorComp.exe を実行すると起動します。

コンポーネントの接続

下図のように、RTSystemEditor にて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

RTSE_Connect_1.png
コンポーネントの接続

コンポーネントのActivate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


RTSE_Activate_1.png
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


RTSE_Configuration_10.png

スライダーを操作してシミュレーター上の [Raspberry Pi] マウスの操作ができるかを確認してください。


RTSE_Configuration_1.png
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


rpm8.png


内側の電源スイッチをオンにするとRaspberry Piが起動します。


rpm9.png


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

アクセスポイントへの接続方法は以下のページを参考にしてください。

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあります。

まず右下のネットワークアイコンをクリックしてください。


/ja/node/6042

次に一覧から raspberrypi_*** を選択してください。


/ja/node/6042

パスワードを入力してください。


/ja/node/6042

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が見えるようになります。

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

tutorial_raspimouse41.png

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


rpm10.png


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

Tutorial (Raspberry Pi Mouse, Python, Ubuntu, Bootcamp)

はじめに

このページではシミュレーター上の Raspberry Pi マウスを操作するためのコンポーネントの作成手順を説明します。

/jp/node/6198

資料のダウンロード

まずは資料をダウンロードしてください。

 git clone https://github.com/OpenRTM/RTM_Tutorial_RaspberryPiMouse_Python

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

作成する RTコンポーネント

  • RobotController コンポーネント

RaspberryPiMouseSimulator コンポーネントと接続してシミュレーター上のロボットを操作するためのコンポーネントです。

RobotController コンポーネントの作成

GUI(スライダー)によりシミュレーター上のロボットの操作を行い、センサー値が一定以上の時には自動的に停止するコンポーネントの作成を行います。

/ja/node/6310

作成手順

作成手順は以下の通りです。

  • 開発環境の確認
  • コンポーネントの仕様を決める
  • RTC Builder によるソースコードのひな形の作成
  • ソースコードの編集
  • コンポーネントの動作確認

動作環境・開発環境

Linux (ここでは Ubuntu 16.04 を仮定) 上に開発環境を構築します。

OpenRTM-aistのインストール

インストールスクリプトでインストールします。

 $ wget http://svn.openrtm.org/OpenRTM-aist/trunk/OpenRTM-aist/build/pkg_install_ubuntu.sh
 $ sudo sh pkg_install_ubuntu.sh -lpython

OpenRTP のインストール

こちらのURL から Linux版の OpenRTP (コンポーネント開発ツール、システム開発ツール統合環境) をダウンロード、インストールします。 OepnRTP の実行には Java も必要となりますので default-jre パッケージをインストールします。

 $ apt-get install default-jre
 $ wget http://openrtm.org/pub/openrtp/packages/1.1.2.v20160526/eclipse442-openrtp112v20160526-ja-linux-gtk-x86_64.tar.gz
 $ tar xvzf eclipse442-openrtp112v20160526-ja-linux-gtk-x86_64.tar.gz

eclipse起動後、RTSystemEditor でネームサーバに接続できない場合があります。その場合、/etc/hosts の localhost の行に自ホスト名を追記してください。

 $ hostname
 ubuntu1404 ← ホスト名は ubuntu1404
 $ sudo vi /etc/hosts

 127.0.0.1       localhost
 を以下のように変更
 127.0.0.1       localhost ubuntu1404

Python用エディタのインストール

PyDev等、Python用のエディタをインストールしてください。

RaspberryPiMouseSimulator コンポーネント

シミュレーターコンポーネントについては手動でビルドを行います。 以下のコマンドを入力してください。

 $ wget https://raw.githubusercontent.com/Nobu19800/RTM_Tutorial_2017/master/install_raspimouse_simulator.sh
 $ sudo sh install_raspimouse_simulator.sh

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布の USBメモリー内のスクリプトを起動してください。

 $ sudo sh install_raspimouse_simulator_usb.sh

コンポーネントの仕様

RobotController は目標速度を出力するアウトポート、センサー値を入力するインポート、目標速度や停止するセンサー値を設定するコンフィギュレーションパラメーターを持っています。

コンポーネント名称 RobotController
InPort
ポート名 in
TimedShortSeq
説明 センサー値
OutPort
ポート名 out
TimedVelocity2D
説明 目標速度
Configuration
パラメーター名 speed_x
double
デフォルト値 0.0
制約 -1.0<x<1.0
Widget slider
Step 0.01
説明 直進速度の設定
Configuration
パラメーター名 speed_r
double
デフォルト値 0.0
制約 -2.0<x<2.0
Widget slider
Step 0.01
説明 回転速度の設定
Configuration
パラメーター名 stop_d
int
デフォルト値 30
説明 停止するセンサー値の設定

TimedVelocity2D 型について

2次元平面上の移動ロボットの移動速度を格納するデータ型である TimedVelocity2D 型を使用します。

     struct Velocity2D
     {
         /// Velocity along the x axis in metres per second.
         double vx;
         /// Velocity along the y axis in metres per second.
         double vy;
         /// Yaw velocity in radians per second.
         double va;
     };
 
 
     struct TimedVelocity2D
     {
         Time tm;
         Velocity2D data;
     };

このデータ型にはX軸方向の速度vx、Y軸方向の速度vy、Z軸周りの回転速度vaが格納できます。

vxvyvaはロボット中心座標系での速度を表しています。


/ja/node/6042

vxはX方向の速度、vyはY方向の速度、vaはZ軸周りの角速度です。

Raspberry Piマウスのように2個の車輪が左右に取り付けられているロボットの場合、横滑りしないと仮定するとvyは0になります。

直進速度vx、回転速度vaを指定することでロボットの操作を行います。

距離センサーのデータについて

Raspberry Pi マウスの距離センサーのデータは物体との距離が近づくほど大きな値を出力するようになっています。


rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

シミュレーターではこの値を再現して出力しています。 RobotController コンポーネントではこの値が一定以上の時に自動的に停止する処理を実装します。

RobotController コンポーネントのひな型の生成

RobotController コンポーネントの雛型の生成は、RTCBuilder を用いて行います。

RTCBuilder の起動

Eclipse では、各種作業を行うフォルダーを「ワークスペース」(Work Space)とよび、原則としてすべての生成物はこのフォルダーの下に保存されます。 ワークスペースはアクセスできるフォルダーであれば、どこに作っても構いませんが、このチュートリアルでは以下のワークスペースを仮定します。

  • /home/ユーザー名/workspace

まずは Eclipse を起動します。 OpenRTP を展開したディレクトリーに移動して以下のコマンドを入力します。

 $ ./openrtp

最初にワークスペースの場所を尋ねられますので、上記のワークスペースを指定してください。

/ja/node/6058

すると、以下のような Welcome ページが表示されます。


/ja/node/6026
Eclipse の初期起動時の画面

Welcome ページはいまは必要ないので左上の「×」ボタンをクリックして閉じてください。

右上の [Open Perspective] ボタンをクリックしてください。

/ja/node/6026
パースペクティブの切り替え

「RTC Builder」を選択することで、RTCBuilderが起動します。メニューバーに「カナヅチとRT」の RTCBuilder のアイコンが現れます。

/ja/node/6026
パースペクティブの選択

新規プロジェクトの作成

RobotController コンポーネントを作成するために、RTC Builder で新規プロジェクトを作成する必要があります。

左上の [Open New RTCBuilder Editor] のアイコンをクリックしてください。

/ja/node/6057
RTC Builder 用プロジェクトの作成

「プロジェクト名」欄に作成するプロジェクト名 (ここでは RobotController) を入力して [終了] をクリックします。

/ja/node/6310

指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

/ja/node/6310

生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC.xmlが生成された時点で、このプロジェクトに関連付けられているワークスペースとして RTCBuilder のエディタが開くはずです。 もし起動しない場合はパッケージエクスプローラーの RTC.xml をダブルクリックしてください。

/ja/node/6026

プロファイル情報入力とコードの生成

まず、いちばん左の「基本」タブを選択し、基本情報を入力します。先ほど決めた RobotController コンポーネントの仕様(名前)の他に、概要やバージョン等を入力してください。 ラベルが赤字の項目は必須項目です。その他はデフォルトで構いません。

  • モジュール名: RobotController
  • モジュール概要: 任意(Robot Controller component)
  • バージョン: 任意(1.0.0)
  • ベンダ名: 任意
  • モジュールカテゴリ: 任意(Controller)


/ja/node/6310
基本情報の入力


次に、「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。

RobotController コンポーネントでは、onActivated()、onDeactivated()、onExecute() コールバックを使用します。下図のように①の onAtivated をクリック後に②のラジオボタンにて [ON] にチェックを入れます。 onDeactivated、onExecute についても同様の手順を行います。


/ja/node/6310
アクティビティコールバックの選択


さらに、「データポート」タブを選択し、データポートの情報を入力します。 先ほど決めた仕様を元に以下のように入力します。なお、変数名や表示位置はオプションで、そのままで結構です。


  • InPort Profile:
    • ポート名: in
    • データ型: TimedShortSeq

  • OutPort Profile:
    • ポート名: out
    • データ型: TimedVelocity2D


/ja/node/6310
データポート情報の入力


次に、「コンフィギュレーション」タブを選択し、先ほど決めた仕様を元に、Configuration の情報を入力します。 制約条件および Widget とは、RTSystemEditor でコンポーネントのコンフィギュレーションパラメーターを表示する際に、スライダー、スピンボタン、ラジオボタンなど、GUI で値の変更を行うためのものです。

直進速度 speed_x、回転速度 speed_r はスライダーのより操作できるようにします。


  • speed_x
    • 名称: speed_x
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -1.0<x<1.0
    • Widget: slider
    • Step: 0.01
  • speed_r
    • 名称: speed_r
    • データ型: double
    • デフォルト値: 0.0
    • 制約条件: -2.0<x<2.0
    • Widget: slider
    • Step: 0.01
  • stop_d
    • 名称: stop_d
    • データ型: int
    • デフォルト値: 30
    • Widget: text


/ja/node/6310
コンフィグレーション情報の入力


次に、「言語・環境」タブを選択し、プログラミング言語を選択します。 ここでは、C++(言語) を選択します。なお、言語・環境はデフォルト等が設定されておらず、指定し忘れるとコード生成時にエラーになりますので、必ず言語の指定を行うようにしてください。

/ja/node/6310
プログラミング言語の選択


最後に、「基本」タブにある [コード生成] ボタンをクリックし、コンポーネントの雛型を生成します。


/ja/node/6310
雛型の生成(Generate)


※ 生成されるコード群は、eclipse起動時に指定したワークスペースフォルダーの中に生成されます。 現在のワークスペースは、[ファイル] > [ワークスペースの切り替え...] で確認することができます。

ソースコードの編集

<ワークスペースディレクトリー>/RobotController/RobotController.pyをPython用エディタで開いて編集してください。


idle_1.png


変数初期化部分の修正

OpenRTM-aist 1.1.2のRTC Builderを使用している場合は、変数初期化部分を修正する必要があります。(OpenRTM-aist 1.2.0では修正される予定です)

まずは、init関数のself._d_in変数初期化部分を修正してください。

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         #in_arg = [None] * ((len(RTC._d_TimedShortSeq) - 4) / 2) ←削除
         #self._d_in = RTC.TimedShortSeq(*in_arg) ←削除
         #以下の行を追加
         self._d_in = RTC.TimedShortSeq(RTC.Time(0,0),[])

次にself._d_out 変数初期化部分を修正してください。

         #out_arg = [None] * ((len(RTC._d_TimedVelocity2D) - 4) / 2) ←削除
         #self._d_out = RTC.TimedVelocity2D(*out_arg) ←削除
         #以下の行を追加
         self._d_out = RTC.TimedVelocity2D(RTC.Time(0,0),RTC.Velocity2D(0.0,0.0,0.0))

これで完了です。

アクティビティ処理の実装

RobotController コンポーネントでは、コンフィギュレーションパラメーター(speed_x、speed_y)をスライダーで操作しその値を目標速度としてアウトポート(out)から出力します。 インポート(in) から入力された値を変数に格納して、その値が一定以上の場合は停止するようにします。


onActivated()、onExecute()、onDeactivated() での処理内容を下図に示します。

RCRTC_State_1.png
アクティビティ処理の概要


下記のように、onActivated()、onDeactivated()、onExecute() を実装します。

     def onActivated(self, ec_id):
         #センサー値初期化
         self.sensor_data = [0,0,0,0]
         return RTC.RTC_OK

     def onDeactivated(self, ec_id):
         #ロボットを停止する
         self._d_out.data.vx = 0
         self._d_out.data.va = 0
         self._outOut.write()
         return RTC.RTC_OK

     def onExecute(self, ec_id):
         #入力データの存在確認
         if self._inIn.isNew():
             data = self._inIn.read()
             #この時点で入力データがm_inに格納される
             #入力データを別変数に格納
             self.sensor_data = data.data[:]
         #前進するときのみ停止するかを判定
         if self._speed_x[0] > 0:
             for d in self.sensor_data:
                 #センサ値が設定値以上か判定
                 if d > self._stop_d[0]:
                     #センサ値が設定値以上の場合は停止
                     self._d_out.data.vx = 0
                     self._d_out.data.va = 0
                     self._outOut.write()
                     return RTC.RTC_OK
                 
         #設定値以上の値のセンサが無い場合はコンフィギュレーションパラメータの値で操作
         self._d_out.data.vx = self._speed_x[0]
         self._d_out.data.va = self._speed_r[0]
         self._outOut.write()
                 
         return RTC.RTC_OK

RobotController コンポーネントの動作確認

作成した RobotController をシミュレーターコンポーネントと接続して動作確認を行います。

以下より RaspberryPiMouseSimulator コンポーネントをダウンロードしてください。

インターネットに接続できない環境で講習会を実施している場合がありますので、その場合は配布のUSBメモリーに入れてあります。

NameService の起動

コンポーネントの参照を登録するためのネームサービスを起動します。


 $ rtm-naming

RobotController コンポーネントの起動

RobotController コンポーネントを起動します。

RobotController\build\srcフォルダーの RobotControllerComp ファイルを実行してください。

 $ RobotControllerComp

シミュレーターコンポーネントの起動

RaspberryPiMouseSimulator コンポーネントをインストールしたディレクトリーに移動後、下記のコマンドにて起動できます。

 $ src/RaspberryPiMouseSimulatorComp

コンポーネントの接続

下図のように、RTSystemEditorにて RobotController コンポーネント、RaspberryPiMouseSimulator コンポーネントを接続します。

/ja/node/6310
コンポーネントの接続

コンポーネントの Activate

RTSystemEditor の上部にあります [All Activate] というアイコンをクリックし、全てのコンポーネントをアクティブ化します。 正常にアクティベートされた場合、下図のように黄緑色でコンポーネントが表示されます。


/ja/node/6310
コンポーネントのアクティブ化


動作確認

下図のようにコンフィギュレーションビューの [編集] ボタンからコンフィギュレーションを変更することができます。


RTSE_Configuration_10.png

スライダーを操作してシミュレーター上の Raspberry Pi マウスの操作ができるかを確認してください。


/ja/node/6310
コンフィギュレーションパラメーターの変更


実機での動作確認

講習会で Raspberry Pi マウス実機を用意している場合は実機での動作確認が可能です。

手順は以下の通りです。

  • Raspberry Pi マウスの電源を投入する
  • Raspberry Pi マウスのアクセスポイントに接続
  • ポートの接続
  • コンポーネントのアクティブ化

電源を投入する

Raspberry PiマウスにはRaspberry Piの電源スイッチとモーターの電源スイッチの2つがあります。


rpm8.png


内側の電源スイッチをオンにするとRaspberry Piが起動します。


rpm9.png


電源を切る場合

Raspberry Piの電源を切る場合は、電源スイッチから直接オフにはしないようにしてください。 3つ並んだボタンの中央のボタンを数秒押すとシャットダウンが始まります。 10秒程度でRaspbianのシャットダウンが終了するため、その後に電源スイッチをオフにしてください。


/ja/node/6042

アクセスポイントに接続

SSID、パスワードは Rasoberry Pi マウスに貼り付けたシールに記載してあるので、その SSID に接続してください。

※ネットワークが切り替わった場合にネームサーバーへのコンポーネントの登録やポートの接続が失敗する場合があるのでネームサーバ、コンポーネントを一旦全て終了してください。 ネットワーク切り替え後に起動した場合には問題ないので、終了させる必要はありません。

ネームサーバー追加

続いてRTシステムエディタの [ネームサーバー追加] ボタンで 192.168.11.1 を追加してください。


tutorial_raspimouse0.png tutorial_raspimouse1.png



すると以下の2つの RTC が見えるようになります。

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

ポートの接続

RTシステムエディタで RaspberryPiMouseRTC、RobotController コンポーネントを以下のように接続します。

/ja/node/6310

モーターの電源を投入する

動作の前に、モーターの電源スイッチをオンにしてください。 モーターの電源はこまめに切るようにしてください。


rpm10.png


アクティブ化

そして RTC をアクティブ化すると Raspberry Pi マウスの操作ができるようになります。

Initial Setting

Raspbian

このページ の手順に従ってRaspbian を SDカードに書き込んでください。 ※フルキットに付属の SDカードを使用する場合はこの作業は不要です。

組み立て方

最初に Raspberry Pi に SDカードを挿入してください。一度組み立てると Raspberry Pi を取り外さない限り SDカードの交換はできません。

rpm2.png
まずは Raspberry Pi をラズパイマウス本体に載せます。 スペーサーに Raspberry Pi を付属のねじで留めてください。
rpm0.png
最後に Raspberry Pi とラズパイマウス本体のピンヘッダに部品を取り付ければ完成です。
rpm1.png

Raspbian 起動

以下の作業は Rasbian を起動して行います。 まずは Raspberry Pi にディスプレイ、マウス、キーボード、LANケーブルを接続してください。

ラズパイマウスはバッテリー以外にも付属のケーブルでコンセントから電源をとれるのですが、ラズパイマウスに接続するコネクタの向きには注意してください。

ラズパイマウスの電源スイッチは以下の位置にあります。

rpm8.png

手前のスイッチがモーター電源で、内側のスイッチが Raspberry Pi の電源です。 内側のスイッチを ON にしてください。

rpm9.png

Raspbian が起動したらユーザー名が pi、パスワードが raspberry でログインできるはずなのでログインしてください。 ログインできたら以下のコマンドで X-Window を起動してください。

 startx

デバイスドライバ

Raspbian 起動後、以下のコマンドでリポジトリをクローンしてください。

 git clone https://github.com/rt-net/RaspberryPiMouse.git
※git がインストールされていない場合は以下のコマンドを入力してください。
 sudo apt-get install git
そして以下のコマンドでカーネルのバージョンを確認してください。
 uname -r
仮に Raspberry Pi 2 model B のカーネルのバージョン 4.1.6-v7+ の場合は以下のコマンドでカーネルモジュールをロードしてください。
 cd RaspberryPiMouse/lib/Pi2B+/4.1.6-v7+/
 sudo insmod rtmouse.ko

SPI 機能を有効にしていない場合は以下のコマンド、もしくは [Menu] > [Preference] > [Raspberry Pi Configuration] で表示される画面で設定してください。

  sudo raspi-config

上下キーで「Advanced Options」を選択後 Enter キーを押してください。 次に A5 SPI を同じ手順で選択します。 そして左右キーで Yes を選択して OK で Enter キーを押せば有効になります。 元の画面に戻ったら 左右キーで [Finish] を選択して終了してください。 詳しくは このページ を参考にしてください。

※フルキットに付属の SDカードを使用する場合はこの作業は不要です。

OpenRTM-aist

C++版

Raspbian に C++版 OpenRTM-aist のインストールには以下のコマンドを入力します。

 wget http://svn.openrtm.org/OpenRTM-aist/tags/RELEASE_1_1_1/OpenRTM-aist/build/pkg_install_debian.sh
 sudo sh pkg_install_debian.sh

詳しくは このページ を参考にしてください。

※母艦 PC の OS は Windows を想定しています。 Windows に OpenRTM-aist をインストールする手順については このページ を参考にしてください。 Python版のサンプルコンポーネントも利用するので、Python版もインストールしてください。 またサンプルの RTシステムで rtshell を使用するため、このページ を参考にしてインストールしてください。

Python版

Python版のインストールには最初に以下のコマンドを入力してください。

 wget http://svn.openrtm.org/OpenRTM-aist-Python/tags/RELEASE_1_1_0/OpenRTM-aist-Python/installer/install_scripts/pkg_install_python_debian.sh
 sudo sh pkg_install_python_debian.sh

Testing

Raspberry Pi にログイン後、コマンドからデバイスファイルを操作することで動作確認を行います。 各デバイスの位置などは ラズパイマウスのマニュアル を参考にしてください。

LED

以下のコマンドで LED が点灯、消灯しているかを確認してください。

 echo 1 > /dev/rtled0
 echo 0 > /dev/rtled0

 echo 1 > /dev/rtled1
 echo 0 > /dev/rtled1

 echo 1 > /dev/rtled2
 echo 0 > /dev/rtled2

 echo 1 > /dev/rtled3
 echo 0 > /dev/rtled3

スイッチ

スイッチを押した状態、離した状態で以下のコマンドを入力してください。

 cat /dev/rtswitch0
 cat /dev/rtswitch1
 cat /dev/rtswitch2
 cat /dev/rtswitch3

ブザー

以下のコマンドでブザーが鳴るかを確認してください。

 echo 440 > /dev/rtbuzzer0
 echo 0 > /dev/rtbuzzer0

距離センサー

距離センサーに物体を近づけた状態、離した状態で以下のコマンドを入力してください。

 cat /dev/rtlightsensor0

モーター

最初にモーター電源スイッチを ON にしてください。

rpm10.png

以下のコマンドで車輪が回転するかを確認してください。

 echo 1 > /dev/rtmotoren0
 
 echo 400 > /dev/rtmotor_raw_l0
 echo -400 > /dev/rtmotor_raw_l0
 echo 0 > /dev/rtmotor_raw_l0
 
 echo 400 > /dev/rtmotor_raw_r0
 echo -400 > /dev/rtmotor_raw_r0
 echo 0 > /dev/rtmotor_raw_r0
 
 echo 0 > /dev/rtmotoren0

終わったらモーター電源スイッチを OFF にしてください。

Installing RTC for Raspberry Pi Mouse (Raspbian)

RaspberryPiMouseRTC

RaspberryPiMouseRTC は名城大学のロボットシステムデザイン研究室で開発されているラズパイマウス制御用の RTコンポーネントです。

以下のコマンドでインストールできます。

 git clone https://github.com/rsdlab/RaspberryPiMouseRTC.git
 cd RaspberryPiMouseRTC
 cmake .
 make

以下の RTC は必要に応じてインストールしてください。

RaspberryPiMouseController_DistanceSensor

ラズパイマウスの距離センサーが障害物を感知した際に回転して回避する運動を生成する RTC です。

以下のコマンドでインストールできます。

 git clone https://github.com/Nobu19800/RaspberryPiMouseController_DistanceSensor
 cd RaspberryPiMouseController_DistanceSensor
 cmake .
 make
RaspberryPiMouseController_DistanceSensor_comp.png

RaspberryPiMouseController_DistanceSensor
InPort
名前 データ型 説明
target_velocity_in RTC::TimedVelocity2D 補正前の目標速度
distance_sensor RTC::TimedShortSeq 距離センサーの計測値
OutPort
名前 データ型 説明
target_velocity_out RTC::TimedVelocity2D 補正後の目標速度
コンフィギュレーションパラメーター
名前 デフォルト値 説明
sensor_limit 10 回避運動を開始する距離センサーの計測値
rotational_speed 1.6 回避運動の速さ
stop_velocity 0.01 停止していると判定する直進速度

RaspberryPiMouseController_Joystick

ジョイスティックでラズパイマウスを指定の方角へ制御するための RTC です。 ※この RTC の動作には以下の NineAxisSensor_RT_USB等の方角が計測できる RTC が必須です。

以下のコマンドでインストールできます。

 git clone https://github.com/Nobu19800/RaspberryPiMouseController_Joystick
 cd RaspberryPiMouseController_Joystick
 cmake .
 make
RaspberryPiMouseController_Joystick_comp.png

RaspberryPiMouseController_Joystick
InPort
名前 データ型 説明
joystick_float RTC::TimedFloatSeq ジョイスティックの入力
joystick_long RTC::TimedFloatSeq ジョイスティックの入力
orientation RTC::TimedOrientation3D センサーなど計測した姿勢
OutPort
名前 データ型 説明
out RTC::TimedVelocity2D 目標速度
コンフィギュレーションパラメーター
名前 デフォルト値 説明
forward_factor 0.01 入力に対する直進速度の大きさ
tangential_factor 1.0 入力に対する回転速度の大きさ
x_reverse 0 1の時はジョイスティックのX座標を反転する
m_y_reverse 0 1の時はジョイスティックのY座標を反転する

NineAxisSensor_RT_USB

アールティが販売している USB出力9軸 IMUセンサーモジュール の計測値を出力する RTC です。

以下のコマンドでインストールできます。

 git clone https://github.com/Nobu19800/NineAxisSensor_RT_USB
 cd NineAxisSensor_RT_USB
 cmake .
 make
NineAxisSensor_RT_USB_comp.png

NineAxisSensor_RT_USB
OutPort
名前 データ型 説明
acc RTC::TimedAcceleration3D 加速度センサーの計測値
magn RTC::TimedDoubleSeq 地磁気センサーの計測値
gyro RTC::TimedAngularVelocity3D ジャイロセンサーの計測値
temp RTC::TimedDouble 温度センサーの計測値
rot RTC::TimedOrientation3D 姿勢
コンフィギュレーションパラメーター
名前 デフォルト値 説明
rotOffset 0 姿勢のオフセット(0[rad]を北以外の方角にしたい場合に調整)
magnOffsetX -65 地磁気センサーのオフセット(X軸)
magnOffsetY -60 地磁気センサーのオフセット(Y軸)
magnOffsetZ -5 地磁気センサーのオフセット(Z軸)
serial_port COM3(Windows)、/dev/ttyACM0(Linux) デバイスファイル名

地磁気センサーのキャリブレーション用のソフトウェアは以下のコマンドでインストールできます。

 git clone https://github.com/Nobu19800/CalibrationUSBNineAxisSensor
 cd CalibrationUSBNineAxisSensor
 cmake .
 make

実行すると10秒カウントを始めるので、センサーをいろんな姿勢になるように回転させてください。 可能ならばスマートフォンの8の字調整の動きを行ってください。

そして最後にX・Y・Z軸の地磁気センサの補正値が表示されるので、その値に-1掛けた数値を NineAxisSensor_RT_USB のコンフィギュレーションパラメーターに反映させてください。

ロボットにセンサーを取り付ける等した場合は再度キャリブレーションを行ってください。

一括インストール

上記の RTC を一括でインストールします。 以下のコマンドを入力してください。

 git clone https://github.com/Nobu19800/RaspberryPiMouseRTSystem_script_Raspbian
 cd RaspberryPiMouseRTSystem_script_Raspbian
 sh Component/install_rtc.sh

これで RaspberryPiMouseRTSystem_script_Raspbian の Component フォルダー内に各 RTC がインストールされます。 ※キャリブレーション用ソフトウェアはインストールされないので、手動でインストールしてください。

Installing RTCs for Raspberry Pi Mouse (Windows)

スクリプトファイル

RTC の起動、RTシステムの復元を自動化するためのスクリプトファイルです。 ここ からダウンロードしてください。

RaspberryPiMouseGUI

ラズパイマウス操作用GUIです。 スクリプトファイルの項目でダウンロードしたファイルの中に同梱されています。

RaspberryPiMouseGUI.png
RaspberryPiMouseGUI_comp.png

RaspberryPiMouseGUI
InPort
名前 データ型 説明
current_velocity RTC::TimedVelocity2D 現在の速度
current_pose RTC::TimedPose2D 現在の位置、姿勢
distance_sensor RTC::TimedShortSeq 距離センサの計測値
orientation RTC::TimedOrientation3D 現在の姿勢
OutPort
名前 データ型 説明
target_velocity RTC::TimedVelocity2D 目標速度
target_position RTC::TimedPoint2D 目標位置(未使用)
update_pose RTC::TimedPose2D 位置再設定

Executing A Sample RT System

事前準備

Windows

RTC のインストール

サンプルの RTシステムの一部で以下のRTCを使用するためインストールしてください。

DirectInputRTC

ジョイスティックで操作するための RTC です。 以下のサイトからインストーラーをダウンロードして実行してください。

JoystickToVelocity

DirectInputRTC のアウトポートからの出力(TimedLongSeq型)を TimedVelocity2D型に変換する RTC です。 以下のサイトからインストーラーをダウンロードして実行してください。

ネームサーバー、RTシステムエディタの起動

Windows

まず最初に Windows でネームサーバー、RTシステムエディタを起動してください。 詳しい手順は このページ を参考にしてください。

Raspbian

Raspbianの 一括インストールの項目 でダウンロードしたファイルの中に rtc.conf があるので、rtc.conf の以下の ppp.pp.pp.ppp の部分を Windows側の IPアドレスに変更してください。

 corba.nameservers: ppp.pp.pp.ppp

これで起動したコンポーネントが Windows のネームサーバーに登録されるようになります。

Windows で IPアドレスを確認するには以下のコマンドを入力します。

 ipconfig

RTC の起動

Windows

Windows側のRTCは スクリプトファイルの項目 でダウンロードしたファイルの中に start_component.bat というバッチファイルがあるのでそれを実行すれば以下の RTC が起動します。

 DirectInput0
 JoystickToVelocity0
 RaspberryPiMouseGUI0
 TkJoyStick0

※64bit版 Windows、32bit版 OpenRTM-aist を対象にしています。32bit版 Windows の場合は start_component_32.bat、64bit版 OpenRTM-aist を利用する場合は start_component_64.bat を起動してください。 ※Python のインストールしたディレクトリーにパスが通っていない場合、TkJoyStick は起動できません。お手数ですが このページ の手順を参考にして手動で起動してください。

Raspbian

一括インストールの項目 でダウンロードしたフォルダーの中の start_rtc.sh を実行することで起動できます。

 cd RaspberryPiMouseRTSystem_script_Raspbian
 sh start_rtc.sh

これで以下のコンポーネントが起動します。

 RaspberryPiMouseRTC0
 RaspberryPiMouseController_DistanceSensor0
 RaspberryPiMouseController_Joystick0
 NineAxisSensor_RT_USB0

RTシステムの復元、開始

Windows側で スクリプトファイルの項目 でダウンロードしたファイルのSimpleControlRasPiMouse フォルダー内の SimpleControlRasPiMouse_resurrect.bat を実行してください。 これでデータポートの接続、コンフィギュレーションパラメーターの設定などが行われます。 次に SimpleControlRasPiMouse_activate.bat を実行すると RTC をアクティブ化します。 SimpleControlRasPiMouseはGUI からラズパイマウスを操作する RTシステムです。

SimpleControlRasPiMouse.png

非アクティブにする際は SimpleControlRasPiMouse_stop.bat を起動してください。 SimpleControlRasPiMouse_teardown.bat を起動するとポートの接続を切断します。

各サンプルの詳細

SimpleControlRasPiMouse 以外のサンプルも****_resurrect.bat で RTシステム復元、****_activate.bat でアクティブ化、****_stop.bat で非アクティブ化、****_teardown.bat でポートの切断ができます。

ファイル名 内容
****_resurrect.bat RTシステム復元
****_activate.bat アクティブ化
****_stop.bat 非アクティブ化
****_teardown.bat ポートの切断

LightSensorControlRasPiMouse

このサンプルは GUI によるラズパイマウスの操作に加え、距離センサが物体を検知すると回転して回避を行う RTシステムです。 試しに RaspberryPiMouseController_DistanceSensor0 のコンフィギュレーションパラメーター sensor_limit の値を変更してみると動きが変わると思います。

LightSensorControlRasPiMouse.png

JoystickControlRasPiMouse

このサンプルは OpenRTM-aist-Python のサンプルコンポーネント TkJoyStick で傾けた方角にラズパイマウスを操作するRTシステムです。 このサンプルの動作には USB出力9軸 IMUセンサモジュールを Raspberry Pi に接続しておく必要があります。 センサのキャリブレーション はラズパイマウスに装着した状態で行ってください。

JoystickControlRasPiMouse.png

JoystickLightSensorControlRasPiMouse

このサンプルは TkJoyStick による走行する方角の操作ができることに加えて、距離センサーが物体を検知した際に回避運動を行う RTシステムです。

JoystickLightSensorControlRasPiMouse.png

GamePadSimpleControlRasPiMouse

このサンプルはゲームパッドのアナログスティックで傾けた方向にラズパイマウスを操作する RTシステムです。 Windows側の PC にゲームパッドを接続してから起動してください。

GamePadSimpleControlRasPiMouse.png

GamePadLightSensorSimpleControlRasPiMouse

このサンプルはゲームパッドによる走行する方向の操作ができることに加えて、距離センサーが物体を検知した際に回避を行う RTシステムです。

GamePadLightSensorSimpleControlRasPiMouse.png

GamePadControlRasPiMouse

このサンプルはゲームパッドのアナログスティックで傾けた方角にラズパイマウスを操作する RTシステムです。 9軸センサにより現在の姿勢を計算して、アナログスティックの傾けた方角に進むように制御を行います。

GamePadControlRasPiMouse.png

GamePadLightSensorControlRasPiMouse

このサンプルはゲームパッドによる走行する方角の操作ができることに加えて、距離センサーが物体を検知した際に回避を行う RTシステムです。

GamePadLightSensorControlRasPiMouse.png

Original RTCs based controls

初心者用の課題

ひな形コードの作成

新規作成した RTC を RaspberryPiMouseRTC と接続して制御するまでの手順を説明します。

まずは Windows、Ubuntu上で このページ の手順に従って RTC を作成してください。 RTC の仕様は以下のように入力します。

基本
モジュール名 RasPiMouseSampleCPP、もしくは RasPiMouseSamplePy
アクティビティ
有効アクション onInitialize、onExecute、onActivated、onDeactivated
データポート
InPort
名前 データ型 説明
distance_sensor RTC::TimedShortSeq 距離センサーの計測値
OutPort
名前 データ型 説明
target_velocity RTC::TimedVelocity2D 目標速度
コンフィギュレーション
名前 説明
forward_velocity double 直進速度、デフォルト値は0.0、制約条件に-0.20<=x<=0.20、Widgetはslider、Stepは0.02
rotate_velocity double 回転速度、デフォルト値は0.0、制約条件に-1.6<=x<=1.6、Widgetはslider、Stepは0.2
stop_distance short 距離センサーで物体を検知した場合に、前進しないようにする距離センサーの計測値、デフォルト値は300
言語・環境
言語 C++、もしくは Python

この RTC ではコンフィギュレーションパラメーター forward_velocity、rotate_velocity に入力した速度を target_velocity から RaspberryPiMouseRTC に送信します。 さらに distance_sensor で受信した距離センサーの計測値から、物体をある程度まで近づけると前進できなくなるようにします。

※RTC は Raspberry Pi 上で動作させることを前提にしていますが、動作確認や講習会での利用には Windows や Ubuntu上で動作させても問題はないので、その場合はコードの編集をする前に CMake で Visual Studio、もしくは Code::Blocks のプロジェクトを生成しておくことをお勧めします。CMake でプロジェクト生成からビルドまでの手順は以下のページに記載してあります。

プロジェクトが生成できたら Visual Studio の場合は RasPiMouseSampleCPP.sln、Code::Blocks の場合は RasPiMouseSampleCPP.cbp を開いてソースコードの編集を行ってください。

コードの編集

まずは onExecute 関数を編集します。

以下は forward_velocity、rotate_velocity の値を target_velocity から送信するコードです。

C++(src/RasPiMouseSampleCPP.cpp)

 RTC::ReturnCode_t RasPiMouseSampleCPP::onExecute(RTC::UniqueId ec_id)
 {
     //コンフィギュレーションパラメーターで設定した速度を送信する
     m_target_velocity.data.vx = m_forward_velocity;
     m_target_velocity.data.va = m_rotate_velocity;
     setTimestamp(m_target_velocity);
     m_target_velocityOut.write();
   return RTC::RTC_OK;
 }

Python(RasPiMouseSamplePy.py)

     def onExecute(self, ec_id):
         #コンフィギュレーションパラメーターで設定した速度を送信する
         self._d_target_velocity.data.vx = self._forward_velocity[0]
         self._d_target_velocity.data.vy = 0
         self._d_target_velocity.data.va = self._rotate_velocity[0]
         OpenRTM_aist.setTimestamp(self._d_target_velocity)
         self._target_velocityOut.write()

一応、非アクティブ状態の時は停止するように onDeactivated で速度0を送信するようにします。

C++(src/RasPiMouseSampleCPP.cpp)

 RTC::ReturnCode_t RasPiMouseSampleCPP::onDeactivated(RTC::UniqueId ec_id)
 {
     //停止する
     m_target_velocity.data.vx = 0;
     m_target_velocity.data.vy = 0;
     m_target_velocity.data.va = 0;
     setTimestamp(m_target_velocity);
     m_target_velocityOut.write();
 
   return RTC::RTC_OK;
 }

Python(RasPiMouseSamplePy.py)

     def onDeactivated(self, ec_id):
         #停止する
         self._d_target_velocity.data.vx = 0
         self._d_target_velocity.data.vy = 0
         self._d_target_velocity.data.va = 0
         OpenRTM_aist.setTimestamp(self._d_target_velocity)
         self._target_velocityOut.write()
         return RTC.RTC_OK

共通インターフェース仕様書 では進行方向をX軸正方向にしているため、Velocity2D型の vx に直進速度、va に回転速度を入力します。

Python ではさらにコンストラクタの以下の部分を修正してください。

Python(RasPiMouseSamplePy.py)

         #self._d_target_velocity = RTC.TimedVelocity2D(RTC.Time(0,0),0)
         self._d_target_velocity = RTC.TimedVelocity2D(RTC.Time(0,0),RTC.Velocity2D(0,0,0))

※ここまでの作業だけでもラズパイマウスの動作は可能なので、面倒ならば以下の手順は飛ばしてもらっても大丈夫です。

次に距離センサーで物体を検知した場合に停止する処理を書きます。 ここで distance_sensorにonExecute が呼び出された時に新規に受信したデータが必ず存在するとは限らないので、距離センサーのデータを一時的に格納しておく変数を宣言しておきます。

C++(include/RasPiMouseSampleCPP/RasPiMouseSampleCPP.h)

 private:
      int m_last_sensor_data[4]; /*センサーのデータを格納する変数*/

Python(RasPiMouseSamplePy.py)

     def __init__(self, manager):
         OpenRTM_aist.DataFlowComponentBase.__init__(self, manager)
 
         #センサーのデータを格納する変数
         self._last_sensor_data = [0, 0, 0, 0]

次に onExecute に距離センサーが物体を検知した場合に停止する処理を追加します。

C++(src/RasPiMouseSampleCPP.cpp)

 RTC::ReturnCode_t RasPiMouseSampleCPP::onExecute(RTC::UniqueId ec_id)
 {
     //ここから
     //データを新規に受信した場合に、データをm_last_sensor_dataを格納する
     if (m_distance_sensorIn.isNew())
     {
         m_distance_sensorIn.read();
         if (m_distance_sensor.data.length() == 4)
         {
             for (int i = 0; i < 4; i++)
             {
                 m_last_sensor_data[i] = m_distance_sensor.data[i];
             }
         }
     }
     //センサーの計測値がstop_distance以上の時に前進しないようにする
     if (m_forward_velocity > 0)
     {
         for (int i = 0; i < 4; i++)
         {
             if (m_last_sensor_data[i] > m_stop_distance)
             {
                 m_target_velocity.data.vx = 0;
                 m_target_velocity.data.vy = 0;
                 m_target_velocity.data.va = 0;
                 setTimestamp(m_target_velocity);
                 m_target_velocityOut.write();
                 return RTC::RTC_OK;
             }
         }
     }
     //ここまで
     //コンフィギュレーションパラメーターで設定した速度を送信する
     m_target_velocity.data.vx = m_forward_velocity;
 (以下略)

Python(RasPiMouseSamplePy.py)

    def onExecute(self, ec_id):
        #ここから
        #データを新規に受信した場合に、データをm_last_sensor_dataを格納する
        if self._distance_sensorIn.isNew():
            data = self._distance_sensorIn.read()
            if len(data.data) == 4:
                self._last_sensor_data = data.data[:]
 
        #センサーの計測値がstop_distance以上の時に前進しないようにする
        if self._forward_velocity[0] > 0:
            for d in self._last_sensor_data:
                if d > self._stop_distance[0]:
                    self._d_target_velocity.data.vx = 0
                    self._d_target_velocity.data.vy = 0
                    self._d_target_velocity.data.va = 0
                    OpenRTM_aist.setTimestamp(self._d_target_velocity)
                    self._target_velocityOut.write()
                    return RTC.RTC_OK
        #ここまで
        #コンフィギュレーションパラメーターで設定した速度を送信する
        self._d_target_velocity.data.vx = self._forward_velocity[0]
 (以下略)

一応ですが、onActivate 関数で m_last_sensor_data を0に設定するようにします。

C++(src/RasPiMouseSampleCPP.cpp)

 RTC::ReturnCode_t RasPiMouseSampleCPP::onActivated(RTC::UniqueId ec_id)
 {
     for (int i = 0; i < 4; i++)
     {
         m_last_sensor_data[i] = 0;
     }
   return RTC::RTC_OK;
 }

Python(RasPiMouseSamplePy.py)

     def onActivated(self, ec_id):
         self._last_sensor_data = [0, 0, 0, 0]
         return RTC.RTC_OK

Raspbianにdoxygen がインストールされていない場合は CMakeLists.txt の以下の部分を修正してください。

 #option(BUILD_DOCUMENTATION "Build the documentation" ON)
 option(BUILD_DOCUMENTATION "Build the documentation" OFF)

編集が完了したら Raspberry Pi にソースコードを転送してください。 Tera Term を使用している場合はZIP等に圧縮して転送してから Raspberry Pi 側で解凍してください。

※Windows、Ubuntuで動作させる場合は転送しないでください。

ビルド

ソースコードの編集が終了したら C++ の場合はビルドを行います。

※Visual Studio、もしくは Code::Blocks で編集している場合は GUI 上の操作でビルドを行ってください。

ソースコードのあるディレクトリーに移動して以下のコマンドを入力すればビルドできます。

 cd RasPiMouseSampleCPP
 cmake .
 make

cmakeがインストールされていない場合は以下のコマンドを入力してください。

 sudo apt-get install cmake

RTC 起動

ビルドが完了したら RTC を起動します。 以下のコマンドで起動できます。

C++

 src/RasPiMouseSampleCPPComp -f rtc.conf&

Python

 python RasPiMouseSamplePy.py -f rtc.conf&

※Windows上で RTC を起動する場合は RasPiMouseSampleCPPComp.exe(RasPiMouseSamplePy.py)をダブルクリックしてください。

次に RaspberryPiMouseRTC を起動させます。 以下のコマンドで起動してください。

 cd RaspberryPiMouseRTC
 src/RaspberryPiMouseRTCComp -f rtc.conf&

動作確認

まずは動作確認のためにデータポートの接続を行います。 Windows側で RTシステムエディタを起動してください。 最初に Raspberry Pi で起動しているネームサーバーを RTシステムエディタのビューに追加します。 [ネームサーバー追加] ボタンをクリックして Raspberry Pi の IPアドレスを入力してください。

rpm11.png

Raspberry Pi の IPアドレスは以下のコマンドで確認できます。

 ifconfig

ネームサーバーを追加したらデータポートを以下のように接続してください。

rpm15.png

ポートの接続
RasPiMouseSampleCPP0(RasPiMouseSamplePy0) RaspberryPiMouseRTC0
target_velocity target_velocity_in
distance_sensor ir_sensor_out

そして RTC をアクティブ化すると動作を開始します。 動作開始前にモーター電源スイッチはONにしておいてください。

まずは RasPiMouseSampleCPP(RasPiMouseSamplePy) のコンフィギュレーションパラメーターを変更する事でラズパイマウスを操作してみます。

RTシステムエディタで RasPiMouseSampleCPP0(RasPiMouseSamplePy0) を選択して、Configuration View の編集を選択してください。

raspi_conf.png

すると以下のウインドウが起動します。

rpm13.png

forward_velocity と rotate_velocity のスライダーによりラズパイマウスを操作できます。

次に距離センサーが障害物を検知した場合に停止するかを確認してみます。 forward_velocity を0.2等に設定して前進させてください。その状態で障害物を進行方向に置いて動作を確認してください。

停止した場合は forward_velocity を0未満に設定して後退すれば前進できるようになります。

参考までにですが、/dev/rtlightsensor0のデバイスファイルから取得できる数値とセンサーまでの距離との関係は以下のようになっています。

rpm14.png

デバイスファイルから取得した数値 実際の距離[m]
1394 0.01
792 0.02
525 0.03
373 0.04
299 0.05
260 0.06
222 0.07
181 0.08
135 0.09
100 0.10
81 0.15
36 0.20
17 0.25
16 0.30

手作業で測った数値なので、あくまで参考までに利用してください。

今回作成したサンプルコードは ここ から入手できます。

応用(中級者用課題)

ここからはさらに距離センサーで計測した距離が一定以下になった場合に回転のより障害物を回避する動作を実装します。 まず、ラズパイマウスのセンサーは以下のように取り付けられてあります。

ras.png

このため、右側のセンサーで計測した距離が一定以下の場合は左方向へ、左側のセンサーで計測した距離が一定以下の場合は右方向へ回転運動することで回避運動を行います。

コンフィギュレーションパラメーター

新たに以下のコンフィギュレーションパラメーターを設定します。 前進する速度が stop_velocity 以上で、さらにセンサーの値が sensor_limit 以下の場合に回避運動を行います。

コンフィギュレーション
名前 説明
sensor_limit double 回避運動を行う距離センサーの値、デフォルト値は10
rotational_speed double 回転速度、デフォルト値は1.6
stop_velocity double 前進しているとみなす速さ、デフォルト値は0.01

onExecute 関数の実装

onExecute 関数の実装を以下のように実装します。 ここで 動作確認の項目 で述べたように距離センサーは距離が短くなるほど大きな値を出力するので注意してください。

 RTC::ReturnCode_t RaspberryPiMouseController_DistanceSensor::onExecute(RTC::UniqueId ec_id)
 {
     //距離センサーのデータを変数に格納
     if (m_distance_sensorIn.isNew())
     {
         m_distance_sensorIn.read();
         if (m_distance_sensor.data.length() >= 4)
         {
             m_ir_sensor_r0 = m_distance_sensor.data[0];
             m_ir_sensor_r1 = m_distance_sensor.data[1];
             m_ir_sensor_l1 = m_distance_sensor.data[2];
             m_ir_sensor_l0 = m_distance_sensor.data[3];
         }
 
     }
     //目標速度のデータを変数に格納
     if (m_target_velocity_inIn.isNew())
     {
         m_target_velocity_inIn.read();
         m_target_vx = m_target_velocity_in.data.vx;
         m_target_vy = m_target_velocity_in.data.vy;
         m_target_va = m_target_velocity_in.data.va;
     }
 

     double vel = sqrt(m_target_vx*m_target_vx);
     //右側のセンサーの値が一定以上かを判定(動作確認の項で述べた通り、センサーの値は距離が短くなるほど大きな値を出力する)
     //さらに前進速度が一定以上かを判定
     if (((m_ir_sensor_r0 > m_sensor_limit) || (m_ir_sensor_r1 > m_sensor_limit)) && (vel > m_stop_velocity))
     {
         //左回転する速度を出力
         m_target_velocity_out.data.vx = 0;
         m_target_velocity_out.data.vy = 0;
         m_target_velocity_out.data.va = m_rotational_speed;
         setTimestamp(m_target_velocity_out);
 
         m_target_velocity_outOut.write();
     }
     //右側のセンサーの値が一定以上化か判定
     else if (((m_ir_sensor_l0 > m_sensor_limit) || (m_ir_sensor_l1 > m_sensor_limit)) && (vel > m_stop_velocity))
     {
         //右回転する速度を出力
         m_target_velocity_out.data.vx = 0;
         m_target_velocity_out.data.vy = 0;
         m_target_velocity_out.data.va = -m_rotational_speed;
         setTimestamp(m_target_velocity_out);
 
 
         m_target_velocity_outOut.write();
     }
     //センサーが何も検知しない場合
     else
     {
         //入力速度をそのまま出力
         m_target_velocity_out.data.vx = m_target_vx;
         m_target_velocity_out.data.vy = m_target_vy;
         m_target_velocity_out.data.va = m_target_va;
         setTimestamp(m_target_velocity_out);
 
         m_target_velocity_outOut.write();
     }
   return RTC::RTC_OK;
 }

RTシステムの保存について

RTシステムの保存については RTシステムエディタ上でもできるのですが、rtshell により RTシステムの復元を自動化することができます。 RTシステムエディタでポートの接続、コンフィギュレーションパラメーターを設定後、rtcryo コマンドを実行してください。

 rtcryo localhost -o testSystem.rtsys

これで、testSystem.rtsys というファイルにRTシステムの情報が保存されます。

ただし今回の課題のように複数のネームサーバーに登録された RTC を使用する場合、以下のように複数のネームサーバーを指定する必要があります。

 rtcryo localhost 192.168.11.1 -o testSystem.rtsys

保存した RTシステムを復元するためには rtresurrect コマンドを使用します。

 rtresurrect testSystem.rtsys

RTC をアクティブ化するには rtstart コマンドを使用します。

 rtstart testSystem.rtsys

RTC の非アクティブ化は rtstop コマンドを使用します。

 rtstop testSystem.rtsys

ポートを切断する場合は rtteardown コマンドを使用します。

 rtteardown testSystem.rtsys

注意点として、RTC はデフォルトの設定だとネームサーバーにはホスト名. host_cxt 以下に登録されます。 ホスト名は環境によって違うので、この手順で RTシステムを保存しても他の環境では再現できないという事になります。 このため、rtc.conf を編集してネームサーバーの Root 直下に登録するようにすると、他の環境でも RTシステムの復元ができるようになります。

 naming.formats: %n.rtc

Appendix

補足ですが、バッテリーを充電する際もコネクタの向きに注意してください。

rpm5.png

必ず突起部分のある方向に合わせるようにしてください。

How to Use Raspberry Pi Mouse Simulator

このページでは Raspberry Pi マウスのシミュレーターRTC の仕様、利用方法について説明します。

raspimouse2.png

仕様

raspimouse.png

RaspberryPiMouseSimulator
InPort
名前 データ型 説明
target_velocity_in RTC::TimedVelocity2D 目標速度
pose_update RTC::TimedPose2D 現在位置の更新
OutPort
名前 データ型 説明
current_velocity_out RTC::TimedVelocity2D 現在の速度
current_pose_out RTC::TimedPose2D 現在位置
ir_sensor_out RTC::TimedShortSeq 距離センサーから取得したデータを再現した値
ir_sensor_metre_out RTC::TimedDoubleSeq 距離センサーで計測した距離
コンフィギュレーションパラメーター
名前 デフォルト値 説明
sampling_time -1 シミュレーションの刻み幅。負の値に設定した場合は実行コンテキストの周期で設定
draw_time 0.01 描画の周期
sensor_param 1394,792,525,373,299,260,222,181,135,100,81,36,17,16 距離センサーのデータを生データに変換するパラメーター。0.01、0.02、0.03、0.04、0.05、0.06、0.07、0.08、0.09、0.10、0.15、0.20、0.25、0.30[m]に対応した値を設定
blocksConfigFile None 障害物の配置設定ファイルの名前

使用方法

以下からダウンロードできます。

展開したフォルダーの EXEフォルダー内に実行ファイル(RaspberryPiMouseSimulatorComp.exe)があります。 この EXEファイルを実行すると RTC が起動します。

データポート

距離センサーのデータ出力

ir_sensor_out、ir_sensor_metre_out と距離センサーのデータ出力を行うポートが2つありますが、RaspberryPiMouseRTC が距離センサーのデータを直接出力するようになっているため、ir_sensor_out ではシミュレーター上で計測した距離からセンサーのデータを再現して出力するようになっています。 ir_sensor_metre_out はメートル単位で距離を出力します。

コンフィギュレーションパラメーター

障害物の設定ファイル

blocksConfigFile というパラメーターで障害物の配置を設定する CSVファイルを指定できます。 サンプルとして test.csv というファイルを用意してあります。

このファイルに位置、角度、サイズを記述してください。

位置(X) 位置(Y) 位置(Z) 長さ(L) 幅(W) 高さ(H) 角度(θ)
0.3 0.0 0.0 0.1 1.0 0.3 0.0

block1.png
block2.png

ブロックは何個でも設定可能です。

How to Compile (Ubuntu, CMake, Code::Blocks)

このページでは Ubuntu での Code::Blocks を利用したビルドの方法を説明します。

環境準備

Code::Blocks は以下のコマンドでインストールできます。

 sudo apt-get install codeblocks

そのほか Doxygen、CMake がインストール済みでない場合は以下のコマンドでインストールを行います。

 sudo apt-get install doxygen cmake

ビルド手順

CMake

RTC ビルダで生成したコードのフォルダーに移動して、以下のコマンドを入力すると build フォルダーに各種ファイルが生成されます。

 mkdir build
 cd build
 cmake . -G "CodeBlocks - Unix Makefiles"

Code::Blocks の実行

buildフォルダーの~.cbpを開きます。

codeblocks2.png

[ビルド] ボタンをクリック(もしくは Ctrl+F9)することでビルドが実行されます。
codeblocks1.png

これでbuild/srcフォルダーに実行ファイル、共有ライブラリが生成されます。