BEIKE blog

備忘録です

ROSの通信について(軽く)

概要

皆さん、ROSの通信についてどのくらい理解してるでしょうか?

私は、全く理解してないです。ある程度は、こんなもんだよねって感じで理解してました。

個人で作業してる場合では、問題ないですが、他人と同じ作業してる時にROSの通信に関する知識の差のせいで作業が止まってしまうかもしれません。なので、相手に迷惑をかけないように、ここで一通りROSの通信に関する情報をまとめようと思います。ちなみにROS2の話はしません。(ほんの少しだけする)

ROSの通信

ROSの通信に関するものを雑にリスト化します。

  • 独自プロトコル
  • RPC, XMLRPC, TCPROS, UDPROS
  • rosmaster
  • topic, service, action
  • pub/sub
  • md5sum

上記のものを抑えれば、とりあえず大丈夫な気がする。

独自プロトコル

ros2は、OMGによって策定されたIDLを使用する通信プロトコルを採用してるそうなのですが、rosの通信プロトコルは独自に決められているそうです。多分、メッセージの定義やシリアライズが独自ってことなのかな。

RPC

プログラミングでのメソッド呼び出しを、同一プロセス内ではなく、別のプロセス(通常、別サーバ上)に対して行うもの。クライアント・サーバーシステムや分散処理技術(pub/sub?)を実現する仕組みとして利用されている。

XMLRPC

XMLRPCは、遠隔手続き呼出し (RPC) プロトコルの一種である。

また、XMLRPCはXML形式のデータをHTTPでやり取りするためのプロトコルであり、XML-RPCを利用するためにはXML-RPCサーバを立ち上げ、そのサーバに対してリクエストを送信する必要がある。

rosでは、XMLRPCをデータの接続をネゴシエートする場合のみ使用する。データは、XMLRPC経由で送信されない。

TCPROS

TCPROSは、ROSメッセージおよびサービスのトランスポート層です。 特徴としては、通信の信頼性を確保する代わりに低速。

UDPROS

UDPROSは、ROSメッセージおよびサービスのトランスポート層です。 特徴としては、通信の信頼性よりも速度を優先する。

topic

topicとは、メッセージの内容を識別するために使用される名前である。

メッセージは、パブリッシュ/サブスクライブセマンティクスを備えたトランスポートシステムを介してルーティングされる。

2つのノードがメッセージの交換を開始する順序について

  1. サブスクライバーが開始。使用するトピック名を解決。
  2. パブリッシャーが起動。使用するトピック名を解決。
  3. サブスクライバーはマスターに登録。(XMLRPC)
  4. パブリッシャーはマスターに登録。(XMLRPC)
  5. マスターはサブスクライバーに新しいパブリッシャーを通知。(XMLRPC)
  6. サブスクライバーはパブリッシャーに連絡してトピック接続を要求し、トランスポートプロトコルネゴシエート。(XMLRPC)
  7. パブリッシャーは、選択したトランスポートプロトコルの設定をサブスクライバーに送信。(XMLRPC)
  8. サブスクライバーは、選択したトランスポートプロトコルを使用してパブリッシャーに接続。(TCPROSなど...)

service

topicでは、非常に柔軟な通信パラダイムであるパブリッシュ/サブスクライブモデルを使用していた。 serviceでは、一対一の一方向トランスポートとしてクライアント/サーバーモデルが使われる。

  1. サービスはマスターに登録。
  2. サービスクライアントはマスターでサービスを検索。
  3. サービスクライアントは、サービスへのTCP / IPを作成。
  4. サービスクライアントとサービスは接続ヘッダーを交換。
  5. サービスクライアントがシリアル化された要求メッセージを送信。
  6. サービスはシリアル化された応答メッセージで応答。

    action

pub/sub

md5sum

GitHub Actionsについてメモ

概要

なんか凄いことをズラズラ書きそうなタイトルですが、リンクを貼るだけです。

actions/checkout@v2を使用した際にどのようなファイル構造になるのか気になったのでhomeディレクトリーから表示させてみました。(人柱)

TESTを押すと見ることが出来ます。 github.com

以下の結果

echo "${{ github.event_name }}"
echo "${{ github.head_ref }}"
echo "${{ github.ref }}"

github.com

CPU(Intel)のみでOpenposeを使用する(Ubuntu18.04)

概要

CPU(Intel)のみでOpenposeを使用する(Ubuntu18.04)をするために手順をまとめた。

