概要
- 最適化され続ける分散制御の構想をシミュレーションで実験できる環境をつくりたかった
- 3DシミュレーションをUnity、ロボット制御をROS、コンテナオーケストレーションをOpenShift localで出来そうだったので、とりあえず全部組み合わせてデモが動くところまでやってみた
- 全体の構成は下図のイメージ
実行環境
- Ubuntu 20.04
- Unity
- Unity Hub 3.6.1
- RED HAT OPENSHIFT LOCAL 2.29
前提
- dockerをインストール済み
- Docker hubにログイン可能
構築手順
OpenShift Local準備
-
RedHat Developer登録
- こちらから
- すでに登録している場合はスキップ
-
インストーラー(crc-linux-amd64.tar.xz)ダウンロード
- Red Hat Hybrid Cloud Consoleにアクセスし、Clusters > Cluster Type > Localとたどる
- Download OpenShift Localをクリック
- Pull secretは後で使う
-
解凍・インストール
$ cd ~/Downloads $ tar xvf crc-linux-amd64.tar.xz $ mkdir -p ~/bin $ cp ~/Downloads/crc-linux-*-amd64/crc ~/bin export PATH=$PATH:$HOME/bin echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
-
crcコマンドの動作確認
$ crc version CRC version: 2.29.0+da5f55 OpenShift version: 4.14.1 Podman version: 4.4.4
-
OpenShift Localを起動
- 下記のコマンドを実行
$ crc setup $ crc start
- 下記のコマンドを実行し、2. のpull secretを貼り付ける
$ crc start -c 6 -m 14000 ... 略 ... INFO Adding crc-admin and crc-developer contexts to kubeconfig... Started the OpenShift cluster. The server is accessible via web console at: https://console-openshift-console.apps-crc.testing Log in as administrator: Username: kubeadmin Password: <password> Log in as user: Username: developer Password: developer Use the 'oc' command line interface: $ eval $(crc oc-env) $ oc login -u developer https://api.crc.testing:6443
-
-c
は使用するCPUコア数 -
-m
は使用するMemory量 [MB]
-
- 下記のコマンドを実行
-
Webコンソールをブラウザで確認
ROS2 Docker image準備
- Unity-Robotics-Hubのリポジトリをclone
$ git clone https://github.com/Unity-Technologies/Unity-Robotics-Hub.git
- ROSのイメージをビルド
- pick_and_placeのディレクトリまで移動
$ cd Unity-Robotics-Hub/tutorials/pick_and_place
- Unity-Robotics-Hub/tutorials/pick_and_place/docker/Dockerfileを下記のように修正
FROM ros:melodic-ros-base RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654 RUN sudo apt-get update && sudo apt-get install -y vim iputils-ping net-tools python-pip ros-melodic-robot-state-publisher ros-melodic-moveit ros-melodic-rosbridge-suite ros-melodic-joy ros-melodic-ros-control ros-melodic-ros-controllers ros-melodic-tf2-web-republisher dos2unix RUN sudo -H pip install rospkg jsonpickle ENV ROS_WORKSPACE=/catkin_ws # Copy each directory explicitly to avoid workspace cruft COPY ./ROS/src/moveit_msgs $ROS_WORKSPACE/src/moveit_msgs COPY ./ROS/src/niryo_moveit $ROS_WORKSPACE/src/niryo_moveit COPY ./ROS/src/niryo_one_ros $ROS_WORKSPACE/src/niryo_one_ros COPY ./ROS/src/niryo_one_urdf $ROS_WORKSPACE/src/niryo_one_urdf COPY ./ROS/src/ros_tcp_endpoint $ROS_WORKSPACE/src/ros_tcp_endpoint COPY ./docker/set-up-workspace /setup.sh COPY docker/tutorial / RUN /bin/bash -c "find $ROS_WORKSPACE -type f -print0 | xargs -0 dos2unix" RUN dos2unix /tutorial && dos2unix /setup.sh && chmod +x /setup.sh && /setup.sh && rm /setup.sh WORKDIR $ROS_WORKSPACE # making sure the file modes are executable RUN chmod +x src/niryo_moveit/scripts/*.py CMD exec /bin/bash -c "roslaunch niryo_moveit part_3.launch" # 追記 ENTRYPOINT ["/tutorial"]
- Dockerイメージをビルド
-
<docker-user>
の部分はDocker ID$ docker build -t <docker-user>/pick-and-place:latest -f docker/Dockerfile .
- ビルドされたことを確認
$ docker images | head -1 && docker images| grep pick REPOSITORY TAG IMAGE ID CREATED SIZE <docker-user>/pick-and-place latest 95daa64a51b 12 mins ago 2.36GB
-
- Docker hubにイメージをpush
$ docker login $ docker push <docker-user>/pick-and-place:latest
- pick_and_placeのディレクトリまで移動
ROSアプリ起動
-
OpenShiftのProjectを作成
- Webコンソールにアクセスし、ログイン
- Create a new projectをクリックし、NameにProject名を設定してCreateをクリック
-
Application、DeploymentをProjectに追加する
-
DeploymentのYAMLを修正
-
左上のハンバーガーメニューをクリックし、Topologyをクリック
-
PodがErrorになっていることを確認
-
148行目のsecurityContextオプションを下記のように変更
変更前... securityContext: {} ...
変更後... securityContext: runAsUser: 0 ...
-
Updateをクリック
- エラーが出る場合は、Reloadをした後、再度securityオプションを変更してUpdateをクリックする
-
-
defaultユーザーにprivileged権限を与える
- ocコマンドを実行できるようにする
$ eval $(crc oc-env)
- 管理者でログインする
$ oc login -u kubeadmin -p <password>
- は「OpenShift Local準備」の5.の後にコンソールに出力される(
Log in as administrator
の部分)
- は「OpenShift Local準備」の5.の後にコンソールに出力される(
- privilegedを与える
$ oc adm policy add-scc-to-user privileged -z default clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "default"
- ocコマンドを実行できるようにする
4. はセキュリティ的に非常に危険な設定なため、本番運用のときどうするか考える必要あり
Portforwarding
- ocコマンドを実行できるようにする
$ eval $(crc oc-env)
- Podの名前を確認
$ oc get pod NAME READY STATUS RESTARTS AGE pick-and-place-75f69d7b59-n276n 1/1 Running 0 13m
- Portforwardingを設定
- pod名は2.で確認したもの
$ oc port-forward pick-and-place-75f69d7b59-n276n 10000:10000 Forwarding from 127.0.0.1:10000 -> 10000 Forwarding from [::1]:10000 -> 10000
Unity準備
-
Unity Hubインストール
- 下記のコマンドを実行
$ wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null $ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list' $ sudo apt update $ sudo apt-get install unityhub
-
Unityセットアップ
-
Projectを開く
-
Demo Sceneの実行
所感・気になること
- OpenShift勉強中のためとりあえず感がかなりありますが共有します
- トラブル集をこちらにまとめました
- すぐ思いつく改善点
- Port forwardingを使わずに、NodeportとかをOpenShiftにDeployしたほうがいい
- コンテナをroot権限で無理やり動かしているのでセキュリティ的よくない
参考