ROS2_備忘録
ROS:robot operrating system
ロボットのソフトウェアコンポーネントを作って動作させるためのフレームワーク/ミドルウェア
・OSではない OSとはUbuntuとかLinuxとか、Windows、Mac
それらの上に乗っかってロボットに便利な機能を提供する発祥:2000年代後半、Willow Garage社
BSDライセンス
サイト
・公式ページ:https://www.ros.org/
・マニュアル等:https://docs.ro.org/
どんなものか
本体:プロセス間通信をつかさどる
・プロセス同士をpublish-subscribeモデルや
client-serverモデルでつなぐ
・通信するデータに型周辺
・ビルドシステム、パッケージ管理、テストツール、・・・
とかいてもよくわからんので、使うメリットから
ROS化されている重要なソフトウェア
移動ロボットの制御ソフトウェア
gmapping,Cartgrapher,ナビゲーションメタパッケージ
地図生成、位置推定、経路生成
マニピュレータのソフトウェア
・MoveIt!
腕の動作計画 腕先の位置を入力→関節角を計算(逆運動学)
各種インターフェース
・すぐ使える
・以前は(特にLinuxでは)自分でシリアル通信のプログラムを書くなどの苦労があった
例えば、論文を読んでそれをC++に置き換えてコーディングorz
移動ロボットの例
https://www.youtube.com/watch?v=eVHkHOCsHns
マニピュレーションの例
https://twitter.com/robo_cit/status/1201399538541400064
ROSのバージョン
ROS1(もともとROSと呼ばれていたもの)
・オリジナルのROS
・主に研究のフレームワークとして発達
・まだまだ使われる/研究室でも使う
ROS2(今回こっち)
・ROSが普及して、当初想定していなかった利用場面が増加
・セキュリティー、製品化、シビアな通信環境、・・・
・アーキテクチャから作り直し
・ROS1とは基本的に互換性なし
ROS2のインストール
ROS1が既にインストールされている場合
vi ~/.bashrcで関係する記述をコメントアウト
以下の4行をコメントアウト
・git cloneでインストールスクリプトをダウンロード
https://github.com/ryuichiueda/ros2_setup_scripts.git
cd ros2_setup_scripts
./setup_bash
source ~/.bashrc
ROSのノードの基本
基本1:プログラムのことを「ノードと呼ぶ」
基本2:ノードは互いに通信する
これで何ができるのか
・ロボットの各機能を別のプログラムとして実装できる
・例1:画像処理のプログラムとナビゲーションのプログラムの連携
・画像処理のプロググラムは独立したソフトウェアとして公開可能
・例2:レーザスキャナをA社からB社に交換
・A社とB社が同じ出力をするノードを作っていると交換が容易
ROSの通信の基本
GUIツールで構造を確認
ノード(楕円)がデータの流路(矢印)で連結
・/chatter:流路の名前で「トピック」と呼ばれる
・流れるデータはメッセージノードから出る矢印:「パブリッシャ」
ノードに入る矢印:「リスナー」
ノードはいくつもパブリッシャーとリスナーを持てる
メッセージは型をもつ
ROS2プログラミング
先ほど動かしたtalker,listnerに相当するノードを作成
・言語:Pyhton
・参考:https://docs.ros.org/en/foxy/How-To-Guides/Developing-a-ROS-2-Package.html色々と作法が細かいので、コードを各以外のことの意図も確認
・誰が作ったパッケージも同じような構造にするため
ワークスペースの作成
ワークスペース:作業場
とりあえずディレクトリを作るだけ
mkdir -p ros2_ws/src
tree ros2_ws/
初期状態のパッケージを作る
パッケージ:ROSのプログラムの配布単位
・GitHubのリポジトリにほぼ相当
・なかにはいくつかのノードのプログラムを入れるros2 pkg createを使う
・下の例:mypkgというパッケージを作成
cd ~/ros2_ws/src/
ros2 pkg create mypkg --build-type ament_python
tree
パッケージ情報の記述1
package.xmlを編集する
・パッケージマニフェストというもの
・パッケージの情報を記述したファイル
・説明(description),メンテナ(maintainer:管理する人),ライセンスをちゃんと書くTODOと記載されているところは自分で編集する必要があるところ
パッケージ情報の記述2
setup.pyの編集
・pythonのモジュールで使われるインストールスクリプト
・変更箇所はpackage.xmlと同じ
パッケージをビルド
ビルド作業
・colconというコマンドを使用
cd ~/ros2_ws/
colcon build
ros2_ws下のパッケージを利用可能に
・~/.bashrcの末尾に2行追加
vi ~/.bashrc
source ~/ros2_ws/install/setup.bash
source ~/ros2_ws/install/local_setup.bash
sourceして確認
source ~/.bashrc
ros2 pkg list | grep mypkg
パブリッシャを持つノードの作成
機能:数字をカウントしてトピックを/countupを通じて送信
・メッセージの型は16ビット符号つき整数
・参考にしたページ
・パブリッシャの書き方
https://docs.ros.org/en/foxy/Tutorials/Beginner-Client-Libraries/Writing-A-Simple-Py-Publisher-And-Subscriber.html
・クラスなしで記述する方法
https://qiita.com/ItoMasaki/items/b7393c34fb0127826f74~/ros2_ws/ksrc/mypkg/mypkgにtalker.pyを書く
vi talker.py
シバンは書かずにいきなりimportから書いていく
import rclpy はros2でノードを書いていくために必要なライブラリ
その次にfrom rclpy.node import NodeでNodeというクラスをimportする
import rclpy
from rclpy.node import Node
from std_msgs.msg import Int16
rclpy.init()
node=Node("talker")
pub=node.create_publisher(Int16, "countup",10)
n=0
def cb():
global n
msg=Int16()
msg.data=n
pub.publish(msg)
n += 1
node.create_timer(0.5,cb)
rclpy.spin(node)
node=Node("talker")でNodeというクラスのインスタンスを生成する。
そしてpubというオブジェクトをつくるこいつにはNodeというクラスが持っているメソッドのcreate_publisherを作用する、引数は型とトピック名、あとは適当な数字10
node.create_timer(0.5,cb)も同様でcreate_timerというメソッドを作用させる、引数は0.5とcb、これは0.5sの周期でcbという関数を呼び出す、cbについては後述する
rclpy.spin(node)はrclpyのメソッドspinを適用する、こいつを記述することでプログラムが終了しなくなる
def cb():でcbという関数を定義する、
その中で、msg=Int16()、16ビットの整数を保持するオブジェクトを作る
msg.data=nでdataがnだと教えてあげる、
そして、pub.publish(msg)でパブリッシュする
データが飛んだら、nに1を足す、n += 1
ただpythonの場合、defの外で使った変数をdefの中で使っても反映されないので、global nをdefの中に記述する
パッケージの設定
この記事が気に入ったらサポートをしてみませんか?