
Auto-synced
Dexsent_round2
Dual-arm Fanuc CRX-10iA robotic system with ros2_control, Cartesian control, and synchronized motion - ROS2 Humble
Fanuc CRX-10iA Dual-Arm ROS2 System
A complete ROS2 Humble implementation of a dual-arm robotic system using two Fanuc CRX-10iA collaborative robots with Robotiq grippers.
Version History / Milestones
| Tag | Description | View Code |
|---|---|---|
v1.0-task1 | Task 1 Complete: Robot Setup & Gripper Integration | git checkout v1.0-task1 |
v2.0-task2 | Task 2 Complete: Dual-Arm Cartesian Control | git checkout v2.0-task2 |
HEAD | Latest: Documentation, CI, and refinements | git checkout master |
For reviewers: Use tags to view the code at each milestone completion.
Project Overview
This project implements a dual-arm robotic workcell with:
- Two Fanuc CRX-10iA robots mounted at 45° angles
- Robotiq 2F-85 grippers on each arm
- ros2_control integration with fake hardware
- Cartesian control capability
- Synchronized dual-arm motion
Demo Videos
Task 1: Single Arm with Gripper
Task 2: Dual-Arm Synchronized Motion
Repository Structure
Dexsent_round2/
├── .github/workflows/
│ └── ros2-ci.yml # GitHub Actions CI/CD
├── src/
│ ├── fanuc_crx10ia_description/ # Single arm URDF + meshes
│ └── fanuc_dual_arm_description/ # Dual-arm system + control
├── docs/
│ ├── imgs/ # Reference images
│ ├── vids/ # Demo videos
│ ├── references/ # Research papers
│ ├── report.pdf # Technical report (1-2 pages)
│ ├── task1_robot_setup.md # Task 1 documentation
│ ├── task2_cartesian_control.md # Task 2 documentation
│ ├── architecture.md # System architecture
│ ├── troubleshooting.md # Common issues & fixes
│ ├── flex.md # Project highlights
│ └── my_exp.md # Development experience
├── docker-compose.yml
├── Dockerfile
├── docker-entrypoint.sh
└── README.md
Quick Start
Prerequisites
- Docker & Docker Compose
- X11 display server (for RViz)
1. Clone & Build
git clone https://github.com/ashwin-r11/Dexsent_round2.git
cd Dexsent_round2
# Allow X11 forwarding
xhost +local:docker
# Start Docker environment
docker compose up -d
docker compose exec ros2-dev bash
2. Build Workspace
source /opt/ros/humble/setup.bash
colcon build
source install/setup.bash
3. Launch
Task 1: Single Arm with Gripper
Display Mode (with joint sliders):
ros2 launch fanuc_crx10ia_description display.launch.py
Control Mode (with ros2_control):
ros2 launch fanuc_crx10ia_description bringup.launch.py
Run Demo:
# In another terminal
python3 /ros2_ws/src/fanuc_crx10ia_description/scripts/trajectory_demo.py
Task 2: Dual-Arm with Cartesian Control
Display Mode (with joint sliders):
ros2 launch fanuc_dual_arm_description display.launch.py
Control Mode (with Cartesian controller):
ros2 launch fanuc_dual_arm_description dual_arm_cartesian.launch.py
Run Demo:
# In another terminal
python3 /ros2_ws/src/fanuc_dual_arm_description/scripts/pick_place_demo.py
Tasks Completed
Task 1: Robot Setup & Gripper Integration
- Fanuc CRX-10iA loaded into ROS2
- Robot displayed in RViz
- Joint trajectory execution via ros2_control
- Robotiq gripper integrated
- FollowJointTrajectory support
Task 2: Dual-Arm Cartesian Control
- Two robots mounted at 45° angles
- Cartesian control implemented
- Synchronized dual-arm motion
- Pick-and-place demo with gripper control
📄 Technical Report (PDF) — Architecture, challenges, solutions, and design decisions
Architecture
┌─────────────────────────────────────────────────────────┐
│ ROS2 Humble │
├─────────────────────────────────────────────────────────┤
│ RViz2 Controller Manager Cartesian │
│ Controller │
├─────────────────────────────────────────────────────────┤
│ ros2_control │
│ Left Arm Controller │ Right Arm Controller │
│ Left Gripper │ Right Gripper │
├─────────────────────────────────────────────────────────┤
│ Fake Hardware Interface │
│ (fake_components/GenericSystem) │
└─────────────────────────────────────────────────────────┘
Packages
| Package | Description |
|---|---|
fanuc_crx10ia_description | Single arm URDF, meshes, and basic launch |
fanuc_dual_arm_description | Dual-arm URDF, controllers, demos |
Available Launch Files
| Launch File | Description |
|---|---|
display.launch.py | RViz + joint_state_publisher_gui (for testing) |
dual_arm_bringup.launch.py | ros2_control without Cartesian node |
dual_arm_cartesian.launch.py | Full system with Cartesian control |
Controller Configuration
Defined in dual_arm_controllers.yaml:
joint_state_broadcasterleft_arm_controller(JointTrajectoryController)right_arm_controller(JointTrajectoryController)left_gripper_controller(GripperActionController)right_gripper_controller(GripperActionController)
Design Decisions
| Decision | Rationale |
|---|---|
| Fake Hardware | Using fake_components/GenericSystem for simulation |
| Simple IK | Geometric IK for demo (production would use KDL/MoveIt) |
| Symmetric Mounting | 45° roll for each arm creating V-shape |
| Delta-based Motion | Demo uses deltas from neutral pose for symmetric motion |
References
Environment Setup
Dual-Arm Robotics
- Dual-Arm Jacobian Comparison (PDF)
- Authors: F. Caccavale, C. Natale, B. Siciliano, L. Villani - IEEE CIS-RAM
Mounting Reference Sketch
Sketch by: Ashwin R

Motion Planning
Grippers & End Effectors
Robot Specifications
License
BSD-3-Clause
Author
Ashwin R
Developed for DexSent Robotics Technical Screening