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つのノードがメッセージの交換を開始する順序について
- サブスクライバーが開始。使用するトピック名を解決。
- パブリッシャーが起動。使用するトピック名を解決。
- サブスクライバーはマスターに登録。(XMLRPC)
- パブリッシャーはマスターに登録。(XMLRPC)
- マスターはサブスクライバーに新しいパブリッシャーを通知。(XMLRPC)
- サブスクライバーはパブリッシャーに連絡してトピック接続を要求し、トランスポートプロトコルをネゴシエート。(XMLRPC)
- パブリッシャーは、選択したトランスポートプロトコルの設定をサブスクライバーに送信。(XMLRPC)
- サブスクライバーは、選択したトランスポートプロトコルを使用してパブリッシャーに接続。(TCPROSなど...)
service
topicでは、非常に柔軟な通信パラダイムであるパブリッシュ/サブスクライブモデルを使用していた。 serviceでは、一対一の一方向トランスポートとしてクライアント/サーバーモデルが使われる。
- サービスはマスターに登録。
- サービスクライアントはマスターでサービスを検索。
- サービスクライアントは、サービスへのTCP / IPを作成。
- サービスクライアントとサービスは接続ヘッダーを交換。
- サービスクライアントがシリアル化された要求メッセージを送信。
- サービスはシリアル化された応答メッセージで応答。
action
pub/sub
md5sum
GitHub Actionsについてメモ
概要
なんか凄いことをズラズラ書きそうなタイトルですが、リンクを貼るだけです。
actions/checkout@v2
を使用した際にどのようなファイル構造になるのか気になったのでhomeディレクトリーから表示させてみました。(人柱)
TESTを押すと見ることが出来ます。 github.com
以下の結果
echo "${{ github.event_name }}" echo "${{ github.head_ref }}" echo "${{ github.ref }}"
CPU(Intel)のみでOpenposeを使用する(Ubuntu18.04)
概要
CPU(Intel)のみでOpenposeを使用する(Ubuntu18.04)をするために手順をまとめた。
ちなみに、CPUのみなので、処理が遅いです。GPUを使う方をおすすめします。(お試し用ってことで)
インストール&テスト環境
インストール手順
②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で集めた情報を基に自分の開発環境に合わせたプロジェクトファイルを生成する作業です。
そしたら、各設定の画面になるので、CPU ONLYを選択して再度Configureする。
しばらく待つと、Configure doneになる。そのあと、Genereteをする。
そうすると、プロジェクトファイルが生成される。そして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
参考元
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