ちなみに、CPUのみなので、処理が遅いです。GPUを使う方をおすすめします。(お試し用ってことで)

インストール&テスト環境

インストール手順

①openposeのリポジトリGithubからクローン

②Caffeをaptからインストール(もしかしたら、必要ないかも)

③cmake-guiを導入

④openposeをmake

⑤デモを実行

①openposeのリポジトリGithubからクローン

~$ git clone --recursive https://github.com/CMU-Perceptual-Computing-Lab/openpose.git

②Caffe&OpenCVをaptからインストール(もしかしたら、必要ないかも)

~$ sudo apt install -y caffe-cpu libopencv-dev python3-opencv

③cmake-guiを導入

~$ cd ~/Downloads
~$ sudo apt purge cmake-qt-gui
~$ sudo apt install qtbase5-dev
~$ wget https://github.com/Kitware/CMake/releases/download/v3.16.5/cmake-3.16.5.tar.gz #最新版
~$ tar xvfz cmake-3.16.5.tar.gz
~$ cd cmake-3.16.5
~$ ./configure --qt-gui
~$ ./bootstrap
~$ make -j `nproc`
~$ sudo make install -j `nproc`

④openposeをmake

makeを実行するために、プロジェクトファイルをcmake-guiで生成する。

~$ cd openpose
~$ mkdir build
~$ cmake-gui 
  • cmake-guiで行う作業は以下の3点

    • フォルダのパス指定

    • Configureをする

    • Generateをする

Configureとは、CMakeLists.txtをCMakeに実行させてビルドに必要な情報を収集する作業のことです。 もしCMakeLists.txtにバグがあったり、依存パッケージへのパスなどビルドに必要な情報を見つけられなかった場合はエラーが出ます。あとで設定し直せる。

Generateは、Configureで集めた情報を基に自分の開発環境に合わせたプロジェクトファイルを生成する作業です。

以下のようにパスの設定をして、Configureをする。 https://i.gyazo.com/0eb32b1cfe364e21ae24f1c2dd017c00.png

そしたら、各設定の画面になるので、CPU ONLYを選択して再度Configureする。 https://i.gyazo.com/496b0726cef3ad2efe0aa39cd3f3a434.png

しばらく待つと、Configure doneになる。そのあと、Genereteをする。 https://i.gyazo.com/fba2a5c910c029698a63faa7e758cc37.png

そうすると、プロジェクトファイルが生成される。そしてmakeを行う。

~$ cd openpose/build    #cmage-guiで指定したbuildディレクトリ
~$ make -j `nproc`

⑤デモを実行

結果が出るまで時間がかかる。

~$ cd openpose
~$ mkdir output
~$  ./build/examples/openpose/openpose.bin --video ./examples/media/video.avi --write_video output/output.avi

https://i.gyazo.com/c165a9d0893005c55086e74d1d9f19bb.png

参考元

kamino.hatenablog.com

www.komee.org

www.komee.org

ubuntu18.04にDockerをインストールする手順

Docker

~$ sudo apt-get update && \
   sudo apt-get install -y \
   apt-transport-https \
   ca-certificates \
   curl \
   gnupg-agent \
   software-properties-common
~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
~$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
   stable"

NVIDA Docker

NVIDIAドライバーおよびDockerを入れた後に実行

~$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
~$ curl -s -L https://nvidia.github.io/nvidia-docker/$(. /etc/os-release;echo $ID$VERSION_ID)/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
~$ sudo apt update
~$ sudo apt install -y nvidia-container-toolkit
~$ sudo systemctl restart docker

sudoなしでDockerを使用する

~$ sudo groupadd docker 
~$ sudo usermod -aG docker $USER
~$ sudo systemctl enable docker
~$ sudo systemctl start docker
~$ reboot

DockerROS+Ubuntu18.04でGazeboやrvizを立ち上げる

概要

書き途中です。

~$ xhost +local:docker
~$ docker build -t ros-ci_vi_grid_map .
~$ docker run -it --rm --gpus all \
       -v /home/ikebe/docker/docker_file/ros/src:/home/catkin_ws/src \
       -v /tmp/.X11-unix:/tmp/.X11-unix:rw \
       -e DISPLAY=$DISPLAY \
       -e QT_X11_NO_MITSHM=1 \
       -e LIBGL_ALWAYS_INDIRECT=1 \
       --privileged \
       --net=host \
   ros-ci_vi_grid_map