現在設計している新型ロボットの仮組みが出来て、一通りの動作確認が出来ました。一部届いていない部品があるので完全には動きませんが大体動いています。
(電源ノイズの問題がまだ残っているけど......)
重さは完成で2.4kg程 1機4万円ほどで作れそう
量産したいな。
2017年11月15日水曜日
新ガンモジュール射撃動画
アルミ部品でできていた旧ガンモジュールを3Dプリントとレーザーカッターの部品で設計しなおした新モジュールの動作確認が出来ました。このモジュールではCANバスからの指令で
オリジナルのマガジンは電動で、ステッピングモーターで歯車状の部品を回転して弾をチャンバーに送り届けています。またエアガンのギアボックスの動作レバーをマイクロスイッチで読み取ることにより正確な弾数を発射できます。
- 2つのサーボによる旋回角、仰角の回転
- レーザーサイトのON、OFF
- エアガンの射撃
オリジナルのマガジンは電動で、ステッピングモーターで歯車状の部品を回転して弾をチャンバーに送り届けています。またエアガンのギアボックスの動作レバーをマイクロスイッチで読み取ることにより正確な弾数を発射できます。
2017年11月8日水曜日
被弾センサー完成
真ん中の緑の板(プリント基板)の裏に加速度センサーが付いていて、加速度の微分値(躍度)がある一定値(大体2.5kG/s)を超えたら反応するようになっています。
しかし、ただ板の加速度を取っただけでは取り付けているロボットの移動の振動や、ターゲット以外のロボット本体に当たったときの振動でも反応してしまっては意味がありません。今回はターゲットと外枠をゴムで宙吊りにすることで外枠からの振動をシャットアウトしています。
センサーは秋月のアナログタイプの物を使っています。 ターゲットには赤と黄色のLEDが外側に配置しています。サバゲーでは赤と黄色でチーム分けをするのでその表示も兼ねています。
今後実際にロボットに載せてエアガンでの撃ち合いをする予定です。
2017年11月2日木曜日
mbed(lpc1768)で複数の周期のPWMを使う方法(Motor Control PWM の使い方)
今回私の工作でサーボモーター用のPWM(周期14ms)とモータードライバの駆動用のPWM(周期10us: 100kHz)の2系統のPWMを使う機会がありました。LPC1768はPWMが6本ついているので足りると思い基板を製作してプログラムを組んでから気づいたのですが、
「LPC1768の6つのPWMの周期はすべて同じになる」
という落とし穴に気づきました。新しく基板を製作するのも手間なので対策をWebで調べていたところ「Motor Control PWM(以下MCPWM)」というモジュールに気づきました。この名前のモジュールがPWM用のモジュールとは別にあり、これを使うと複数の周期のPWMが使えそうです。
ただ残念ながら青mbedではMCPWMのピンは出ていません。改造mbed専用になります。
このモジュールですがBLDC用の波形も出せるのですが、3組のタイマー+マッチレジスタが基本的な構成要素です。
timer channelが3つありそれぞれの出力がA、Bの2つがあります。出力のAとBは基本的に逆位相(+デットタイムの設定)になるためにPWMとしては実質3つの出力になります。
通常のPWMとMCPWMを比較すると
Pin PWM MCPWM
P1.18 PWM1
P1.19 MCOA0
P1.20 PWM2
P1.21 PWM3
P1.22 MCOB0
P1.23 PWM4
P1.24 PWM5
P1.25 MCOA1
P1.26 PWM6 MCOB1
P1.27
P1.28 MCOA2
P1.29 MCOB2
というピン配置になっています。頑張ると最大で9つのPWMがLPC1768で使えます。
■Power Control Register (LPC_SC->PCONP)
[17]MCPWM control bit
MCPWMは初期設定で無効になっているので設定は必須です。
■Peripheral Clock Selection registers 1 (LPC_SC->PCLKSEL1)
[31:30]Peripheral clock selection for the Motor Control PWM
00 PCLK=CCLK/4
01 PCLK=CCLK
10 PCLK=CCLK/2
11 PCLK=CCLK/8
MCPWMへの入力クロックの設定です。Mbedの基本設定だと、CCLK=96MHzです。
■Pin Function Select Register 3 (LPC_PINCON->PINSEL3)
[7:6]P1.19(MCO0A)
[13:12]P1.22(MCO0B)
[19:18]P1.25(MCO1A)
[21:20]P1.26(MCO1B)
[25:24]P1.28(MCO2A)
[27:26]P1.29(MCO2B)
00 Other
01 MCPWM
10 Other
11 Other
ピンの機能選択です。使うピンだけ01に設定してください。
■MCPWM Control read address (LPC_MCPWM->MCCON)
■MCPWM Control set address (LPC_MCPWM->MCCON_SET)
■MCPWM Control clear address (LPC_MCPWM->MCCON_CLR)
[0]Stops/starts timer channel 0
[2]Selects polarity of channel 0
[8]Stops/starts timer channel1
[10]Selects polarity of channel 1
[16]Stops/starts timer channel 2
[18]Selects polarity of channel 2
Stops/starts...を1にすると該当するチャンネルのタイマーが動作します。
Selects polarityは出力を反転します。
読み込むときは一番上のレジスタを、レジスタの一部を1にしたければSetレジスタ、0にしたければClearレジスタに「1」を書き込みます。
普通のレジスタと書き込みが違いますね、ARMコアのペリフェラルでたまにある構成です。
■MCPWM Limit 0-2 registers (LPC_MCPWM->MCPER0、MCPER1、MCPER2)
[31:0]Limit values for TC0, 1, 2.
タイマーの上限値を設定します。この値と一致するとタイマーの値は0に初期化されます。
データシート中では「MCLIM0-2」という名前ですが、Mbedのライブラリではこの名前です(何かとの互換性のため?)。
■MCPWM Match 0-2 registers (LPC_MCPWM->MCPW0、MCPW1、MCPW2)
[31:0]Match values for TC0, 1, 2.
タイマーの一致の値を設定します。
このレジスタもデータシート中では「MCMAT0-2」という名前ですが、変更されています。
LPC_SC->PCONP |= 1<<17;
// PCLK = CCLK (100MHz in our case)
LPC_SC->PCLKSEL1 |= 1<<30;
// Configuring P1.22 as MC0B
LPC_PINCON->PINSEL3 |= (1<<12);
// Start MCPWM channels 1 and 2 and POLA = 1
LPC_MCPWM->MCCON_CLR = 0xffffffff;
LPC_MCPWM->MCCON_SET = (1<<0);
// Set the Limit register
LPC_MCPWM->MCPER0 = 960;
//Set the match register
LPC_MCPWM->MCPW0 = 96;
P1.22(MCO0B)を出力に設定しています。MCPWMに入っているクロックは96Mhzでそれを960で文集するので100kHzになります。また96/960=10%のデューティー非になります。
「LPC1768の6つのPWMの周期はすべて同じになる」
という落とし穴に気づきました。新しく基板を製作するのも手間なので対策をWebで調べていたところ「Motor Control PWM(以下MCPWM)」というモジュールに気づきました。この名前のモジュールがPWM用のモジュールとは別にあり、これを使うと複数の周期のPWMが使えそうです。
ただ残念ながら青mbedではMCPWMのピンは出ていません。改造mbed専用になります。
概要
このモジュールは名前の通り、モータードライブ用のモジュールです。正確に言うとブラシレスDCモーター(BLDC)駆動用の3相の矩形波を出すためのモジュールです。オリエンタルモーターのページに解説があります。以下がブロックダイヤグラムです(LPC176Xユーザーマニュアルより)。このモジュールですがBLDC用の波形も出せるのですが、3組のタイマー+マッチレジスタが基本的な構成要素です。
ピン
MCOA0、MCOB0、MCOA1、MCOB1、MCOA2、MCOB2の6つの出力ピンがあります。timer channelが3つありそれぞれの出力がA、Bの2つがあります。出力のAとBは基本的に逆位相(+デットタイムの設定)になるためにPWMとしては実質3つの出力になります。
通常のPWMとMCPWMを比較すると
Pin PWM MCPWM
P1.18 PWM1
P1.19 MCOA0
P1.20 PWM2
P1.21 PWM3
P1.22 MCOB0
P1.23 PWM4
P1.24 PWM5
P1.25 MCOA1
P1.26 PWM6 MCOB1
P1.27
P1.28 MCOA2
P1.29 MCOB2
というピン配置になっています。頑張ると最大で9つのPWMがLPC1768で使えます。
レジスタ説明
レジスタ名はmbed onlineコンパイラで使える名前です。[]内はビット位置■Power Control Register (LPC_SC->PCONP)
[17]MCPWM control bit
MCPWMは初期設定で無効になっているので設定は必須です。
■Peripheral Clock Selection registers 1 (LPC_SC->PCLKSEL1)
[31:30]Peripheral clock selection for the Motor Control PWM
00 PCLK=CCLK/4
01 PCLK=CCLK
10 PCLK=CCLK/2
11 PCLK=CCLK/8
MCPWMへの入力クロックの設定です。Mbedの基本設定だと、CCLK=96MHzです。
■Pin Function Select Register 3 (LPC_PINCON->PINSEL3)
[7:6]P1.19(MCO0A)
[13:12]P1.22(MCO0B)
[19:18]P1.25(MCO1A)
[21:20]P1.26(MCO1B)
[25:24]P1.28(MCO2A)
[27:26]P1.29(MCO2B)
00 Other
01 MCPWM
10 Other
11 Other
ピンの機能選択です。使うピンだけ01に設定してください。
■MCPWM Control read address (LPC_MCPWM->MCCON)
■MCPWM Control set address (LPC_MCPWM->MCCON_SET)
■MCPWM Control clear address (LPC_MCPWM->MCCON_CLR)
[0]Stops/starts timer channel 0
[2]Selects polarity of channel 0
[8]Stops/starts timer channel1
[10]Selects polarity of channel 1
[16]Stops/starts timer channel 2
[18]Selects polarity of channel 2
Stops/starts...を1にすると該当するチャンネルのタイマーが動作します。
Selects polarityは出力を反転します。
読み込むときは一番上のレジスタを、レジスタの一部を1にしたければSetレジスタ、0にしたければClearレジスタに「1」を書き込みます。
普通のレジスタと書き込みが違いますね、ARMコアのペリフェラルでたまにある構成です。
■MCPWM Limit 0-2 registers (LPC_MCPWM->MCPER0、MCPER1、MCPER2)
[31:0]Limit values for TC0, 1, 2.
タイマーの上限値を設定します。この値と一致するとタイマーの値は0に初期化されます。
データシート中では「MCLIM0-2」という名前ですが、Mbedのライブラリではこの名前です(何かとの互換性のため?)。
■MCPWM Match 0-2 registers (LPC_MCPWM->MCPW0、MCPW1、MCPW2)
[31:0]Match values for TC0, 1, 2.
タイマーの一致の値を設定します。
このレジスタもデータシート中では「MCMAT0-2」という名前ですが、変更されています。
プログラム例
// Power up MCPWMLPC_SC->PCONP |= 1<<17;
// PCLK = CCLK (100MHz in our case)
LPC_SC->PCLKSEL1 |= 1<<30;
// Configuring P1.22 as MC0B
LPC_PINCON->PINSEL3 |= (1<<12);
// Start MCPWM channels 1 and 2 and POLA = 1
LPC_MCPWM->MCCON_CLR = 0xffffffff;
LPC_MCPWM->MCCON_SET = (1<<0);
// Set the Limit register
LPC_MCPWM->MCPER0 = 960;
//Set the match register
LPC_MCPWM->MCPW0 = 96;
P1.22(MCO0B)を出力に設定しています。MCPWMに入っているクロックは96Mhzでそれを960で文集するので100kHzになります。また96/960=10%のデューティー非になります。
参考
https://os.mbed.com/users/mbed2f/notebook/mcpwm-in-lpc17xx/2017年10月11日水曜日
オリジナルロボットでrviz、gazebo2-1: URDFファイルの記述
オリジナルのロボットモデルをURDFで記述して、それをrviz上で表示することを目標とします。
まずロボットモデルの記述ですがこれはURDFで行います。基本的にはROS Wikiを参照すればよいので、今回は大まかなところを注意点しか書きません。
パッケージの構成を以下のようにします。(黒はパッケージ作成時からあるもの、青は手動で追加するもの)
/package_name
/src
/include
/urdf
/robot.urdf
/launch
/display.launch
/config
/CMakeLists.txt
/package.xml
この記事ではロボットモデルを記述するrobot.urdfの書き方と、モデルの確認を行うdisplay.launchの2つのファイルを書いていきます。
ロボットを可動部分で分割した部分であるlinkをjointでつなげてロボットを作ります。今回は2輪で動作するロボットを製作します。2つの動輪と2つの補助輪があるイメージです。
しかしとりあえず初めは上記のような複雑なことをせずにただの物体を表示することを目標とします。
##### robot.urdf #####
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<cylinder radius="0.15" length="0.10" />
</geometry>
</visual>
</link>
</robot>
##### end #####
上記で原点を中心とする円柱を持つロボットモデル(これをロボットモデルというのは微妙ですが)が完成しました。
<link>タグに挟まれたところがlinkの定義です。name属性で名前を付けます。その下の<visual>タグで挟まれているのは「表示される形状」です。これとは別に衝突判定の形状を定義することが出来ます(衝突判定用の形状は処理を軽くするために細部を省略した形状を当てはめることが多い)。
geometryタグの中は形状の定義です。基本形状として、box、cylinder、sphere、それとstlファイルを読み込むmeshがあります。cylinderはz軸が軸になります。
各タグの詳細な意味はhttp://wiki.ros.org/urdf/XML/linkを見てください。
##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<node name="rviz" pkg="rviz" type="rviz" />
</launch>
##### end #####
model変数に先ほど作ったurdfファイルの場所を入れて、その内容をrobot_descriptionというrosparamに格納します。疎下4行目でrvizの起動を行います。
次にTerminalに移ってlaunchを行います。
$roslaunch package_name display.launch
このようにroslaunch <パッケージ名> <launchファイル名>とコマンド入力することでlaunchファイルを実行します。rvizが表示されるのですが、初期状態では以下の様に何も表示されないのでrvizの設定を行います。
この時roslaunch paぐらいまで売った後にtabキーを押せば保管されるはずです。しかしrosの仕様なのかpackageを作った後の初回時だけは補完をしてくれません。
毎回この設定をするのは面倒なのでrvizの設定ファイルを製作してそれを読み込み用にします。
上記のrviz上でモデルが表示されている状態でメニューバーからFile→Save Config Asを選択します。これをはじめに作ったフォルダのpackge_name/config/SETTING.rvizとして保存します。
この設定ファイルを起動時に読み込むためにlaunchを編集します。
##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<arg name="rvizconfig" default="$(find package_name)/config/SETTING.rviz" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
</launch>
##### end #####
こうすることで
$roslaunch package_name display.launch
だけでモデルが表示されます。
他の部品も加えます。
##### robot.urdf #####
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
<!-- links -->
<link name="base_link" />
<link name="body_link">
<visual>
<geometry>
<box size="0.400 0.200 0.140"/>
</geometry>
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
</visual>
</link>
<link name="left_wheel_link">
<visual>
<geometry>
<cylinder radius="0.100" length="0.050"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="right_wheel_link">
<visual>
<geometry>
<cylinder radius="0.1" length="0.05"/>
</geometry>
<material name="green">
<color rgba="0.0 1.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="caster_link">
<visual>
<geometry>
<sphere radius="0.080"/>
</geometry>
<material name="gray"/>
</visual>
</link>
<!-- joints -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body_link"/>
<origin xyz="0.000 0.000 0.150"/>
</joint>
<joint name="left_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="left_wheel_link"/>
<origin rpy="-1.5707 0 0" xyz="-0.100 0.105 -0.050"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="right_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="right_wheel_link"/>
<origin rpy="1.5707 0 0" xyz="-0.100 -0.105 -0.050"/>
<axis xyz="0 0 -1"/>
</joint>
<joint name="caster_joint" type="fixed">
<parent link="body_link"/>
<child link="caster_link"/>
<origin xyz="0.100 0 -0.070" />
<axis xyz="0.0 0.0 1.0"/>
</joint>
</robot>
##### end #####
<visual>タグの中に<material>というものが増えました。
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
これはrviz上での色を定義するものです。
$ cd ~/catkin_ws/package_name
$ check_urdf robot.urdf
とするとurdfファイルが正しいかが分かります。
まずロボットモデルの記述ですがこれはURDFで行います。基本的にはROS Wikiを参照すればよいので、今回は大まかなところを注意点しか書きません。
パッケージの構成を以下のようにします。(黒はパッケージ作成時からあるもの、青は手動で追加するもの)
/package_name
/src
/include
/urdf
/robot.urdf
/launch
/display.launch
/config
/CMakeLists.txt
/package.xml
この記事ではロボットモデルを記述するrobot.urdfの書き方と、モデルの確認を行うdisplay.launchの2つのファイルを書いていきます。
基本の表示
URDFの書き方
ロボットを可動部分で分割した部分であるlinkをjointでつなげてロボットを作ります。今回は2輪で動作するロボットを製作します。2つの動輪と2つの補助輪があるイメージです。
しかしとりあえず初めは上記のような複雑なことをせずにただの物体を表示することを目標とします。
##### robot.urdf #####
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<cylinder radius="0.15" length="0.10" />
</geometry>
</visual>
</link>
</robot>
##### end #####
上記で原点を中心とする円柱を持つロボットモデル(これをロボットモデルというのは微妙ですが)が完成しました。
<link>タグに挟まれたところがlinkの定義です。name属性で名前を付けます。その下の<visual>タグで挟まれているのは「表示される形状」です。これとは別に衝突判定の形状を定義することが出来ます(衝突判定用の形状は処理を軽くするために細部を省略した形状を当てはめることが多い)。
geometryタグの中は形状の定義です。基本形状として、box、cylinder、sphere、それとstlファイルを読み込むmeshがあります。cylinderはz軸が軸になります。
各タグの詳細な意味はhttp://wiki.ros.org/urdf/XML/linkを見てください。
Launchの書き方
Launchではモデルのロードとrvizの起動を行います。##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<node name="rviz" pkg="rviz" type="rviz" />
</launch>
##### end #####
model変数に先ほど作ったurdfファイルの場所を入れて、その内容をrobot_descriptionというrosparamに格納します。疎下4行目でrvizの起動を行います。
次にTerminalに移ってlaunchを行います。
$roslaunch package_name display.launch
このようにroslaunch <パッケージ名> <launchファイル名>とコマンド入力することでlaunchファイルを実行します。rvizが表示されるのですが、初期状態では以下の様に何も表示されないのでrvizの設定を行います。
この時roslaunch paぐらいまで売った後にtabキーを押せば保管されるはずです。しかしrosの仕様なのかpackageを作った後の初回時だけは補完をしてくれません。
- displaysウィンドウのGlobal Options→Fixed Frame の中身をmapからbase_linkに書き換える。
- displaysウィンドウ下部のAddボタンを押しBy display_tipeタブの中でrviz→RobotModelを選択してOKボタンを押す。
毎回この設定をするのは面倒なのでrvizの設定ファイルを製作してそれを読み込み用にします。
上記のrviz上でモデルが表示されている状態でメニューバーからFile→Save Config Asを選択します。これをはじめに作ったフォルダのpackge_name/config/SETTING.rvizとして保存します。
この設定ファイルを起動時に読み込むためにlaunchを編集します。
##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<arg name="rvizconfig" default="$(find package_name)/config/SETTING.rviz" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
</launch>
##### end #####
こうすることで
$roslaunch package_name display.launch
だけでモデルが表示されます。
ロボットモデルの製作
他の部品も加えます。
##### robot.urdf #####
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
<!-- links -->
<link name="base_link" />
<link name="body_link">
<visual>
<geometry>
<box size="0.400 0.200 0.140"/>
</geometry>
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
</visual>
</link>
<link name="left_wheel_link">
<visual>
<geometry>
<cylinder radius="0.100" length="0.050"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="right_wheel_link">
<visual>
<geometry>
<cylinder radius="0.1" length="0.05"/>
</geometry>
<material name="green">
<color rgba="0.0 1.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="caster_link">
<visual>
<geometry>
<sphere radius="0.080"/>
</geometry>
<material name="gray"/>
</visual>
</link>
<!-- joints -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body_link"/>
<origin xyz="0.000 0.000 0.150"/>
</joint>
<joint name="left_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="left_wheel_link"/>
<origin rpy="-1.5707 0 0" xyz="-0.100 0.105 -0.050"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="right_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="right_wheel_link"/>
<origin rpy="1.5707 0 0" xyz="-0.100 -0.105 -0.050"/>
<axis xyz="0 0 -1"/>
</joint>
<joint name="caster_joint" type="fixed">
<parent link="body_link"/>
<child link="caster_link"/>
<origin xyz="0.100 0 -0.070" />
<axis xyz="0.0 0.0 1.0"/>
</joint>
</robot>
##### end #####
<visual>タグの中に<material>というものが増えました。
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
これはrviz上での色を定義するものです。
$ cd ~/catkin_ws/package_name
$ check_urdf robot.urdf
とするとurdfファイルが正しいかが分かります。
オリジナルロボットでrviz、gazevo1-2: rosの準備
ROSの準備
環境
###### script ######
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y install ros-kinetic-desktop-full
apt-cache search ros-kinetic
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
source /opt/ros/kinetic/setup.bash
sudo apt-get -y install python-rosinstall
###### script end ######
###### script ######
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
###### script end ######
###### script ######
wikiについて
ROSには公式のwikiがあって、それがだいぶ充実しています。日本語化も一部していて、初心者が見るようなところは丁寧に日本語になっているので、実際はROS wikiを見て学ぶのが一番です。- wiki;
http://wiki.ros.org/ja - インストールについて
http://wiki.ros.org/kinetic/Installation/Ubuntu
(日本語のページは古いバージョン(indigo)の内容なので少し違います) - チュートリアル
http://wiki.ros.org/ja/ROS/Tutorials
長いですがこれで一通りすべてが学べるので良い
1.インストール
前の記事で概要を示したので今回はROSのインストールを行います。ROSは色々なツールからなっていてその環境は複雑です。そのためにインストールはROSの最初の関門です。しかし環境さえ間違えなければ以下のスクリプトでインストールが出来ます。環境
- x86系のPC(普通のPCのこと、Raspberry Piは不可:ここを参照)
- Ubuntu 16.04
###### script ######
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y install ros-kinetic-desktop-full
apt-cache search ros-kinetic
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
source /opt/ros/kinetic/setup.bash
sudo apt-get -y install python-rosinstall
###### script end ######
2. catkin_wsの製作
上記でROS自体のインストールが完了でここからcatkin workspaceを製作します。これはrosにおけるコンパイルを行う単位です。フォルダを製作して、一度makeをしてセットアップファイルの読み込みを行います。###### script ######
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
###### script end ######
3.パッケージの製作
パッケージというのはROSの単位で、1つの機能を持ったソフトの集合です。例えばロボットアームに対応したパッケージ、色々場パッケージを統合して台車ロボットを制御するパッケージ等があります。またgitなどで分配するときでの最小単位になります。 package_nameは任意のパッケージ名でその後ろは依存するパッケージの一覧です。とりあえず以下の様にしておけば良いでしょう。###### script ######
cd
~/catkin_ws/src
catkin_create_pkg package_name std_msgs rospy roscpp
###### script end ######
オリジナルロボットでrviz、gazebo1-1: 概要
概要
rvizとgazeboはロボット開発においては大変便利なROSに付属しているツールです。rvizは可視化ツールと呼ばれていてロボットの状態をGUIで表示するツールです。gazeboは物理シミュレーターでして、実機が無くてもロボットの動作をシミュレーションすることが出来ます。
これらはROSのツールに組み込まれていてROSとの親和性が高いのですが、やはり使い方が難しく、設定項目が多いために使うのは困難です。メモもかねてここに設定の仕方を残しておきます。
Rvizは下の図の様にロボットの状態を表示するツールです。このツール自体はシミュレーターではなく、ロボット実機やシミュレーションから出力されるタイヤの回転やロボットアームの関節角をデータをGUIに表示するツールです。また3次元空間上での表示に特化したシステムになります。
ロボット実機が動いている場合このツールの存在意義はあるのかと思ってしまうのですが、実機のロボットの状態を確認するもなかなか面倒なものです。またコンピューターからのコマンド通りにロボットが動いているのかといったことも確認できます。
またプラグインを使うことで電流値やエラー情報等も下の図のようにすっきりと表示することが出来ます。
gazeboは物理シミュレーターです。rosと連携していてROSのロボットモデルにいくらかの(という名の大量の)データを付加するだけでロボットモデルの物理シミュレーションができます。物理シミュレーションのカーネルはODEを使っています(ほかのシミュレーションカーネルと入れ替えできるらしいが不明)。ODEによる動力学、接触のシミュレーションができるだけでなく、カメラ画像を取得したり、LIDER(レーザーを使ったレーダー)のシミュレーションもできます。
ロボットの動力学シミュレーション(制御器など)よりもセンサーのシミュレーションに使われているという印象がある。
以下では2軸のロボットアームのシミュレーション画面で各関節には力駆動のモーターが入っていてそれをPID制御器でコントロールして関節を曲げることが出来ます。
構成
- ROSの準備
- URDFを学ぶ
urdfはrosでロボットの形状や機能を定義するためのファイル形式で実態はxmlです。このファイルで形状を表すlinkに形や重さの属性を付与して、linkとlinkの接続点をjointで定義してロボットを製作します。 - Rvizで表示する
rvizで上記のurdfを読み込んで表示します。 - gazeboで動かす
登録:
投稿 (Atom)




