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プログラミング


ワークスペースの作成

  • ワークスペース:作業場

  • とりあえずディレクトリを作るだけ

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

パブリッシャを持つノードの作成

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の中に記述する

パッケージの設定




この記事が気に入ったらサポートをしてみませんか?