A ROS 2 framework for automated dual-arm robotic welding systems that perform holding and welding simultaneously with integrated grasp sampler and weld finder. Currently at PoC stage. Targets ROS 2 Jazzy.
hold_and_weld.mp4
hold_and_weld_description— robot URDFs, meshes, and modelshold_and_weld_planning— weld path generation and seam extractionhold_and_weld_gripper_sampler— constraint-aware grasp sampling (eliminating surfaces and regions including weld lines)hold_and_weld_application— action servers and workflow coordination (including custom kinematic solvers)hold_and_weld_bringup— launch files and system bringup (including visualizers and single spawners)
Key packages have detailed READMEs.
- Weld seam extraction from CAD and mesh geometry
- Constraint-aware grasp sampling on exact CAD surfaces
- Dual-arm coordination connecting both into an executable workcell
Grasp candidates example generated by hold_and_weld_gripper_sampler:
Weld seam extraction example via the mesh pipeline in hold_and_weld_planning:
Ubuntu 24.04 with ROS 2 Jazzy. The repo is expected at <ws>/src/hold_and_weld.
Docker (instead of steps 1–4)
The image builds OpenCASCADE and pythonocc-core from source, so the first build takes a while.
cd <ws>/src/hold_and_weld
docker build -t hold_and_weld .
xhost +local:docker
docker run -it --rm --net=host -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix \
--device /dev/dri hold_and_weld ros2 launch hold_and_weld_bringup system_bringup.launch.py1. ROS and system dependencies
MoveIt 2, Gazebo, Ceres, FCL, Embree and the rest come from rosdep:
cd <ws>
rosdep install --from-paths src --ignore-src -y2. Python dependencies
pip install --user --break-system-packages -r src/hold_and_weld/requirements.txt3. OpenCASCADE 7.9.3 and pythonocc-core 7.9.0
These are built from source: apt only ships OCCT 7.6, and pythonocc-core is not on pip. pythonocc-core must be built against the same OCCT.
sudo apt install cmake swig python3-dev python3-numpy rapidjson-dev tcl-dev tk-dev \
libfreetype-dev libgl1-mesa-dev libxi-dev libxmu-dev
git clone --depth 1 -b V7_9_3 https://github.com/Open-Cascade-SAS/OCCT.git
cmake -S OCCT -B OCCT/build -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$HOME/tools/occt_7.9.3
cmake --build OCCT/build -j$(nproc) && cmake --install OCCT/build
git clone --depth 1 -b 7.9.0 https://github.com/tpaviot/pythonocc-core.git
# 7.9.0 asks for SWIG 4.2.1; Ubuntu 24.04 ships 4.2.0, which builds it fine
sed -i 's/find_package(SWIG 4.2.1/find_package(SWIG 4.2.0/' pythonocc-core/CMakeLists.txt
cmake -S pythonocc-core -B pythonocc-core/build -DCMAKE_BUILD_TYPE=Release \
-DOCCT_INCLUDE_DIR=$HOME/tools/occt_7.9.3/include/opencascade \
-DOCCT_LIBRARY_DIR=$HOME/tools/occt_7.9.3/lib \
-DPYTHONOCC_INSTALL_DIRECTORY=$(python3 -m site --user-site)/OCC \
-DPYTHONOCC_MESHDS_NUMPY=ON
cmake --build pythonocc-core/build -j$(nproc) && cmake --install pythonocc-core/buildAdd to your shell rc, so CMake and the runtime find OCCT:
export CASROOT=$HOME/tools/occt_7.9.3
export CMAKE_PREFIX_PATH=$CASROOT:$CMAKE_PREFIX_PATH
export LD_LIBRARY_PATH=$CASROOT/lib:$LD_LIBRARY_PATH4. Build
colcon build --symlink-install
source install/setup.bash5. Launch the system
ros2 launch hold_and_weld_bringup system_bringup.launch.pyFor comprehensive guide for usage see USAGE.md. For adding a new robot to the workcell see ADDING_A_ROBOT.md. For the development roadmap see ROADMAP.md, including the planned AI-based improvements: behavior trees checked in OmniSim before they run, primary models picking grasps and approach configurations, and grasp dataset generation.
Duff, T., Burgess, B., & Hery, C. (2017). Building an orthonormal basis, revisited. Journal of Computer Graphics Techniques (JCGT), 6(1), 1–8.
The robot and gripper models in hold_and_weld_description come from these projects.
Thanks to their authors and maintainers.
| Model | Source | License |
|---|---|---|
| Yaskawa GP25, AR2010 | ros-industrial/motoman | BSD-3-Clause |
| Yaskawa HC10DT, GP8L | Yaskawa-Global/motoman_ros2_support_packages | BSD-3-Clause |
| OnRobot 2FG7 | juandpenan/onrobot_2FG7_gripper_description | MIT |
| Rethink Robotics electric gripper | RethinkRobotics/baxter_common | BSD-3-Clause |
| Robotiq 2F-140 | ros-industrial/robotiq | BSD-3-Clause |
| Schunk PG 70 | ipa320/schunk_modular_robotics | Apache-2.0 |
Their license texts are in hold_and_weld_description/vendor/.
Apache-2.0, see LICENSE. The vendored robot and gripper models keep their own
licenses, listed above. The Docker image also ships OpenCASCADE (LGPL-2.1 with the OCCT
exception) and pythonocc-core (LGPL-3.0); their license texts are in the image under
/opt/occt/share/doc/opencascade/ and /opt/pythonocc/.


