Chapter 6: Actuation and Drive Systems
Lesson 3: Hydraulic Actuation Principles
This lesson introduces hydraulic actuators as high–power-density drive systems used in robotics. We derive fundamental pressure–flow–force relations from first principles, build a dynamic model for a servo-hydraulic cylinder, and connect these models to control-relevant quantities such as stiffness, bandwidth, and efficiency. Implementation snippets for simulation and basic sizing are provided in Python, C++, Java, and Matlab/Simulink.
1. Why Hydraulics in Robotics?
Compared to electric motors (Lesson 1) and geared transmissions (Lesson 2), hydraulic actuators deliver very large forces/torques at compact size. This comes from using pressurized fluid as the energy carrier. Hydraulics are common in heavy manipulators, legged robots for rough terrain, and high-impact tasks. The main costs are complexity, leakage risk, and nonlinear flow/valve dynamics.
flowchart TD
PWR["Prime mover (electric motor)"] --> PUMP["Pump converts mech -> fluid power"]
PUMP --> ACC["Accumulator (stores pressure)"]
ACC --> VALVE["Servo/proportional valve"]
VALVE --> ACT["Cylinder or hydraulic motor"]
ACT --> LOAD["Robot joint/load"]
ACT --> RET["Return line to tank"]
RET --> TANK["Reservoir + filtration"]
Fluid power is characterized by pressure \( p \) (energy per unit volume) and flow rate \( q \). The instantaneous hydraulic power is:
\[ P_h = p\,q . \]
2. Pascal's Law and Static Force/Torque Generation
Pascal's law states that pressure applied to a confined incompressible fluid is transmitted undiminished in all directions. Consider a static fluid element with surface normal \( \mathbf{n} \) and area \( dA \). The traction on that surface is \( d\mathbf{F} = -p\,\mathbf{n}\,dA \).
Proof sketch (from force balance):
For a small tetrahedral fluid element in static equilibrium (no acceleration), the sum of forces on its faces must be zero. Let the three orthogonal faces have areas \( A_x, A_y, A_z \) with pressures \( p_x, p_y, p_z \), and the oblique face have area \( A \) with pressure \( p \). Force balance in the x-direction gives \( p_x A_x = p A \cos\alpha \), and similarly for y, z. Using geometry \( A_x = A \cos\alpha \), etc., yields \( p_x=p_y=p_z=p \). Hence pressure is isotropic.
For a single-rod cylinder with chamber pressure \( p_A \) acting on piston area \( A_p \) and rod-side pressure \( p_B \) on area \( A_r \), the net force is
\[ F = A_p\,p_A - A_r\,p_B - F_f , \]
where \( F_f \) models friction/seal losses. For a double-acting symmetric cylinder \( A_p = A_r = A \), so \( F = A (p_A - p_B) - F_f \).
For a hydraulic motor with displacement (volume per revolution) \( D_m \), pressure drop \( \Delta p \) generates torque:
\[ \tau_m = \frac{D_m}{2\pi}\,\Delta p - \tau_f , \]
consistent with energy: one revolution consumes volume \( D_m \) at pressure \( \Delta p \), giving work \( \Delta p D_m \) which equals \( 2\pi \tau_m \).
3. Continuity and Valve/Orifice Flow
Hydraulic actuation is controlled by valves which modulate flow. The continuity equation for a control volume states that net inflow equals the rate of volume change:
\[ q_{in} - q_{out} = \frac{dV}{dt}. \]
Most servo valves behave like sharp-edged orifices. For an orifice of effective area \( A_v \) between upstream pressure \( p_u \) and downstream pressure \( p_d \), Bernoulli's equation plus discharge losses gives the orifice flow law:
\[ q = C_d A_v \sqrt{\frac{2}{\rho}\,(p_u - p_d)}, \]
where \( C_d \in (0,1) \) is discharge coefficient and \( \rho \) fluid density.
Derivation: Bernoulli for incompressible flow between large reservoir and jet:
\[ \frac{p_u}{\rho} + \frac{v_u^2}{2} = \frac{p_d}{\rho} + \frac{v_d^2}{2}. \]
With \( v_u \approx 0 \) (large upstream chamber), \( v_d = q/A_v \), we obtain \( v_d = \sqrt{2(p_u-p_d)/\rho} \). Empirical contraction and viscous losses scale flow by \( C_d \), yielding the stated law.
Around an operating point, we often linearize for control design. Let \( p_u - p_d = \Delta p_0 + \delta(\Delta p) \) and \( A_v = A_{v0} + \delta A_v \). First-order Taylor expansion gives:
\[ \delta q \approx \underbrace{C_d \sqrt{\frac{2\Delta p_0}{\rho}}}_{K_q}\,\delta A_v + \underbrace{\frac{C_d A_{v0}}{\sqrt{2\rho \Delta p_0}}}_{K_p}\,\delta(\Delta p). \]
The constants \( K_q \) and \( K_p \) are the valve flow and pressure gains.
4. Fluid Compressibility and Hydraulic Stiffness
Hydraulic fluid is slightly compressible, modeled by the effective bulk modulus \( \beta_e \). For chamber volume \( V \) and pressure \( p \),
\[ \beta_e = -V \frac{dp}{dV} \quad \Rightarrow \quad \frac{dp}{dt} = \frac{\beta_e}{V}\,\frac{dV}{dt}. \]
In a cylinder chamber, volume changes due to piston motion and net inflow: \( dV/dt = q - A\,\dot{x} \). Thus,
\[ \dot{p} = \frac{\beta_e}{V}\,(q - A\dot{x}). \]
Hydraulic stiffness. Suppose motion is slow so flow is negligible (\( q \approx 0 \)). A small displacement \( \delta x \) changes volume by \( \delta V = A\,\delta x \) and pressure by \( \delta p = (\beta_e/V)\,\delta V \). Force change is \( \delta F = A\,\delta p \), hence the effective stiffness:
\[ K_h = \frac{\delta F}{\delta x} = \frac{A^2 \beta_e}{V}. \]
This explains why small trapped volumes yield very stiff actuators, but also why air entrainment (reducing \( \beta_e \)) makes hydraulics “spongy”.
5. Dynamic Model of a Servo-Hydraulic Cylinder
We model a symmetric double-acting cylinder driven by a servo valve. Let \( x \) be piston displacement, \( p \) the load pressure (difference between chambers), and \( q \) the valve-controlled flow into the chambers (positive extending). Using the compressibility relation (Section 4),
\[ \dot{p} = \frac{\beta_e}{V_t}\,(q - A\dot{x} - C_t p), \]
where \( V_t \) is the total effective chamber volume and \( C_t \) is internal leakage coefficient.
The mechanical equation for a load mass \( m \) with viscous friction \( b \) and external load \( F_L \) is
\[ m\ddot{x} = A p - b\dot{x} - F_L. \]
Combining gives a 2nd-order coupled fluid–mechanical system. For control we insert the linearized valve flow (Section 3): \( q = K_q u - K_p p \), where \( u \) is the valve spool command.
\[ \dot{p} = \frac{\beta_e}{V_t} \bigl(K_q u - (K_p + C_t) p - A\dot{x}\bigr). \]
flowchart TD
U["Valve command u"] -->|Kq| Q["Flow q"]
P["Load pressure p"] -->| -Kp | Q
Q --> FLUID["Compressibility: p_dot = (beta_e/Vt)(q - A x_dot - Ct p)"]
FLUID --> P
P -->|A p| MECH["Mass/friction: m x_ddot = A p - b x_dot - F_L"]
MECH --> X["Position x"]
X -->|x_dot| FLUID
In state form with \( \mathbf{x}_s = [x,\; \dot{x},\; p]^T \),
\[ \dot{\mathbf{x}}_s = \begin{bmatrix} 0 & 1 & 0 \\ 0 & -\frac{b}{m} & \frac{A}{m} \\ 0 & -\frac{A\beta_e}{V_t} & -\frac{(K_p+C_t)\beta_e}{V_t} \end{bmatrix} \mathbf{x}_s + \begin{bmatrix} 0 \\ 0 \\ \frac{K_q\beta_e}{V_t} \end{bmatrix} u + \begin{bmatrix} 0 \\ -\frac{1}{m} \\ 0 \end{bmatrix} F_L . \]
This model is the hydraulic analog of a motor–gear–load model, but with pressure dynamics playing the role of “current” storage.
6. Bandwidth, Natural Frequency, and Damping
For insight, neglect leakage (\( C_t=0 \)) and valve pressure gain (\( K_p =0 \)). Eliminating \( p \) yields an approximate 2nd-order relation between \( u \) and \( x \). Differentiate the mechanical equation:
\[ m\dddot{x} = A\dot{p} - b\ddot{x}. \]
Substitute \( \dot{p} = (\beta_e/V_t)(K_q u - A\dot{x}) \):
\[ m\dddot{x} + b\ddot{x} + \frac{A^2\beta_e}{V_t}\dot{x} = \frac{A\beta_e K_q}{V_t} u. \]
Interpreting the dominant dynamics as a mass–spring–damper, the hydraulic stiffness from Section 4 appears directly. The (undamped) natural frequency is
\[ \omega_n \approx \sqrt{\frac{K_h}{m}} = \sqrt{\frac{A^2\beta_e}{m V_t}}. \]
Thus high bulk modulus, large piston area, and small trapped volume increase bandwidth.
7. Efficiency and Losses
Hydraulic systems lose power through: (i) pump inefficiency, (ii) valve throttling, (iii) leakage, and (iv) friction in actuators.
Mechanical output power is \( P_{out}=F\dot{x}=Ap\dot{x} \). Input hydraulic power is \( P_{in}=p_s q \), where \( p_s \) is supply pressure. Overall efficiency:
\[ \eta = \frac{P_{out}}{P_{in}} = \frac{A p \dot{x}}{p_s q}. \]
Throttling valves reduce efficiency at partial loads because flow is forced through pressure drops. This is one reason modern robots often add energy recovery or variable-displacement pumping.
8. Python Implementation
We simulate the linearized servo-hydraulic cylinder model from Section
5. Useful libraries: numpy, scipy, and the
control toolbox for state-space systems.
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# Parameters (illustrative)
A = 3.0e-3 # piston area [m^2]
beta_e = 1.2e9 # effective bulk modulus [Pa]
Vt = 6.0e-5 # total chamber volume [m^3]
m = 8.0 # load mass [kg]
b = 120.0 # viscous friction [N s/m]
Kq = 2.5e-5 # valve-flow gain [m^3/(s*V)]
Kp = 1.0e-11 # valve pressure gain [m^3/(s*Pa)]
Ct = 5.0e-12 # leakage [m^3/(s*Pa)]
def dynamics(t, xs, u_func, FL_func):
x, xd, p = xs
u = u_func(t)
FL = FL_func(t)
# Valve flow (linearized)
q = Kq*u - Kp*p
# Pressure dynamics
pd = (beta_e/Vt)*(q - A*xd - Ct*p)
# Mechanical dynamics
xdd = (A*p - b*xd - FL)/m
return [xd, xdd, pd]
# Step input in valve command (e.g., volts)
u_func = lambda t: 2.0 if t >= 0.1 else 0.0
FL_func = lambda t: 0.0
xs0 = [0.0, 0.0, 0.0] # initial [x, x_dot, p]
sol = solve_ivp(lambda t, xs: dynamics(t, xs, u_func, FL_func),
[0.0, 1.0], xs0, max_step=1e-3)
t = sol.t
x = sol.y[0]
p = sol.y[2]
plt.figure()
plt.plot(t, x)
plt.xlabel("time [s]")
plt.ylabel("position x [m]")
plt.grid(True)
plt.figure()
plt.plot(t, p)
plt.xlabel("time [s]")
plt.ylabel("load pressure p [Pa]")
plt.grid(True)
plt.show()
You can vary \( V_t \) and \( \beta_e \) to see the stiffness/bandwidth effects predicted by \( \omega_n \approx \sqrt{A^2\beta_e/(mV_t)} \).
9. C++ Implementation
Below is a small-time-step Euler simulation. In robotics C++ stacks, linear algebra is often handled with Eigen, but we keep it from scratch here.
#include <iostream>
#include <vector>
#include <cmath>
int main() {
// Parameters
const double A = 3.0e-3;
const double beta_e = 1.2e9;
const double Vt = 6.0e-5;
const double m = 8.0;
const double b = 120.0;
const double Kq = 2.5e-5;
const double Kp = 1.0e-11;
const double Ct = 5.0e-12;
double x = 0.0, xd = 0.0, p = 0.0;
double dt = 1e-4;
double T = 1.0;
auto u_func = [](double t){ return (t >= 0.1) ? 2.0 : 0.0; };
auto FL_func = [](double t){ return 0.0; };
for (double t=0.0; t<=T; t+=dt) {
double u = u_func(t);
double FL = FL_func(t);
double q = Kq*u - Kp*p;
double pd = (beta_e/Vt)*(q - A*xd - Ct*p);
double xdd = (A*p - b*xd - FL)/m;
// Euler integration
x += xd*dt;
xd += xdd*dt;
p += pd*dt;
if (static_cast<int>(t/dt) % 1000 == 0) {
std::cout << t << " " << x << " " << p << std::endl;
}
}
return 0;
}
10. Java Implementation
Java robotics code often uses numerical libraries such as Apache Commons Math. Here we implement a simple fixed-step integrator from scratch for clarity.
public class HydraulicCylinderSim {
static final double A = 3.0e-3;
static final double beta_e = 1.2e9;
static final double Vt = 6.0e-5;
static final double m = 8.0;
static final double b = 120.0;
static final double Kq = 2.5e-5;
static final double Kp = 1.0e-11;
static final double Ct = 5.0e-12;
static double uFunc(double t) {
return (t >= 0.1) ? 2.0 : 0.0;
}
public static void main(String[] args) {
double x = 0.0, xd = 0.0, p = 0.0;
double dt = 1e-4;
double T = 1.0;
for (double t = 0.0; t <= T; t += dt) {
double u = uFunc(t);
double FL = 0.0;
double q = Kq * u - Kp * p;
double pd = (beta_e / Vt) * (q - A * xd - Ct * p);
double xdd = (A * p - b * xd - FL) / m;
x += xd * dt;
xd += xdd * dt;
p += pd * dt;
if (((int)(t/dt)) % 1000 == 0) {
System.out.println(t + " " + x + " " + p);
}
}
}
}
11. Matlab/Simulink Implementation
Matlab supports state-space simulation directly, and Simulink/Simscape Fluids provides component-level hydraulic modeling.
% Parameters
A = 3.0e-3;
beta_e = 1.2e9;
Vt = 6.0e-5;
m = 8.0;
b = 120.0;
Kq = 2.5e-5;
Kp = 1.0e-11;
Ct = 5.0e-12;
% State-space matrices from Section 5
Axs = [0 1 0;
0 -b/m A/m;
0 -(A*beta_e)/Vt -((Kp+Ct)*beta_e)/Vt];
Bxs = [0; 0; (Kq*beta_e)/Vt];
sys = ss(Axs, Bxs, eye(3), zeros(3,1));
t = 0:1e-3:1;
u = 2*(t>=0.1); % step at 0.1 s
[y, t_out, x_out] = lsim(sys, u, t);
figure; plot(t_out, x_out(:,1));
xlabel('time [s]'); ylabel('position x [m]'); grid on;
figure; plot(t_out, x_out(:,3));
xlabel('time [s]'); ylabel('pressure p [Pa]'); grid on;
Simulink suggestion: Use Simscape Fluids blocks: Variable Displacement Pump → Servo Valve → Double-Acting Cylinder, and connect to a translational mass. This lets you compare nonlinear vs. linearized behavior.
12. Problems and Solutions
Problem 1 (Cylinder Force): A symmetric cylinder has area \( A = 4\times 10^{-3}\,\text{m}^2 \). Chamber pressures are \( p_A = 12\,\text{MPa} \) and \( p_B = 3\,\text{MPa} \). Neglect friction. Compute the net actuator force.
Solution:
\[ F = A (p_A - p_B) = 4\times 10^{-3}\,(12-3)\times 10^6 = 4\times 10^{-3}\,9\times 10^6 = 36\times 10^3 \ \text{N}. \]
The cylinder produces \( 36\,\text{kN} \).
Problem 2 (Hydraulic Stiffness): The same cylinder traps a total volume \( V_t = 8\times 10^{-5}\,\text{m}^3 \). The effective bulk modulus is \( \beta_e = 1.0\,\text{GPa} \). Find the hydraulic stiffness \( K_h \) and the natural frequency for a load of \( m=10\,\text{kg} \).
Solution:
\[ K_h = \frac{A^2\beta_e}{V_t} = \frac{(4\times 10^{-3})^2(1.0\times 10^9)}{8\times 10^{-5}} = \frac{16\times 10^{-6}\times 10^9}{8\times 10^{-5}} = \frac{16\times 10^3}{8\times 10^{-5}} = 2.0\times 10^8 \ \text{N/m}. \]
\[ \omega_n \approx \sqrt{\frac{K_h}{m}} = \sqrt{\frac{2.0\times 10^8}{10}} = \sqrt{2.0\times 10^7} \approx 4472\ \text{rad/s}. \]
This corresponds to about \( 712\,\text{Hz} \) (since \( f=\omega_n/2\pi \)).
Problem 3 (Valve Linearization): An orifice has flow \( q = C_d A_v \sqrt{2\Delta p/\rho} \). Linearize about \( A_{v0} \), \( \Delta p_0 \). Show the small-signal form \( \delta q = K_q \delta A_v + K_p \delta(\Delta p) \) and derive \( K_q, K_p \).
Solution:
Define \( f(A_v,\Delta p)=C_d A_v \sqrt{2\Delta p/\rho} \). First-order Taylor: \( \delta q = \frac{\partial f}{\partial A_v}\big|_0 \delta A_v + \frac{\partial f}{\partial \Delta p}\big|_0 \delta(\Delta p) \).
\[ \frac{\partial f}{\partial A_v}=C_d \sqrt{\frac{2\Delta p}{\rho}} \ \Rightarrow\ K_q = C_d \sqrt{\frac{2\Delta p_0}{\rho}}, \]
\[ \frac{\partial f}{\partial \Delta p} = C_d A_v \frac{1}{2}\sqrt{\frac{2}{\rho}}\,(\Delta p)^{-1/2} = \frac{C_d A_v}{\sqrt{2\rho \Delta p}} \ \Rightarrow\ K_p=\frac{C_d A_{v0}}{\sqrt{2\rho \Delta p_0}}. \]
Problem 4 (Pressure Dynamics Response): Using \( \dot{p} = (\beta_e/V_t)(q - A\dot{x}) \), consider a blocked cylinder (\( \dot{x}=0 \)) with constant inflow \( q=q_0 \). Starting from \( p(0)=0 \), find \( p(t) \).
Solution:
With \( \dot{x}=0 \): \( \dot{p} = (\beta_e/V_t)\,q_0 \), a constant. Integrate:
\[ p(t) = \frac{\beta_e q_0}{V_t}\,t. \]
The pressure ramps linearly until a relief or supply limit intervenes.
13. Summary
We established hydraulic actuation principles from Pascal’s law, derived static force/torque generation, modeled valve flow with the orifice equation, and built a coupled fluid–mechanical dynamic model. Key control-relevant outcomes were hydraulic stiffness \( K_h = A^2\beta_e/V \) and the bandwidth scaling \( \omega_n \approx \sqrt{A^2\beta_e/(mV_t)} \). Implementations in multiple languages illustrated simulation and sizing. These foundations prepare us for pneumatic actuation in the next lesson.
14. References
- Merritt, H.E. (1967). Hydraulic Control Systems. Wiley. (Foundational theory for servo valves and linearization.)
- Blackburn, J.F., Reethof, G., & Shearer, J.L. (1960). Fluid Power Control. ASME Journal of Basic Engineering, 82, 271–283.
- Shearer, J.L. (1958). Study of Hydraulic Servo Systems. Transactions of the ASME, 80, 187–193.
- Watton, J. (1987). Modelling, monitoring and control of electrohydraulic systems. Proceedings of the Institution of Mechanical Engineers, Part I, 201, 121–134.
- Eryilmaz, B., & Wilson, B.H. (2001). Unified modeling of leakage in hydraulic pumps and motors. ASME Journal of Dynamic Systems, Measurement, and Control, 123, 576–584.
- Manring, N.D. (2005). The effective bulk modulus in hydraulic systems. ASME Journal of Dynamic Systems, Measurement, and Control, 127, 318–322.