Chapter 17: Applications and Case Studies
Lesson 1: Manufacturing and Warehousing
This lesson studies how robots are deployed in manufacturing lines and warehouses, with an emphasis on quantitative reasoning: throughput, utilization, work-in-progress (WIP), and simple flow models. We connect these concepts to the linear-systems viewpoint from control and illustrate a small discrete-time simulation in Python, C++, Java, and MATLAB for a robotic workcell in a warehouse.
1. Role of Robots in Manufacturing and Warehousing
In manufacturing and warehousing, robots are embedded into larger material flow systems that transform raw inputs into finished products, or move inventory to fulfill orders. Conceptually, we can treat each robot as a server in a pipeline handling arriving jobs (parts, totes, pallets). The key performance metrics are:
- Throughput (jobs per unit time), often denoted by \( R \).
-
Cycle time per job, \( T_c \), with
the informal relation
\[ R \approx \frac{1}{T_c}. \]
- Work-in-progress (WIP), \( W \), the expected number of jobs in the system.
- Utilization, \( \rho \), measuring the fraction of time the robot is busy.
A minimal manufacturing cell with a single industrial arm can be represented as a sequence of operations in the robot's sense–think–act loop from earlier chapters:
flowchart TD
A["Raw parts buffer"] --> B["Conveyor in"]
B --> C["Robot pick & place"]
C --> D["Processing machine"]
D --> E["Robot unload"]
E --> F["Inspection / QA"]
F --> G["Finished goods buffer"]
Each arrow can be modeled as a flow of jobs. The robot is typically the most flexible element, and can become the bottleneck if not sized or scheduled correctly. In the next sections we move from this qualitative picture to quantitative models.
2. Single-Robot Workcell as a Queue
Consider a single robot serving one job at a time, with jobs arriving from an upstream process. A classical abstraction is a single-server queue:
- Jobs (parts, totes) arrive at rate \( \lambda \) jobs per second.
- The robot serves jobs with mean rate \( \mu \), so the mean service time is \( 1 / \mu \).
- At most one job is processed at a time; waiting jobs form a FIFO queue.
The utilization of the robot is defined as
\[ \rho = \frac{\lambda}{\mu}. \]
Intuitively, \( \rho \) is the long-run fraction of time the robot is busy. If arrivals persist indefinitely with rate \( \lambda \) and the service capability is \( \mu \), then a fundamental stability condition is
\[ \rho < 1 \quad \Longleftrightarrow \quad \lambda < \mu. \]
When \( \rho \geq 1 \), the queue will on average grow without bound. This is the basic capacity sizing rule: the robot's mean service rate must exceed the mean arrival rate.
2.1 Simple M/M/1 Queue Approximation
If we assume Poisson arrivals and exponential service times (an M/M/1 queue), then the steady-state performance indices are given by closed-form formulas. The expected number of jobs in the system (queue + robot) is
\[ L = \frac{\rho}{1 - \rho}, \quad 0 \le \rho < 1. \]
The average time a job spends in the system (waiting + service) is
\[ W = \frac{1}{\mu - \lambda}. \]
These formulas follow from Little's Law, which in general states:
\[ L = \lambda W. \]
Using the queueing approximation, we can relate robot design parameters (such as cycle time or tool change time) to system-level metrics, and thus justify adding a second robot or a buffer if required.
2.2 Relating to Cycle Time
Suppose the robot executes a fixed sequence of motions with deterministic cycle time \( T_c \). Then the nominal service rate is
\[ \mu = \frac{1}{T_c}. \]
If upstream production targets an arrival rate \( \lambda^\star \), the stability condition becomes
\[ \lambda^\star < \frac{1}{T_c}. \]
From a control perspective, changing \( T_c \) corresponds to modifying motion profiles (shorter moves, faster accelerations) or reducing nonproductive overhead (e.g., tool changes), all of which must respect actuator limits and safety constraints from earlier chapters.
3. Simple Line-Level Flow Model
In a manufacturing line, multiple robots and machines are connected by buffers. Let \( n \) be the number of buffers (plus possibly the finished goods buffer). We define the state vector
\[ \mathbf{x}(k) = \begin{bmatrix} x_1(k) \\ x_2(k) \\ \vdots \\ x_n(k) \end{bmatrix}, \]
where \( x_i(k) \) is the number of jobs in buffer \( i \) at discrete time step \( k \). A simple linear flow model is
\[ \mathbf{x}(k+1) = \mathbf{x}(k) + \mathbf{B}\,\mathbf{u}(k) - \mathbf{C}\,\mathbf{y}(k). \]
Here:
- \( \mathbf{u}(k) \) is a vector of external arrivals (e.g., raw parts entering buffer 1).
- \( \mathbf{y}(k) \) is a vector of completed transfers from buffers (e.g., parts leaving buffer \( i \) to buffer \( i+1 \) after a robot action).
- \( \mathbf{B} \) and \( \mathbf{C} \) are incidence matrices that encode how arrivals and completions affect each buffer.
For a simple serial line with buffers \( 1,\dots,n \) and one robot between each pair of buffers, we may model the completions as
\[ y_i(k) = \min\big(x_i(k),\, s_i(k)\big), \quad i = 1,\dots,n, \]
where \( s_i(k) \) is the number of jobs that robot \( i \) can move in step \( k \) (bounded by its cycle time and scheduling). If we approximate \( s_i(k) \) by its mean capacity \( \bar{s}_i \), we obtain a linear time-invariant (LTI) model with saturation approximated by a gain:
\[ \mathbf{x}(k+1) \approx \mathbf{A}\,\mathbf{x}(k) + \mathbf{B}\,\mathbf{u}(k), \]
where \( \mathbf{A} \) captures average transfer rates between buffers. The spectral radius of \( \mathbf{A} \) and the eigenvalues of the closed-loop system when combined with feedback policies (e.g., throttling arrivals) determine whether WIP stays bounded. This is a direct use of linear control theory in a manufacturing context.
4. Robotic Warehouses and Travel Time Models
Modern warehouses use fleets of mobile robots or shuttles instead of fixed conveyors. The primary functions are:
- Store incoming inventory in racks or shelves.
- Retrieve items to pick stations for order fulfillment.
- Replenish fast-moving items and rebalance storage.
A simplified warehouse routing model represents the storage area as a graph with nodes \( 1,\dots,N \) (intersections, stations) and edges with travel times \( w_{ij} \). A robot route that visits a sequence of nodes \( i_0, i_1, \dots, i_m \) has total travel time
\[ T_{\text{route}} = \sum_{k=0}^{m-1} w_{i_k i_{k+1}}. \]
Given an order with pick locations \( P \subset \{1,\dots,N\} \), the routing problem seeks an order of visits that minimizes \( T_{\text{route}} \). This is a variant of the traveling salesman problem on the warehouse graph, and optimal planning is usually delegated to specialized optimization solvers.
At a higher level, warehouse controllers must maintain acceptable queue lengths at pick stations. If \( \lambda_p \) is the rate of order arrival at a pick station and \( \mu_p \) the effective service rate (depending on robot routing and human picking speed), then we re-use the utilization concept \( \rho_p = \lambda_p / \mu_p \) and require \( \rho_p < 1 \) to avoid diverging waiting times.
The control logic coordinating orders and robots can be sketched as follows:
flowchart TD
O["Incoming orders"] --> S["Order batching & prioritization"]
S --> R["Route planner"]
R --> F["Fleet controller"]
F --> B1["Robots move to storage"]
B1 --> B2["Robots bring totes to pick stations"]
B2 --> C["Picked orders consolidated and shipped"]
From a systems viewpoint, the warehouse is a network of queues and finite-capacity buffers coupled to a routing and scheduling policy. Full analysis is complex, but even simple metrics such as utilization and average route time are essential for sizing the robot fleet.
5. Discrete-Time Simulation of a Robotic Workcell
Analytical formulas (like M/M/1) rely on strong assumptions. In practice, engineers often build discrete-time simulations to approximate manufacturing and warehouse behavior. Here we implement a minimal simulation of a single robotic station:
- Simulation horizon: \( K \) time steps.
- At each step \( k \), a random number of arrivals \( a(k) \) enters the queue.
- If the queue is nonempty, the robot serves exactly one job per step (service capacity \( = 1 \) job/step).
Let \( q(k) \) be the queue length at step \( k \) and \( d(k) \in \{0,1\} \) the number of departures. The dynamics are
\[ q(k+1) = q(k) + a(k) - d(k), \quad d(k) = \begin{cases} 1 & \text{if } q(k) > 0 \\ 0 & \text{if } q(k) = 0 \end{cases}. \]
We now implement this model in different languages. The details are intentionally simple, to focus on the structure that later can be integrated into robotics frameworks (e.g., ROS nodes or industrial controllers).
5.1 Python Implementation
import random
def simulate_workcell(K=1000, lam=0.7):
"""
Simple discrete-time queue for a single robot.
At each time step, arrivals ~ Bernoulli(lam) for simplicity.
Service capacity = 1 job per step.
"""
q = 0 # current queue length
total_departures = 0
total_q = 0 # for average queue length
for k in range(K):
# arrivals: at most one with probability lam
arrivals = 1 if random.random() < lam else 0
q += arrivals
# service: robot processes one job if available
if q > 0:
q -= 1
total_departures += 1
total_q += q
avg_q = total_q / K
throughput = total_departures / K
utilization = throughput # here capacity = 1 job/step
return {
"avg_queue_length": avg_q,
"throughput": throughput,
"utilization": utilization,
}
if __name__ == "__main__":
stats = simulate_workcell(K=10000, lam=0.7)
print("Average queue length:", stats["avg_queue_length"])
print("Throughput:", stats["throughput"])
print("Utilization:", stats["utilization"])
5.2 C++ Implementation
#include <iostream>
#include <random>
struct Stats {
double avg_queue_length;
double throughput;
double utilization;
};
Stats simulate_workcell(int K = 1000, double lam = 0.7) {
std::mt19937 gen(42);
std::bernoulli_distribution bern(lam);
int q = 0;
int total_departures = 0;
long long total_q = 0;
for (int k = 0; k < K; ++k) {
int arrivals = bern(gen) ? 1 : 0;
q += arrivals;
if (q > 0) {
q -= 1;
total_departures += 1;
}
total_q += q;
}
Stats s;
s.avg_queue_length = static_cast<double>(total_q) / K;
s.throughput = static_cast<double>(total_departures) / K;
s.utilization = s.throughput; // capacity = 1 job/step
return s;
}
int main() {
Stats s = simulate_workcell(10000, 0.7);
std::cout << "Average queue length: " << s.avg_queue_length << "\n";
std::cout << "Throughput: " << s.throughput << "\n";
std::cout << "Utilization: " << s.utilization << "\n";
return 0;
}
5.3 Java Implementation
import java.util.Random;
public class WorkcellSim {
public static class Stats {
public double avgQueueLength;
public double throughput;
public double utilization;
}
public static Stats simulateWorkcell(int K, double lam) {
Random rng = new Random(42L);
int q = 0;
int totalDepartures = 0;
long totalQ = 0L;
for (int k = 0; k < K; ++k) {
int arrivals = (rng.nextDouble() < lam) ? 1 : 0;
q += arrivals;
if (q > 0) {
q -= 1;
totalDepartures += 1;
}
totalQ += q;
}
Stats s = new Stats();
s.avgQueueLength = (double) totalQ / K;
s.throughput = (double) totalDepartures / K;
s.utilization = s.throughput; // capacity = 1 job/step
return s;
}
public static void main(String[] args) {
Stats s = simulateWorkcell(10000, 0.7);
System.out.println("Average queue length: " + s.avgQueueLength);
System.out.println("Throughput: " + s.throughput);
System.out.println("Utilization: " + s.utilization);
}
}
5.4 MATLAB / Simulink-Oriented Implementation
In MATLAB, we can write a script for the same queue. A Simulink diagram would then represent \( q(k+1) = q(k) + a(k) - d(k) \) using a Unit Delay block for \( q \), a random source for arrivals, and simple logic for \( d(k) \).
function stats = simulate_workcell(K, lam)
if nargin < 1, K = 1000; end
if nargin < 2, lam = 0.7; end
q = 0;
total_departures = 0;
total_q = 0;
for k = 1:K
arrivals = rand() < lam; % 0 or 1
q = q + arrivals;
if q > 0
q = q - 1;
total_departures = total_departures + 1;
end
total_q = total_q + q;
end
stats.avg_queue_length = total_q / K;
stats.throughput = total_departures / K;
stats.utilization = stats.throughput; % capacity = 1 job/step
end
% Example usage:
% s = simulate_workcell(10000, 0.7);
% disp(s);
In a Simulink model, this discrete-time structure can be represented as:
- Random Number block with threshold \( \lambda \) to generate \( a(k) \).
- Sum block implementing \( q(k+1) = q(k) + a(k) - d(k) \).
- Unit Delay block storing \( q(k) \).
- Relational Operator and Switch blocks to implement the logic for \( d(k) \).
Such a Simulink model forms a basis for more detailed co-simulation with robot motion controllers, introduced in later courses.
6. Problems and Solutions
Problem 1 (Robot Capacity Sizing): A robot workcell receives parts from an upstream conveyor with average rate \( \lambda = 0.8 \) parts/s. The robot executes a fixed cycle that takes \( T_c = 1.0 \) s per part. Model the system as an M/M/1 queue and compute: (a) the utilization \( \rho \); (b) whether the system is stable; (c) the expected waiting time in the system \( W \).
Solution:
The service rate is \( \mu = 1/T_c = 1/1.0 = 1.0 \) part/s. Thus
\[ \rho = \frac{\lambda}{\mu} = \frac{0.8}{1.0} = 0.8. \]
Since \( \rho = 0.8 < 1 \), the queue is stable. The expected time in system is
\[ W = \frac{1}{\mu - \lambda} = \frac{1}{1.0 - 0.8} = 5 \ \text{s}. \]
On average, a part spends 5 seconds in the workcell (waiting plus service).
Problem 2 (Effect of Cycle-Time Reduction): In Problem 1, suppose engineering reduces the robot cycle time to \( T_c = 0.8 \) s. Recompute \( \rho \) and \( W \), and compare to the previous values.
Solution:
Now \( \mu = 1/0.8 = 1.25 \) parts/s. Then
\[ \rho = \frac{0.8}{1.25} = 0.64. \]
The system remains stable, with lower utilization. The time in system is
\[ W = \frac{1}{1.25 - 0.8} = \frac{1}{0.45} \approx 2.22 \ \text{s}. \]
Reducing cycle time from 1.0 s to 0.8 s more than halves the expected time in the system (from 5 s to about 2.22 s), illustrating the strong nonlinear impact of utilization on waiting times as \( \rho \) approaches 1.
Problem 3 (Two-Buffer Linear Model): Consider a simple line with two buffers. Buffer 1 feeds buffer 2 via a robot that transfers a fraction \( \alpha \) of the parts in each time step. External arrivals of \( u(k) \) jobs enter buffer 1. A simplified linear model is \[ x_1(k+1) = x_1(k) + u(k) - \alpha x_1(k), \quad x_2(k+1) = x_2(k) + \alpha x_1(k) - \beta x_2(k), \] where \( 0 < \alpha, \beta \le 1 \). (a) Write this in vector form \( \mathbf{x}(k+1) = \mathbf{A}\mathbf{x}(k) + \mathbf{B}u(k) \). (b) For \( \alpha = \beta = 0.5 \), compute the eigenvalues of \( \mathbf{A} \).
Solution:
(a) The state vector is \( \mathbf{x}(k) = [x_1(k), x_2(k)]^\top \). The equations can be written as
\[ \mathbf{x}(k+1) = \begin{bmatrix} 1 - \alpha & 0 \\ \alpha & 1 - \beta \end{bmatrix} \mathbf{x}(k) + \begin{bmatrix} 1 \\ 0 \end{bmatrix} u(k). \]
Thus \( \mathbf{A} = \begin{bmatrix} 1 - \alpha & 0 \\ \alpha & 1 - \beta \end{bmatrix} \), \( \mathbf{B} = [1, 0]^\top \).
(b) With \( \alpha = \beta = 0.5 \), we have \( \mathbf{A} = \begin{bmatrix} 0.5 & 0 \\ 0.5 & 0.5 \end{bmatrix} \). Its characteristic polynomial is
\[ \det(\mathbf{A} - \lambda \mathbf{I}) = \begin{vmatrix} 0.5 - \lambda & 0 \\ 0.5 & 0.5 - \lambda \end{vmatrix} = (0.5 - \lambda)^2. \]
Therefore there is a repeated eigenvalue \( \lambda = 0.5 \). Since \( |\lambda| < 1 \), the homogeneous system (with \( u(k) = 0 \)) is asymptotically stable and WIP will not diverge under bounded inputs.
Problem 4 (Warehouse Station Utilization): A robotic warehouse has a pick station where on average \( \lambda_p = 60 \) orders per hour arrive. The combination of robots and pickers can handle \( \mu_p = 75 \) orders per hour on average. Approximate the utilization \( \rho_p \) and discuss qualitatively what happens if the arrival rate rises to \( 70 \) orders per hour without increasing capacity.
Solution:
Initially,
\[ \rho_p = \frac{\lambda_p}{\mu_p} = \frac{60}{75} = 0.8. \]
This is comfortably below 1, so queues are expected to remain moderate. If the arrival rate increases to \( \lambda_p = 70 \) orders/hour, we have
\[ \rho_p = \frac{70}{75} \approx 0.933. \]
This higher utilization causes a disproportionate increase in waiting time, as seen from M/M/1 formulas where \( W = 1/(\mu - \lambda) \). As \( \lambda \to \mu \), waiting times blow up. Thus, even moderate increases in arrival rate near capacity must be matched by increased robot or human capacity to avoid severe congestion.
Problem 5 (Simulation vs. Analytical Approximation): In the simulation of Section 5 with Bernoulli arrivals of parameter \( \lambda = 0.7 \) and service capacity of 1 job/step, the analytical M/M/1 model with deterministic service time \( T_c = 1 \) predicts utilization \( \rho = 0.7 \) and \( W = 1/(1 - 0.7) = 3.\overline{3} \) steps. Explain why the simulated average queue length and time in system may differ from these values, even with a large number of simulation steps.
Solution:
The M/M/1 model assumes exponential service times and Poisson arrivals. In the simulation, service time is deterministic (one job per step if the queue is nonempty) and arrivals follow a Bernoulli distribution per step, which approximates but does not exactly match a continuous-time Poisson process. Furthermore, the simulation is discrete-time, whereas the M/M/1 formulas are continuous-time.
These modeling differences change the stationary distribution of the queue length and thus the exact values of \( L \) and \( W \). As the number of steps grows, the simulation converges to the true performance of the discrete-time system, which is close to but not identical with the continuous-time M/M/1 predictions. This illustrates why simulation is needed to validate analytical approximations in robotic manufacturing and warehousing.
7. Summary
In this lesson we viewed manufacturing and warehousing systems through the lens of queues and linear flows. We introduced utilization, throughput, cycle time, and WIP as key metrics for robotic workcells, and showed how a single robot can be modeled as a single-server queue with stability condition \( \lambda < \mu \).
We then constructed a simple line-level flow model using discrete-time state equations and highlighted the role of eigenvalues in determining WIP stability. For warehouses, we introduced graph-based route times and connected order arrival rates and station capacities to utilization, emphasizing the nonlinear growth of delays as utilization approaches 1.
Finally, we implemented a small discrete-time simulation of a robotic workcell in Python, C++, Java, and MATLAB, illustrating how the abstract equations can be turned into executable code that estimates performance metrics. These ideas form a foundation for more advanced topics such as scheduling, multi-robot coordination, and detailed discrete-event simulation in later robotics courses.
8. References
- Buzacott, J. A., & Shanthikumar, J. G. (1993). Stochastic models of manufacturing systems. International Journal of Production Research, 31(7), 1533–1573.
- Gershwin, S. B. (1987). An efficient decomposition method for the approximate evaluation of tandem queues with finite storage space and blocking. Operations Research, 35(2), 291–305.
- Hopp, W. J., & Spearman, M. L. (1990). The throughput of constant WIP production lines: Practical analysis and simulation. International Journal of Production Research, 28(7), 1081–1102.
- Muth, J. F. (1979). A Markovian model of a flexible manufacturing system: A theoretical analysis. Management Science, 25(2), 151–166.
- Bartholdi, J. J., & Hackman, S. T. (2014). Warehouse “travel-time” models for warehouse design and control. European Journal of Operational Research, 239(3), 620–630.
- Azaron, A., Katagiri, H., Kato, K., & Sakawa, M. (2008). A multi-objective stochastic programming approach for designing reliable manufacturing systems. European Journal of Operational Research, 189(2), 379–392.
- Chiang, S. Y., & Kuo, C. C. (2002). Performance analysis of automated storage/retrieval systems using discrete-time queuing network models. IEEE Transactions on Robotics and Automation, 18(4), 613–622.
- Kroger, W., Meyer, P., & Scholl, A. (2012). A modeling framework for analyzing the performance of automated guided vehicle systems. Flexible Services and Manufacturing Journal, 24(2), 260–284.