# Chapter 12: Force Mode ## About This Chapter Normal robot control controls: ``` Position ``` Force Mode, on the other hand, controls: ``` Force ``` For example, it can be used to: - Push with a constant load. - Press a component against another component. - Slide along a surface. - Produce spring-like motion. --- # 12.1 Position Control and Force Control Normal `moveJ` and `moveL` commands use: ``` Position control ``` For example, the robot attempts to move to: ``` 100 mm ``` Even if an obstacle is encountered on the way, it attempts to reach the target position as far as possible. --- Force Mode continues to push with: ``` 10 N ``` The position is not guaranteed. Instead, the force is maintained at a constant value. --- # 12.2 Applications of Force Mode Typical examples: - Connector insertion - Component assembly - Polishing - Deburring - Button pressing - Spring measurement - Load testing --- # 12.3 Basic Sequence Force Mode follows this sequence: ``` Start ↓ Force Mode ↓ Control at regular intervals ↓ End Force Mode ``` Unlike `moveJ`, it is not a command that is sent only once. --- # 12.4 Basic API Example: ```python rtde_c.forceMode( task_frame, selection_vector, wrench, force_type, limits, ) ``` While Force Mode is active, the controller performs force control internally. --- # 12.5 task_frame This specifies the coordinate system in which force control is performed. For example: ``` Base coordinates Tool coordinates Feature coordinates ``` In many cases, the following is used: ``` TCP coordinates ``` --- # 12.6 selection_vector This specifies which degrees of freedom are subject to force control. ``` [ 1, 1, 1, 0, 0, 0 ] ``` In this example, only the XYZ directions are force-controlled. The rotational directions remain under position control. --- For example: ``` [ 0, 0, 1, 0, 0, 0 ] ``` This applies force only along the Z direction. --- # 12.7 wrench The target force and torque are specified as: ``` [ Fx, Fy, Fz, Mx, My, Mz ] ``` Units: ``` N Nm ``` For example: ``` Fz=10 N ``` This applies a downward force of 10 N. --- # 12.8 force_type This specifies the controller's control mode. Normally, the standard setting is sufficient. It is rarely changed except for special applications. --- # 12.9 limits This specifies the allowable displacement. For example, if the robot has pushed as far as: ``` 10 mm ``` without reaching: ``` 10 N ``` it will not move any farther. This also serves as a safety feature. --- # 12.10 Operation During Force Mode The controller performs the following control cycle internally: ``` Current force ↓ Difference from target force ↓ PID ↓ Joint correction ↓ Motor ``` The user does not need to calculate the force on every cycle. --- # 12.11 Reading the Force API used together with Force Mode: ```python rtde_r.getActualTCPForce() ``` Return values: ``` Fx Fy Fz Mx My Mz ``` These values can be used to check the current force and torque. --- # 12.12 Stopping Force Mode Force Mode is terminated using: ``` forceModeStop() ``` Afterward, normal motion commands such as `moveJ` and `moveL` can be used again. --- # 12.13 Common Applications ### Connector Insertion ``` moveJ ↓ moveL ↓ ForceMode ↓ 10 N ↓ Insertion ↓ Stop ``` --- ### Button Pressing ``` moveL ↓ ForceMode ↓ 5 N ↓ Hold for 0.5 seconds ↓ Stop ``` --- ### Surface Following ``` ForceMode ↓ Constant force ↓ Move in the XY directions ``` This is used in applications such as polishing. --- # 12.14 Precautions Force Mode may not produce the expected force unless the following are configured correctly: - TCP settings - Payload settings Payload calibration is important when using an actual robot. --- # 12.15 Difference from moveJ `moveJ`: ``` Position ↓ Stop ``` Force Mode: ``` Force ↓ Maintain a constant value ``` Their purposes are completely different. --- # 12.16 Design in ur_ctrl.py For a high-level API, it is convenient to separate starting and stopping: ```python start_force_mode() stop_force_mode() ``` Combining these with: ```python get_tcp_force() ``` also makes force monitoring easy to implement. --- # Summary Force Mode controls force rather than position. Its purpose differs from that of ordinary motion APIs. It is used for: - Assembly - Pressing operations - Polishing - Contact tasks When using Force Mode, it is important to configure and use the following appropriately: - TCP settings - Payload settings - `ForceModeStop()` The next chapter describes Freedrive Mode.