A simulation environment for the Franka FR3 robotic arm with a wrist-mounted Intel RealSense D435 camera, built on ROS 2 Humble and Ignition Gazebo Fortress. Includes ros2_control integration, MoveIt2 motion planning, and a Cartesian ellipse trajectory demo.
- Franka FR3 7-DOF arm in Ignition Gazebo with
gz_ros2_control - Wrist-mounted RealSense D435 (official
realsense2_descriptionmesh, looking down the grip axis) - RGB + depth streams bridged to ROS via
ros_gz_bridge - Joint trajectory controller for the arm + single-finger position controller for the gripper
- MoveIt2 motion planning (
move_group+ RViz MotionPlanning plugin) - Cartesian path demo: end-effector traces a 3D ellipse in the base frame
- Ubuntu 22.04
- ROS 2 Humble - Installation Guide
- Ignition Gazebo Fortress
- libfranka 0.13+ (
sudo apt install ros-humble-libfranka)
cd ~
git clone git@github.com:vbwanere/franka-fr3-arm-control.git
cd franka-panda-arm-controlThe repo is the workspace root; it ships src/ with franka_description, franka_ros2, and panda_pick_bringup already in place. realsense2_description is pulled via apt.
sudo apt install \
ros-humble-ros-gz \
ros-humble-gz-ros2-control \
ros-humble-realsense2-description \
ros-humble-moveit \
ros-humble-libfranka
cd ~/franka-panda-arm-control
rosdep install --from-paths src -y --ignore-srccolcon build --symlink-install
source install/setup.bashsource install/setup.bash
ros2 launch panda_pick_bringup pick_and_place.launch.pyWait until you see Configured and activated fr3_arm_controller. Gazebo and an RViz with the camera feeds will open.
source install/setup.bash
ros2 run panda_pick_bringup bowling_joint.pysource install/setup.bash
ros2 launch panda_pick_bringup moveit_demo.launch.pyWait until you see You can start planning now!. A second RViz opens with the MotionPlanning plugin — drag the end-effector and hit Plan & Execute.
# Open
ros2 topic pub --once /fr3_gripper_controller/commands std_msgs/msg/Float64MultiArray "data: [0.04]"
# Close
ros2 topic pub --once /fr3_gripper_controller/commands std_msgs/msg/Float64MultiArray "data: [0.0]"Note: only the left finger animates in sim due to a known gz_ros2_control mimic-joint limitation on Humble. The right finger tracks correctly on real hardware via libfranka.
Stale Gazebo processes block the next launch. Run between sessions:
pkill -9 -f "ign gazebo"; pkill -9 -f "ruby /usr/bin/ign"; sleep 2panda_pick_bringup/— project bringup (launch files, config, URDF with D435 camera, ellipse trajectory script)franka_description/— official Franka URDF and meshes (FER, FR3, FP3 variants)franka_ros2/— official Franka ROS 2 stack (hardware interface, MoveIt config, controllers, gripper)franka_task_planning/— placeholder for AprilTag detection pipeline (msgs from old ROS 1 project)
- Custom controller — implement a torque-level controller (e.g. computed-torque or impedance) as a
ros2_controlplugin, replacing the simple position interface for more realistic dynamics. - Custom Gazebo world — model the original lab scene (workbench, dispenser, turntable, scoring platforms) as a native Ignition SDF.
- Gripper sim fix — work around the
gz_ros2_controlmimic-joint bug so the right finger also animates in simulation. - Real hardware bring-up — use
franka_bringup'sfranka.launch.pyagainst the FCI to run the same MoveIt and trajectory code on a physical FR3. - AprilTag pipeline — port the detection code from the old ROS 1 project into
franka_task_planning, run on the live/camera/color/image_rawfeed, and publish detected poses infr3_link0for pick planning.
