Cooperative Transportation of Differential-Drive Mobile Manipulators Using Capability Map-Based Initial Posture Selection
English · 한국어
If the initial arm posture is chosen with a Capability Map before transport begins, two differential-drive mobile manipulators can carry an object together without collapsing a good configuration.
2026 ICROS undergraduate research project · Department of Mechatronics Engineering, Chungnam National University · iCIR Lab
A ROS 1 / MuJoCo simulation in which two Husky–Panda mobile manipulators cooperatively transport a single object. The arm posture selected by a Capability Map (CM) before transport is compared against a generic home posture under identical transport conditions, and each robot's Whole-Body HQP command is merged into a single 26-axis MuJoCo command.
| Material | Contents |
|---|---|
| Undergraduate research poster (PDF) | Research background, Whole-Body HQP, CM seed selection and evaluation |
| Full scenario video | Cooperative transport with the home baseline vs. the CM-applied posture |
┌─────────────────────────────────────────────────────────────────────────┐
│ /coop_phri_simul │
│ weld attach · object target · lift readiness · TF/metrics │
│ CM runtime (q_sym) · 13+13 → 26-axis command merge │
│ ▲ │ │
│ state split │ │ 26-axis joint cmd │
│ │ ▼ │
│ ┌────────────────┴─────────────────┐ /coop_scene/mujoco_ros │
│ │ │ (integrated MuJoCo state) │
│ ▼ ▼ │
│ /leader_hqp_controller /follower_hqp_controller │
│ 13-axis command 13-axis command │
│ (Whole-Body HQP) (Whole-Body HQP) │
│ ▲ ▲ │
│ └────────── posture reference q_sym ──────────┐ │
│ │ │
│ config/holding_cm_seed_lateral_nullspace.yaml │
│ (offline CM seed) │
└─────────────────────────────────────────────────────────────────────────┘
- Whole-Body HQP control — a 7-DoF Panda arm on a differential-drive (nonholonomic) Husky base, solved as one hierarchical QP per robot.
- Leader–follower cooperative transport — both end-effectors are rigidly coupled to the object, and the formation is maintained by driving the bases rather than by deforming the arms.
- Offline Capability Map seed — the transport starting posture is selected in advance from manipulability, grasp formation, and base feasibility.
- A/B comparison under identical conditions — the CM seed and the home posture are compared with the same object, weld stiffness, sensors, 0.10 m lift, and mode 235 path conditions.
- Single integrated simulation — one MuJoCo state is split per robot, and the two 13-axis commands are merged into a 26-axis command at about 500 Hz.
src/kimm_phri_panda_husky/
├── CMakeLists.txt
├── package.xml
├── launch/
│ ├── cm_transport.launch # CM scenario (also included by the baseline launch)
│ └── home_transport.launch # home baseline, redefines only the CM-related args
├── config/
│ └── holding_cm_seed_lateral_nullspace.yaml # initial state + selected offline CM seed
├── include/kimm_phri_panda_husky/
│ └── panda_husky_hqp.h
└── src/
├── coop_husky_hqp_node.cpp # state split, reference/Fext input, per-robot 13-axis command
├── coop_phri_simul.cpp # weld test, object target, key input, CM runtime, command merge
└── panda_husky_hqp.cpp # Whole-Body HQP for posture and cooperative transport
| File | Role |
|---|---|
launch/cm_transport.launch |
Default CM scenario that brings up MuJoCo and the leader/follower HQP nodes |
launch/home_transport.launch |
Home baseline scenario that reuses the CM launch |
config/holding_cm_seed_lateral_nullspace.yaml |
Initial state, selected offline CM seed, and its evaluation scores |
src/coop_phri_simul.cpp |
Weld test, object target, lift readiness, key input, and 26-axis command merge |
src/coop_husky_hqp_node.cpp |
Integrated state split, reference/Fext input, and per-robot 13-axis command publishing |
src/panda_husky_hqp.cpp |
Whole-Body HQP control for posture and cooperative transport |
Four nodes are launched:
/coop_scene/mujoco_ros
/coop_phri_simul
/leader_hqp_controller
/follower_hqp_controller
Simulation only. No real robot hardware is required, and none is covered by this repository.
| Item | Version / Install |
|---|---|
| OS | Ubuntu 20.04 |
| ROS | Noetic |
| Eigen3 | sudo apt install libeigen3-dev |
| yaml-cpp | sudo apt install libyaml-cpp-dev |
| Pinocchio | installed under /opt/openrobots (official guide) |
This repository provides only the core scenario package, so the following packages must already be present in the same catkin workspace:
| Package | Provides |
|---|---|
kimm_hqp_controller |
Hierarchical QP whole-body controller |
mujoco_ros, mujoco_ros_msgs |
MuJoCo–ROS bridge and messages |
husky_description |
Robot models and the cooperative transport scenes |
husky_description must contain the following files:
husky_coop/coop_transport_scene_straight_clean_generated.xml # CM scene
husky_coop/coop_transport_scene_straight_clean_home_baseline.xml # home baseline scene
husky_single/husky_panda_hand.urdf
cd <catkin_workspace>
source /opt/ros/noetic/setup.bash
catkin_make
source devel/setup.bashBefore running, check that both launch files resolve:
roslaunch kimm_phri_panda_husky cm_transport.launch --nodes
roslaunch kimm_phri_panda_husky home_transport.launch --nodesInstall rules for the library, headers, coop_husky_hqp_node, coop_phri_simul, and the launch/config directories are included, so an install space works as well.
Both scenarios follow the same three-step key sequence: attach → lift → transport.
The simulation stays paused until c, so the weld is formed from a clean grasp-ready posture.
selected/q_sym from holding_cm_seed_lateral_nullspace.yaml is applied as the posture reference for both arms in mode 238.
roslaunch kimm_phri_panda_husky cm_transport.launch| Key | Action |
|---|---|
c |
Simulation-only weld attach |
y |
Apply the CM posture and lift 0.10 m (mode 238) |
0 |
Start cooperative transport (mode 235) |
No CM seed is published; the generic home posture is held through the same lift and transport path. home_transport.launch includes cm_transport.launch and redefines only the arguments needed for the baseline.
roslaunch kimm_phri_panda_husky home_transport.launch| Key | Action |
|---|---|
c |
Simulation-only weld attach |
t |
Hold the home posture and lift 0.10 m (mode 211) |
0 |
Start cooperative transport (mode 235) |
The two scenarios share the same object size, weld stiffness, sensors, 0.10 m lift, and mode 235 path conditions. However, the CM
q_symand the original home posture reach different final gripper-center heights, so each scene uses object and support heights matched to its own posture.
| Mode | Owner | Meaning |
|---|---|---|
1 |
HQP | Home / posture hold |
21 |
orchestration | Simulation weld attach test |
200 |
HQP | Track external EE/base/posture references |
211 |
orchestration | Home baseline lift without the CM |
238 |
orchestration | Lift with the CM posture applied |
235 |
HQP | Final cooperative transport |
Lift readiness for mode 238 opens only within 1 cm of the 10 cm lift target. If the grasp metric is lost for more than 0.5 s or leaves the tolerance again, readiness is reset to false, blocking a new entry into mode 235.
Initial posture candidates are evaluated together on arm manipulability
The highest-scoring candidate is stored as selected/q_sym in config/holding_cm_seed_lateral_nullspace.yaml and applied once, at the start of transport.
The CM here is an offline seed, not an online planner. It is not re-queried during transport; the posture selected in advance is maintained as far as possible. Obstacle-avoidance direction and yaw alignment are handled by the mode 235 base trajectory and the HQP mobile task.
| Argument | Default | Description |
|---|---|---|
model_file |
husky_coop/coop_transport_scene_straight_clean_generated.xml |
MuJoCo scene |
cm_seed_file |
config/holding_cm_seed_lateral_nullspace.yaml |
Offline CM seed |
apply_cm_posture |
true |
Publish q_sym as the posture reference |
apply_cm_base |
false |
Apply the CM base pose (unused in the current scenarios) |
publish_lift_home_posture |
false |
Publish the home posture during lift (baseline path) |
initial_ctrl_mode |
200 |
Control mode entered at startup |
hqp_rate |
500.0 |
HQP solve and command publish rate [Hz] |
start_keyboard |
true |
Start the keyboard interface |
attach_request_delay |
1.0 |
Delay before the attach request [s] |
The weld attach behind the c key is a grasp for MuJoCo simulation testing.
The green l_ee_grasp_site / r_ee_grasp_site are the actual grasp references in simulation. Rather than treating the base-height and frame differences between the controller FK and the MuJoCo model as estimates, the real site poses published by the scene's framepos / framequat sensors are used for EE target correction and diagnostics. The weld relpose is likewise generated from a non-penetrating pose between those sites and the grasp frames at both ends of the object.
At the initial weld, each base is placed 5 mm further outward than the nominal seed, giving 10 mm of total lateral clearance. Penetration is flagged only when the EE, link7, or elbow lies inside the actual object box volume, and it must be zero at attach. During mode 235 transport, penetration diagnostics are logged but are not used as an entry-failure condition.
Confirmed for both scenarios (c → y → 0 and c → t → 0):
- Zero EE / link7 / elbow penetration at attach
- Lift of approximately
+0.10 m - Mode 235 phases 0–5 completed, 13-axis commands published on both sides at about 500 Hz, no NaN/Inf
- Simulation only. The
ckey weld attach is a MuJoCo test path and does not replace a real gripper command; real-robot bring-up is not included in this repository. - The CM is an offline initial seed. Local CM re-query during transport is not included.
- External force (Fext) compensation was not used. The code and the
fext_*launch arguments exist, but both comparison scenarios leave them disabled at theirfalsedefaults, and the behavior is unverified. - The two scenes do not share the same world heights. Because the CM
q_symand the original home posture reach different real gripper heights, each scene uses its own object and support heights. Recomputing a CM seed that also matches world heights changes the control conditions themselves, so it is left as future work.
The object slips off the support and the weld is rejected
- The simulation is intentionally paused until
c. Starting the simulation before attaching widens the gap and the weld is rejected.
catkin_make cannot find kimm_hqp_controller or Pinocchio
- Check that
kimm_hqp_controlleris in the same workspace and that Pinocchio is installed under/opt/openrobots.
MuJoCo fails to load the scene
- Check that the
model_filepath resolves insidehusky_description(husky_coop/…_generated.xmlfor CM,…_home_baseline.xmlfor the baseline).
Nodes do not start
- First confirm that the node graph resolves with
--nodes, then check withrosnode listthat all four nodes are present.
@inproceedings{ryoo2026capability,
title = {Capability Map 기반 초기 자세 선택을 활용한
차동구동 모바일 매니퓰레이터의 협업 운반},
author = {유한민 and 박진성},
booktitle = {제어로봇시스템학회 학술대회 논문집 (ICROS 2026)},
year = {2026}
}- Hanmin Ryoo — Department of Mechatronics Engineering, Chungnam National University
- Jinseong Park — Department of Mechatronics Engineering, Chungnam National University / iCIR Lab
MIT License. See LICENSE for details.

