本ドキュメントは,Humanoid Virtual Athletics Challenge 2023 技術講習会 (2023/09/24)で利用する説明資料です.
2021年出場時のコントローラはmc_rtcを利用しています. 不整地歩行,階段登り,ジャンプなどの動作を実行できました.
- スライド:https://drive.google.com/file/d/1JXMHQoOkRj0YW3g4sy1IIKsAg4c1UVuP/view?usp=sharing
- 動画:https://drive.google.com/file/d/1jP5NVx3h8Ve3DX90CJLhUdsz7ng8M9h_/view?usp=sharing
1.ロボットの歩行コントローラ BaselineWalkingControllerを試す
参考:https://github.com/isri-aist/BaselineWalkingController#quick-trial-on-docker
docker pull ghcr.io/isri-aist/baseline_walking_controller:latest
xhost +local:
docker run --gpus all --rm -it \
--env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
ghcr.io/isri-aist/baseline_walking_controller:latest ./walk_on_plane.bash
docker run --gpus all --rm -it \
--env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
ghcr.io/isri-aist/baseline_walking_controller:latest ./walk_on_stairs.bash
既存環境を壊さないように,Docker上でやることをおすすめします. 実行環境はUbuntu 20.04を想定します.
xhost +local:
docker run --gpus all -it --env="DISPLAY" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" ubuntu:20.04
参考:途中でコンテナを終了させた場合の再起動手順.
docker start <CONTAINER ID>
docker exec -it <CONTAINER ID> /bin/bash
# 基本パッケージをインストール
apt-get update
apt-get install -y sudo aptitude build-essential lsb-release wget gnupg2 curl emacs tmux
aptitude update
# ROSをインストール
export ROS_DISTRO=noetic
sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | apt-key add -
apt-get update
apt-get install -y ros-${ROS_DISTRO}-ros-base python3-catkin-tools python3-rosdep python3-wstool python3-rosinstall python3-rosinstall-generator doxygen graphviz
# mc_rtcをインストール
curl -1sLf 'https://dl.cloudsmith.io/public/mc-rtc/stable/setup.deb.sh' | bash
apt-get install -y libmc-rtc-dev mc-rtc-utils ros-${ROS_DISTRO}-mc-rtc-plugin ros-${ROS_DISTRO}-mc-rtc-rviz-panel libeigen-qld-dev mc-state-observation
# catkinワークスペースのセットアップ
mkdir -p ${HOME}/catkin_ws/src
cd ${HOME}/catkin_ws
wstool init src
wstool set -t src isri-aist/BaselineWalkingController https://github.com/isri-aist/BaselineWalkingController --git -y
wstool update -t src isri-aist/BaselineWalkingController
wstool merge -t src src/isri-aist/BaselineWalkingController/depends.rosinstall
wstool update -t src
# ROS依存パッケージのインストール
source /opt/ros/${ROS_DISTRO}/setup.bash
rosdep init
rosdep update
rosdep install -y -r --from-paths src --ignore-src
# catkinワークスペースのビルド
source /opt/ros/${ROS_DISTRO}/setup.bash
catkin build baseline_walking_controller -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_QLD=ON
# シミュレーションをインストール
# 注意:既にインストールされているChoreonoidと干渉する可能性あり.Docker等の仮想環境での実行を奨励.
apt-get install -y jvrc-choreonoid
# シミュレーションのセットアップ
mkdir -p ${HOME}/.config/mc_rtc/controllers
cp ${HOME}/catkin_ws/src/isri-aist/BaselineWalkingController/etc/mc_rtc.yaml ${HOME}/.config/mc_rtc/mc_rtc.yaml
# シミュレーションを実行
# 複数のプロセスを起動するため,`tmux`上で実行する.
# ターミナル1:
source ${HOME}/catkin_ws/devel/setup.bash
roscore
# ターミナル2:
source ${HOME}/catkin_ws/devel/setup.bash
/usr/share/hrpsys/samples/JVRC1/clear-omninames.sh
cd /usr/share/hrpsys/samples/JVRC1
choreonoid --start-simulation sim_mc.cnoid
# ターミナル3:
source ${HOME}/catkin_ws/devel/setup.bash
roslaunch baseline_walking_controller display.launch
# Rvizを操作して歩行動作を実行する.
# 1. Rvizの"BWC"タブで,"Start"ボタンをクリック.
# 2.Rvizの"BWC"->"GuiWalk"タブで,ゴール位置(x, y, theta)をセットし”Walk”ボタンをクリック.
事前に与えたフットステップ列の通りにロボットを歩かせるには,以下のように設定ファイルを作成する.
cp ${HOME}/catkin_ws/src/isri-aist/BaselineWalkingController/.github/workflows/config/WalkingOnPlane.yaml ${HOME}/.config/mc_rtc/controllers/BaselineWalkingController.yaml
フットステップ列を変えるには,${HOME}/.config/mc_rtc/controllers/BaselineWalkingController.yaml
のfootstepList
を編集する.
参考:GitHub上で変更が加わるたびに,CIで同様のプロセスが実行され,Dockerイメージがリリースされています.
- GitHub Actionsの結果:https://github.com/isri-aist/BaselineWalkingController/actions/workflows/docker.yaml
- GitHub Actionsで実行するコマンド:https://github.com/isri-aist/BaselineWalkingController/blob/master/.github/workflows/docker.yaml
- ビルドするDockerfile:https://github.com/isri-aist/BaselineWalkingController/blob/master/.github/workflows/Dockerfile
参考:制御手法の概要は,Humanoids 2022 Workshopのスライドを参照.
参考:https://jrl-umi3218.github.io/mc_rtc/jp/tutorials.html
-
mc_rtcは以下のライブラリを統合してロボットコントローラを構築するためのフレームワーク.
- 三次元空間での運動を扱うための数学・幾何学ライブラリ:SpaceVecAlg
- ロボットモデリング・運動学・動力学計算ライブラリ:RBDyn
- 逆運動学計算ライブラリ:Tasks
- SpaceVecAlgとRBDynの入門資料としては,sva_rbdyn_presentationとsva_rbdyn_tutorialsが参考になる.
- その他に,インターフェース,可視化,ログなどの機能を含む.
-
インストール手順:aptによるインストールが推奨だが,mc-rtc-superbuildを利用してソースからのインストールも可能.
-
インターフェース:Chorenoid,MuJoCo,V-REPなどのシミュレータで実行可能.ChoreonoidとはOpenRTMプラグインを経由して接続.ROS環境がある場合は可視化インターフェースとしてRvizを利用.
-
ロボット:HRPヒューマノイド,Nao,Pepper,Fetch,UR5e,Sawyer,Pandaの実機で動作実績あり.
-
オンラインデモ:ブラウザ上で動かしてみることができる.
参考:https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/introduction/first-controller.html
https://github.com/mmurooka/HVACTutorialController に,同じコントローラのソースコードを公開.
実行環境はUbuntu 20.04を想定します.
事前にフレームワークのインストールに記載の手順でROSとmc_rtcをインストールしておく.
# コントローラのテンプレートを作成
mkdir -p ${HOME}/src
cd ${HOME}/src
# mc_rtc_new_controller <ディレクトリ> <コントローラ名>
mc_rtc_new_controller HVACTutorialController HVACTutorialController
# コントローラをビルド・インストール
cd HVACTutorialController
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
make
make install
# コントローラのセットアップ
mkdir -p ${HOME}/.config/mc_rtc
${HOME}/.config/mc_rtc/mc_rtc.yaml
に以下を記載.
MainRobot: JVRC1
Enabled: HVACTutorialController
# コントローラの実行
# ターミナル1:
roscore
# ターミナル2:
rosrun mc_rtc_ticker mc_rtc_ticker
# ターミナル3:
roslaunch mc_rtc_ticker display.launch
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/6832ff71e3978efaf9bceed267606c4adccd2425
// Update the target angle of the neck joint
postureTask->target({{"NECK_Y", {mc_rtc::constants::toRad(45) * std::sin(0.5 * t)}}});
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/9081b7e03a6331ac1b0fc922a3babeac323329bd
// Construct hand task
handTask = std::make_shared<mc_tasks::TransformTask>("LeftGripper", robots(), 0, 100.0, 500.0);
// <略>
// Update the target pose of the hand
handTask->target(
sva::PTransformd(sva::RotX(mc_rtc::constants::PI),
Eigen::Vector3d(0.4 + 0.2 * std::cos(t), 0.2 + 0.2 * std::sin(t), 0.8)));
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/db2956adf707281b288e8700b5eaeb2b8a320c10
// Construct foot tasks
footTasks[0] = std::make_shared<mc_tasks::TransformTask>("LeftFoot", robots(), 0, 1000.0, 500.0);
footTasks[1] = std::make_shared<mc_tasks::TransformTask>("RightFoot", robots(), 0, 1000.0, 500.0);
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/69a7dff49cdbed512f894d6fd48290aed2ceb2d5
// Construct CoM task
comTask = std::make_shared<mc_tasks::CoMTask>(robots(), 0, 1000.0, 500.0);
// <略>
// Update the target position of the CoM
comTask->com(Eigen::Vector3d(0.0, 0.0, 0.8));
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/e7166504ffb47426edb03710b97d616f230b9b42
// Construct base task
baseTask = std::make_shared<mc_tasks::OrientationTask>("WAIST_R_S", robots(), 0, 50.0, 30.0);
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/cd640e960db591bbc2616e7ea5e0391a2d585db9
solver().addConstraintSet(selfCollisionConstraint);
参考:https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/usage/gui.html
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/81e928138138faea12c3cdd3fc39d5df21313be9
// Add buttons to move the CoM
gui()->addElement(
{"HVACTutorialController"},
mc_rtc::gui::Button("Move CoM to the left", [this]() { comFlag = 1; }),
mc_rtc::gui::Button("Move CoM to the center", [this]() { comFlag = 0; }),
mc_rtc::gui::Button("Move CoM to the right", [this]() { comFlag = -1; }));
// <略>
// Update the target position of the CoM
comTask->com(Eigen::Vector3d(0.0, static_cast<double>(comFlag) * 0.1, 0.8));
参考:https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/usage/logging.html
https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/tools/mc_log_ui.html
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/45ba367fcbd1b70731dbe2d837b9d8770b62c330
// Add the sample log entry
logger().addLogEntry("sampleEntry", this, [this]() { return std::sin(t) + std::cos(0.4 * t); });
mc_log_ui /tmp/mc-control-HVACTutorialController-latest.bin
変更箇所:https://github.com/mmurooka/HVACTutorialController/commit/4f46b13c5da2c9c2c333ba1b44a52ae590c01f52
重心の目標位置が両足の真ん中になるようにする.
// Update the target position of the CoM
Eigen::Vector3d footCenter = 0.5 * (footTasks[0]->target().translation() + footTasks[1]->target().translation());
comTask->com(footCenter + Eigen::Vector3d(0.0, static_cast<double>(comFlag) * 0.1, 0.8));
mc_rtc_tickerの代わりにChoreonoidを実行する.RvizはChoreonoidでもユーザーインターフェースとして利用する.
/usr/share/hrpsys/samples/JVRC1/clear-omninames.sh
cd /usr/share/hrpsys/samples/JVRC1
choreonoid --start-simulation sim_mc.cnoid
動画:https://drive.google.com/file/d/19uUrKQNyQ9wc-badsQ0Qi0iThq49ypha/view?usp=sharing
ここでは詳細は省略します.詳しくは https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/recipes/fsm.html から始まる一連のチュートリアルをご覧ください.
mc_rtc_new_controller
の代わりにmc_rtc_new_fsm_controller
でコントローラのテンプレートを作成する.- YAMLファイルに個別の動作の間の状態遷移を記述する.
- YAMLファイルにはその他の設定を記述してコントローラでロードすることができ,コンパイルせずにパラメータを変更することが可能.
(本節の内容は,mc_rtcの公式チュートリアルでも内容が不足している部分があります.mc_rtcのGitHubリポジトリでのIssueやPull Requestの作成を歓迎します.)
-
Choreonoidプロジェクトファイル
sim_mc.cnoid
にBodyRTCItem
が登録されている. https://github.com/jrl-umi3218/mc_openrtm/blob/4de1c35137447a6c4cd737557c65c5750647892d/projects/JVRC1/cnoid/sim_mc.in.cnoid#L62-L75 -
BodyRTCItem
は,Virtual-JVRC1-RTC.conf
に記述されたOpenRTMデータポートを介してChoreonoidとデータをやり取りする. https://github.com/jrl-umi3218/mc_openrtm/blob/master/projects/JVRC1/cnoid/Virtual-JVRC1-RTC.conf -
Choreonoidプロジェクトファイル
sim_mc.cnoid
からsim_mc.py
が呼ばれる. https://github.com/jrl-umi3218/mc_openrtm/blob/4de1c35137447a6c4cd737557c65c5750647892d/projects/JVRC1/cnoid/sim_mc.in.cnoid#L140-L149 -
sim_mc.py
では,MCControl
というRTコンポーネントが作成される. https://github.com/jrl-umi3218/mc_openrtm/blob/4de1c35137447a6c4cd737557c65c5750647892d/projects/JVRC1/cnoid/sim_mc.py#L81-L82 -
MCControl
では,mc_rtcで生成されたロボットコンフィギュレーションをOpenRTMデータポートに書き込む,OpenRTMデータポートから取得されたセンサ情報をmc_rtcにセットする. https://github.com/jrl-umi3218/mc_openrtm/blob/master/src/MCControl.cpp -
BodyRTCItem
とMCControl
の対応するOpenRTMデータポートが接続される. https://github.com/jrl-umi3218/mc_openrtm/blob/4de1c35137447a6c4cd737557c65c5750647892d/projects/JVRC1/cnoid/sim_mc.py#L130-L145
参考:https://jrl-umi3218.github.io/mc_rtc/jp/tutorials/advanced/new-robot.html
- Robot description:ロボットモデル(URDF形式)やそれに付随する制御部位や干渉形状に関する情報.
- Robot module:mc_rtcの
RobotModule
クラスを継承したクラス.初期姿勢・関節角度やセンサの種類・位置を指定する.
- Robot description:https://github.com/jrl-umi3218/mc_rtc_data/tree/master/jvrc_description
- Robot module:https://github.com/jrl-umi3218/mc_rtc/tree/master/src/mc_robots
- Robot description:https://github.com/isri-aist/mc_fetch_description
- Robot module:https://github.com/isri-aist/mc_fetch
${HOME}/.config/mc_rtc/mc_rtc.yaml
内のMainRobot
を該当するロボットに書き換える.
- ロコマニピュレーション:LocomanipController
- 多点接触運動:MultiContactController
- フットステッププランナ:BaselineFootstepPlanner
- 重心軌道生成:CentroidalControlCollection
- 非線形MPC:NMPC
- 二次計画法ソルバ集:QpSolverCollection
- 接触力分配:ForceControlCollection
- ROS機能を使うためのChoreonoidプラグイン:CnoidRosUtils
- mc_rtcのコントローラをMuJoCoで実行:mc_mujoco
- ROS機能を使うためのMuJoCoプラグインMujocoRosUtils
- 触覚センサをシミュレーションするためのMuJoCoプラグイン:MujocoTactileSensorPlugin