We present our Direct-Drive End-Effector with Spatulate Fingertip that rapidly inserts beneath an object and scoops it without ejection. This project is inspired by and extends the work of Direct-Drive-Gripper-with-Swivel-Fingertips.
Related repos
- High-Speed Scooping (2024)
- Direct-Drive Gripper (2024)
- High-Speed Scooping (2022)
- Direct-Drive Gripper (2022)
- T-Motor GB54-2 × 2
- ODrive S1 × 2
- AS5048A magnetic encoder + solid magnet × 2
- Bearings — OD 100 mm / ID 6 mm × 3
- Wire terminal box × 1
- Shielded cable × 1
- 3-phase cable × 3
-
Direct-Drive Finger
- distal_link × 2
- distal_tip_cap × 1
- distal_tip × 1
- finger_tip × 2
- motor_shell × 1
- motor_plate × 2
- proximal_link × 1
- proximal_link_cap × 1
- proximal_link_pillar × 1
-
Mounting
-
Robotic Arm : RB5-850
- adapter_plate × 1
- coupler× 1
- coupling× 1
-
Drone : DJI Matrice 400
- to be added
-
We need two motor subassemblies. Each one can be assembled as follows.

The components should be connected following the diagram below. For power supply, the system supports an input range of DC 12-48V. In our setup, we supplied 24V. The encoder connection will be further elaborated.

For the encoder connection, we fabricated a cable assembly as shown in the schematic below.
The wires were joined using heat-shrinkable tube (3.0 × 45 mm) instead of soldering. After aligning the wires inside the tube, apply heat with a heat gun or lighter to shrink the tube and secure the connection.
And Finally, insert the connector into the Odrive S1 as shown in the figure below.

Keep the 3-phase connection consistent as shown below.

Each actuator module require calibration before use. This step can not be done after the gripper is assembled, so do not postpone this step.
We explicitly define the direction of the rotor to be the direction the hexagonal logo on the rotor is pointing at, and the zero position of the motor to be when the direction of the motor is pointing at the opposite direction of the power port on the stator.

ODrive provides a GUI service for setting up the motordriver. Odrive GUI In the configuration tab in this GUI, You can set up the motordriver's configuration. (this step need motor move freely so you don't set like Calibrate Zero Position diagram)
-
Power source
- DC bus overvoltage trip level: 26
- DC bus undervoltage trip level: 22
- DC max positive current: 'Leave it blank'
- DC max negative current: -0.5
-
Motor
- Type: Gimbal
- Phase resistance: 2.675
- Pole pairs: 7
- KV: 26
- Current limit: 1
- Motor calib current: 10
- Motor calib voltage: 2
- Lock-in spin current: 10
-
Encoder
- Type: SPI (AMS protocol)
- nCS pin: GPIO 12
-
Control mode
- control mode: Position Control
- Soft velocity limit: 10
- Hard velocity limit: 13.75
- Torque limit: 0.192
-
Interface
- UART (115200)
Here we calibrate the zero position of the motor. Mount the actuator on the calibration stand and install the calibration arm onto the actuator according to the diagram
Put the motor into zero position as show in the diagram below. Press down the calibration arm to make sure the stand and arm touch tightly.
when your motor is zero position you go to (ODrive0, ODrive1) in the 'inspector' tab of the Odrive GUI and set like picture below.(when you finish First step, Second step is you have to click save_configuration variable call button, Refer to Odrive doucument)

