**About this project**** : **

Based on STMicroelectronics IMU sensors, STM32F7 discovery board and a 3D printed robot, this project targets Human/robot interaction.

## Project info

Type : Wearable robot prototype to be worn like a backpack. The command is performed using three ST 9 axes IMU sensors on the user arm. The robot tracks the hand and matches its end effector position with the hand position. This prototype has been developed to explore intuitive control using IMU sensors.

Progress : still in progress

Difficulty : Advanced

# The Team :

Julien Tiron | Software development/ 3D modeling/ Hardware design | Julien Tiron |

# Things used in this project

**Hardware components :**

STM32F746G-DISCO | 1 | 32F746GDISCOVERY - Discovery kit with STM32F746NG MCU - STMicroelectronics | Complete discovery board with good form factor | |

AX-12 servomotor | 6-8 | Dynamixel AX-12A Robot Actuator from Robotis | Position controlled motor using half-duplex communication | |

ZMP IMU-Z Body Motion Sensor Package | 1 | ZMP Inc. | 全身モーションキャプチャ ZMP® IMU-Z Body Motion Sensor Package | IMU suit based on ST IMU 9 axes sensors | |

1 | 9.6V - 2.3Ah Battery for Bioloid |

**Hand tools and fabrication machines :**

## Software Tools :

-STM32 CubeMX

-IAR for ARM

-Visual Studio C#

# Story

**Introduction**

This project has been started to explore human/robot interactions, especially intuitive control based on IMU sensors and sensor fusion. Below are the main purposes of the project:

- Focus on inverse kinematics based on user hand position.
- Build a prototype to observe the feasibility of such system and develop needed software and hardware.
- The platform has to be modular to be able to answer most of the wearable robotic applications.
- Evaluate IMU sensors as interface between wearable robots and humans.
- Identify and solve the difficulties linked to wearable robots design and development.

**Hand position**

The hand position of the user is obtained using 3 IMU sensors placed on the user arm. Using the 9 axes data, a model of the arm is built in a C# application. With this model, the position of the hand can be calculated. Finally the position is sent to the STM32F7.

GUI of the C# application

**Inverse kinematics and robotic arm model**

Once the hand position is retrieved from the IMU suit, the STM32F7 computes inverse kinematics solver to position the servomotors accordingly.

Denavit-Hartenberg model for the robotic arm and inverse kinematics formulas

**Prototyping**

A 3D printed case has been designed to host the STM32F7 discovery board, the battery and a PCB. 3D printing has also been used to build the 3 DOF arm.

Hardware setup

**Applications**

There are several targeted use cases:

- Heavy weight lifting assistant (e.g. building construction, factory work…).

- “Backpack assistant”, integrated in a backpack, the robot can exchange objects with the user.

- “Smart Camera stand”, camera stand with intuitive control using IMU sensors.

**Future work**

- Implement force control to enable heavy lifting application.
- Add flexion sensors on the hand to extend the control over the robotic arm (pointing/grasping movement…).
- Implement fuzzy logic, neural network training and ANFIS network.

ANFIS (Adaptive Neuro-Fuzzy inference system) example on 2 DOF arm

## Code

- To be uploaded later
- Inverse kinematics algorithm in C#

//calculate angles for three servomotors to match given coordinates,

private Vec4 inverseKinematics3D(double x, double y, double z)

{

Vec4 servoAngles = new Vec4();

double theta1, theta2, theta3;

double X0, Y0, D;

double Z0 = 5;

double a1 = 5;

double a2 = 35;

double a3 = 20;

theta1 = Math.Atan(y / x);

X0 = Math.Sqrt(Math.Pow(a1, 2) - Math.Pow(Z0, 2)) * Math.Cos(theta1);

Y0 = Math.Sqrt(Math.Pow(a1, 2) - Math.Pow(Z0, 2)) * Math.Sin(theta1);

D = (Math.Pow(x - X0, 2) + Math.Pow(y - Y0, 2) + Math.Pow(z - Z0, 2) - a2 - a3) / (2 * a2 * a3);

theta3 = Math.Atan(-Math.Sqrt(1 - Math.Pow(D, 2)) / D);

theta2 = Math.Atan((z - Z0) / (Math.Sqrt(Math.Pow(x - X0, 2) + Math.Pow(y - Y0, 2)))) - Math.Atan((a3 * Math.Sin(theta3)) / (a2 + a3 * Math.Cos(theta3)));

servoAngles.x = imuzDraw1.Rad2Deg(theta1);

servoAngles.y = imuzDraw1.Rad2Deg(theta2);

servoAngles.z = imuzDraw1.Rad2Deg(theta3);

return servoAngles;

}

## Schematics and circuit diagrams

- To be uploaded later

## CAD - Enclosures and custom parts

- ALL 3D models can be found on Tinkercad by searching for "Murakami": Search | Tinkercad .