If the default mounting does not work for you, it's very easy to make a custom mount. The end-effector has a 30 mm PCD with 4 ⨉ M4 mounting interface, as shown in the drawing below.
The end-effector is designed to be compatible with ISO 9409-1-50-4-M6 Flange (applied Rainbow robotics RB5, Universal Robots UR10e, Universal Robots UR5, etc.). For other robot systems, it would be better to customize the adapter plate and coupling.
Implemented in Python 3 on Ubuntu. For ODrive basics, see official docs.
- Ubuntu:
22.04 - Python:
3.10.11 - ODrive control utility:
0.6.7
Git clone our software.
https://github.com/taehwaru/Single-Finger-Gripper-for-Scooping-Object.gitPlease open Visual Studio Code terminal and copy and paste the code below to set your virtual environment.
sudo apt-get install python3-venv
python3 -m venv myenv
source myenv/bin/activate
pip install --upgrade odriveif you finish Virtual Environment Settings part, Please refer to JS-RML, Direct-Drive Gripper with Swivel Fingertips/Software/Getting started to get started.
(1) connect RB5-850 control box and PC with lan cable.
(2) Go to network in Ubuntu settings and enter the information as shown in the picture below.

(3) Open the terminal and type ping 192.168.0.10. If it comes out like the picture below, the robot arm and the PC are communicating.

Modify GRIPPER/Spatula.py as follows.
(1) Define the variables SN_M1, SN_M2 using the serial numbers of each odrive.
SN_M1 = '383F34723539'
SN_M2 = '00E848E15413'(2) Create odrive objects using those SN_M1, SN_M2.
odrv0 = odrive.find_any(serial_number=SN_M1)
odrv1 = odrive.find_any(serial_number=SN_M2)(3) Create Actuator objects using the odrive objects above.
MOTOR1 = Actuator(odrv0, 0, 1, 45)
MOTOR2 = Actuator(odrv1, 0, 1, 45)(4) Select controlSignal in GRIPPER/mainGripper.py.
controlSignal = 'Scoop'
#controlSignal = 'testFinger'
#controlSignal = 'testEdge'
#controlSignal = 'testGetTheta'
#controlSignal = 'testGetEdge'
#controlSignal = 'testGetFingerTip'
#controlSignal = 'testMotionStop'Run main.py.
python3 main.pyThere are a set of control parameters that you can customize for different objects to scoop.
- initialConfiguration: Initial configuration
- goalConfiguration: Goal configuration
- pgain: Motor P-gains after collision.
- softmax: Motor current limit
- torque_soft_max: Motor positive torque limit(this variable not contain at code so if you want to fix it, you can use odrive gui)
- torque_soft_min: Motor negative torque limit(this variable not contain at code so if you want to fix it, you can use odrive gui)
- sensi: Motor angle Error range
for instance. In the code, the parameters are preset as follows, to scoop a iphone 13 mini (155g).
#Example code
x0=-40 ,y0=130
shoulder01, shoulder02 = ik_5bar_fingerTip(x0, y0)
initialConfiguration=[shoulder01,shoulder02]
x1=100,y1=10
shoulder11, shoulder12 = ik_5bar_fingerTip(x1, y1)
goalConfiguration=[shoulder11, shoulder12]
pgain=[15,15]
softmax=[4,4]
torque_soft_max=[0.8,0.8]
torque_soft_min=[-0.8,-0.8]
sensi=5Our end-effector uses a Coaxial 5-bar (Diamond) Linkage. The system can be controlled in two modes — either based on the linkage edge point E(xₑ, yₑ) or the fingertip point T(xₜ, yₜ), depending on the desired level of precision. The controller accepts the endpoint position (either E or T) and outputs the two motor commands 𝜃₁ and 𝜃₂.
| Task Objects | Mass (g) | P-Gain (Stiffness) | Torque Limit (N·m) | Success Rate |
|---|---|---|---|---|
| 3D Printed | 10-50 | 15 | ±0.4 | 90% (27/30) |
| Carton Box | 63 | 15 | ±0.4 | 66.6% (20/30) |
| Phone | 155 | 150 | ±0.8 | 60% (20/30) |
- Ji-woong Choi, chjwng@pusan.ac.kr
- Yong-joo Ryu, ryj01@pusan.ac.kr
- Hyun-woo Sung, zidlt@pusan.ac.kr





