@@ -25,21 +25,19 @@ using systems::System;
25
25
// In the benchmark case instantiations at the bottom of this file, we'll use
26
26
// a bitmask for the case's "Arg" to denote which quantities are in scope as
27
27
// either gradients (for T=AutoDiffXd) or variables (for T=Expression).
28
- constexpr int kWantNoGrad = 0x0 ;
29
- constexpr int kWantGradQ = 0x1 ;
30
- constexpr int kWantGradV = 0x2 ;
31
- constexpr int kWantGradX = kWantGradQ | kWantGradV ;
28
+ constexpr int kWantNoGrad = 0x0 ;
29
+ constexpr int kWantGradQ = 0x1 ;
30
+ constexpr int kWantGradV = 0x2 ;
31
+ constexpr int kWantGradX = kWantGradQ | kWantGradV ;
32
32
constexpr int kWantGradVdot = 0x4 ;
33
- constexpr int kWantGradU = 0x8 ;
33
+ constexpr int kWantGradU = 0x8 ;
34
34
35
35
// Fixture that holds a Cassie robot model and offers helper functions to
36
36
// configure the benchmark case.
37
37
template <typename T>
38
38
class Cassie : public benchmark ::Fixture {
39
39
public:
40
- Cassie () {
41
- tools::performance::AddMinMaxStatistics (this );
42
- }
40
+ Cassie () { tools::performance::AddMinMaxStatistics (this ); }
43
41
44
42
void SetUp (benchmark::State& state) override {
45
43
SetUpNonZeroState ();
@@ -89,24 +87,28 @@ class Cassie : public benchmark::Fixture {
89
87
// those would get computed once and re-used (like in real applications) but
90
88
// with caching off they would get recalculated repeatedly, affecting the
91
89
// timing results.
92
- void InvalidateInput () {
93
- input_.GetMutableData ();
94
- }
95
- void InvalidateState () {
96
- context_->NoteContinuousStateChange ();
97
- }
90
+ void InvalidateInput () { input_.GetMutableData (); }
91
+ void InvalidateState () { context_->NoteContinuousStateChange (); }
98
92
99
93
// Runs the PositionKinematics benchmark.
100
94
// NOLINTNEXTLINE(runtime/references)
101
95
void DoPositionKinematics (benchmark::State& state) {
102
96
DRAKE_DEMAND (want_grad_vdot (state) == false );
103
97
DRAKE_DEMAND (want_grad_u (state) == false );
104
- // A distal body. Asking for pose of one body calculates poses of all
105
- // of them in the PositionKinematicsCache.
106
- const RigidBody<T>& toe_right = plant_->GetBodyByName (" toe_right" );
107
98
for (auto _ : state) {
108
99
InvalidateState ();
109
- plant_->EvalBodyPoseInWorld (*context_, toe_right);
100
+ plant_->EvalPositionKinematics (*context_);
101
+ }
102
+ }
103
+
104
+ // Runs the PositionKinematicsInM benchmark.
105
+ // NOLINTNEXTLINE(runtime/references)
106
+ void DoPositionKinematicsInM (benchmark::State& state) {
107
+ DRAKE_DEMAND (want_grad_vdot (state) == false );
108
+ DRAKE_DEMAND (want_grad_u (state) == false );
109
+ for (auto _ : state) {
110
+ InvalidateState ();
111
+ plant_->EvalPositionKinematicsInM (*context_);
110
112
}
111
113
}
112
114
@@ -115,13 +117,22 @@ class Cassie : public benchmark::Fixture {
115
117
void DoPosAndVelKinematics (benchmark::State& state) {
116
118
DRAKE_DEMAND (want_grad_vdot (state) == false );
117
119
DRAKE_DEMAND (want_grad_u (state) == false );
118
- // A distal body. Asking for kinematics of one body calculates it for all
119
- // of them in the PositionKinematicsCache and VelocityKinematicsCache.
120
- const RigidBody<T>& toe_right = plant_->GetBodyByName (" toe_right" );
121
120
for (auto _ : state) {
122
121
InvalidateState ();
123
122
// This requires both position and velocity kinematics.
124
- plant_->EvalBodySpatialVelocityInWorld (*context_, toe_right);
123
+ plant_->EvalVelocityKinematics (*context_);
124
+ }
125
+ }
126
+
127
+ // Runs the PosAndVelKinematicsInM benchmark.
128
+ // NOLINTNEXTLINE(runtime/references)
129
+ void DoPosAndVelKinematicsInM (benchmark::State& state) {
130
+ DRAKE_DEMAND (want_grad_vdot (state) == false );
131
+ DRAKE_DEMAND (want_grad_u (state) == false );
132
+ for (auto _ : state) {
133
+ InvalidateState ();
134
+ // This requires both position and velocity kinematics.
135
+ plant_->EvalVelocityKinematicsInM (*context_);
125
136
}
126
137
}
127
138
@@ -146,6 +157,17 @@ class Cassie : public benchmark::Fixture {
146
157
}
147
158
}
148
159
160
+ // Runs the InverseDynamicsInM benchmark.
161
+ // NOLINTNEXTLINE(runtime/references)
162
+ void DoInverseDynamicsInM (benchmark::State& state) {
163
+ DRAKE_DEMAND (want_grad_u (state) == false );
164
+ for (auto _ : state) {
165
+ InvalidateState ();
166
+ plant_->CalcInverseDynamicsInM (*context_, desired_vdot_,
167
+ external_forces_);
168
+ }
169
+ }
170
+
149
171
// Runs the ForwardDynamics benchmark.
150
172
// NOLINTNEXTLINE(runtime/references)
151
173
void DoForwardDynamics (benchmark::State& state) {
@@ -201,8 +223,8 @@ void Cassie<T>::SetUpNonZeroState() {
201
223
VectorX<T>::LinSpaced (nq_ + nv_, 0.1 , 0.9 ));
202
224
for (const BodyIndex& index : plant_->GetFloatingBaseBodies ()) {
203
225
const RigidBody<T>& body = plant_->get_body (index);
204
- const RigidTransform<T> pose (
205
- RollPitchYaw<T>( 0.1 , 0.2 , 0.3 ), Vector3<T>(0.4 , 0.5 , 0.6 ));
226
+ const RigidTransform<T> pose (RollPitchYaw<T>( 0.1 , 0.2 , 0.3 ),
227
+ Vector3<T>(0.4 , 0.5 , 0.6 ));
206
228
plant_->SetFreeBodyPose (context_.get (), body, pose);
207
229
}
208
230
@@ -303,6 +325,15 @@ BENCHMARK_REGISTER_F(CassieDouble, PositionKinematics)
303
325
->Unit (benchmark::kMicrosecond )
304
326
->Arg(kWantNoGrad );
305
327
328
+ // NOLINTNEXTLINE(runtime/references)
329
+ BENCHMARK_DEFINE_F (CassieDouble,
330
+ PositionKinematicsInM)(benchmark::State& state) {
331
+ DoPositionKinematicsInM (state);
332
+ }
333
+ BENCHMARK_REGISTER_F (CassieDouble, PositionKinematicsInM)
334
+ ->Unit (benchmark::kMicrosecond )
335
+ ->Arg(kWantNoGrad );
336
+
306
337
// NOLINTNEXTLINE(runtime/references)
307
338
BENCHMARK_DEFINE_F (CassieDouble, PosAndVelKinematics)(benchmark::State& state) {
308
339
DoPosAndVelKinematics (state);
@@ -311,29 +342,46 @@ BENCHMARK_REGISTER_F(CassieDouble, PosAndVelKinematics)
311
342
->Unit (benchmark::kMicrosecond )
312
343
->Arg(kWantNoGrad );
313
344
345
+ // NOLINTNEXTLINE(runtime/references)
346
+ BENCHMARK_DEFINE_F (CassieDouble,
347
+ PosAndVelKinematicsInM)(benchmark::State& state) {
348
+ DoPosAndVelKinematicsInM (state);
349
+ }
350
+ BENCHMARK_REGISTER_F (CassieDouble, PosAndVelKinematicsInM)
351
+ ->Unit (benchmark::kMicrosecond )
352
+ ->Arg(kWantNoGrad );
353
+
314
354
// NOLINTNEXTLINE(runtime/references)
315
355
BENCHMARK_DEFINE_F (CassieDouble, MassMatrix)(benchmark::State& state) {
316
356
DoMassMatrix (state);
317
357
}
318
358
BENCHMARK_REGISTER_F (CassieDouble, MassMatrix)
319
- ->Unit (benchmark::kMicrosecond )
320
- ->Arg(kWantNoGrad );
359
+ ->Unit (benchmark::kMicrosecond )
360
+ ->Arg(kWantNoGrad );
321
361
322
362
// NOLINTNEXTLINE(runtime/references)
323
363
BENCHMARK_DEFINE_F (CassieDouble, InverseDynamics)(benchmark::State& state) {
324
364
DoInverseDynamics (state);
325
365
}
326
366
BENCHMARK_REGISTER_F (CassieDouble, InverseDynamics)
327
- ->Unit (benchmark::kMicrosecond )
328
- ->Arg(kWantNoGrad );
367
+ ->Unit (benchmark::kMicrosecond )
368
+ ->Arg(kWantNoGrad );
369
+
370
+ // NOLINTNEXTLINE(runtime/references)
371
+ BENCHMARK_DEFINE_F (CassieDouble, InverseDynamicsInM)(benchmark::State& state) {
372
+ DoInverseDynamicsInM (state);
373
+ }
374
+ BENCHMARK_REGISTER_F (CassieDouble, InverseDynamicsInM)
375
+ ->Unit (benchmark::kMicrosecond )
376
+ ->Arg(kWantNoGrad );
329
377
330
378
// NOLINTNEXTLINE(runtime/references)
331
379
BENCHMARK_DEFINE_F (CassieDouble, ForwardDynamics)(benchmark::State& state) {
332
380
DoForwardDynamics (state);
333
381
}
334
382
BENCHMARK_REGISTER_F (CassieDouble, ForwardDynamics)
335
- ->Unit (benchmark::kMicrosecond )
336
- ->Arg(kWantNoGrad );
383
+ ->Unit (benchmark::kMicrosecond )
384
+ ->Arg(kWantNoGrad );
337
385
338
386
BENCHMARK_DEFINE_F (CassieAutoDiff, PositionKinematics)
339
387
// NOLINTNEXTLINE(runtime/references)
@@ -362,41 +410,57 @@ BENCHMARK_DEFINE_F(CassieAutoDiff, MassMatrix)(benchmark::State& state) {
362
410
DoMassMatrix (state);
363
411
}
364
412
BENCHMARK_REGISTER_F (CassieAutoDiff, MassMatrix)
365
- ->Unit (benchmark::kMicrosecond )
366
- ->Arg(kWantNoGrad )
367
- ->Arg(kWantGradQ )
368
- ->Arg(kWantGradV )
369
- ->Arg(kWantGradX );
413
+ ->Unit (benchmark::kMicrosecond )
414
+ ->Arg(kWantNoGrad )
415
+ ->Arg(kWantGradQ )
416
+ ->Arg(kWantGradV )
417
+ ->Arg(kWantGradX );
370
418
371
419
// NOLINTNEXTLINE(runtime/references)
372
420
BENCHMARK_DEFINE_F (CassieAutoDiff, InverseDynamics)(benchmark::State& state) {
373
421
DoInverseDynamics (state);
374
422
}
375
423
BENCHMARK_REGISTER_F (CassieAutoDiff, InverseDynamics)
376
- ->Unit (benchmark::kMicrosecond )
377
- ->Arg(kWantNoGrad )
378
- ->Arg(kWantGradQ )
379
- ->Arg(kWantGradV )
380
- ->Arg(kWantGradX )
381
- ->Arg(kWantGradVdot )
382
- ->Arg(kWantGradQ |kWantGradVdot )
383
- ->Arg(kWantGradV |kWantGradVdot )
384
- ->Arg(kWantGradX |kWantGradVdot );
424
+ ->Unit (benchmark::kMicrosecond )
425
+ ->Arg(kWantNoGrad )
426
+ ->Arg(kWantGradQ )
427
+ ->Arg(kWantGradV )
428
+ ->Arg(kWantGradX )
429
+ ->Arg(kWantGradVdot )
430
+ ->Arg(kWantGradQ | kWantGradVdot )
431
+ ->Arg(kWantGradV | kWantGradVdot )
432
+ ->Arg(kWantGradX | kWantGradVdot );
433
+
434
+ BENCHMARK_DEFINE_F (CassieAutoDiff, InverseDynamicsInM)
435
+ // NOLINTNEXTLINE(runtime/references)
436
+ (benchmark::State& state) {
437
+ DoInverseDynamicsInM (state);
438
+ }
439
+ BENCHMARK_REGISTER_F (CassieAutoDiff, InverseDynamicsInM)
440
+ ->Unit (benchmark::kMicrosecond )
441
+ ->Arg(kWantNoGrad )
442
+ ->Arg(kWantGradQ )
443
+ ->Arg(kWantGradV )
444
+ ->Arg(kWantGradX )
445
+ ->Arg(kWantGradVdot )
446
+ ->Arg(kWantGradQ | kWantGradVdot )
447
+ ->Arg(kWantGradV | kWantGradVdot )
448
+ ->Arg(kWantGradX | kWantGradVdot );
385
449
386
450
// NOLINTNEXTLINE(runtime/references)
387
451
BENCHMARK_DEFINE_F (CassieAutoDiff, ForwardDynamics)(benchmark::State& state) {
388
452
DoForwardDynamics (state);
389
453
}
390
454
BENCHMARK_REGISTER_F (CassieAutoDiff, ForwardDynamics)
391
- ->Unit (benchmark::kMicrosecond )
392
- ->Arg(kWantNoGrad )
393
- ->Arg(kWantGradQ )
394
- ->Arg(kWantGradV )
395
- ->Arg(kWantGradX )
396
- ->Arg(kWantGradU )
397
- ->Arg(kWantGradQ | kWantGradU )
398
- ->Arg(kWantGradV | kWantGradU )
399
- ->Arg(kWantGradX | kWantGradU );
455
+ ->Unit (benchmark::kMicrosecond )
456
+ ->Arg(kWantNoGrad )
457
+ ->Arg(kWantGradQ )
458
+ ->Arg(kWantGradV )
459
+ ->Arg(kWantGradX )
460
+ ->Arg(kWantGradU )
461
+ ->Arg(kWantGradQ | kWantGradU )
462
+ ->Arg(kWantGradV | kWantGradU )
463
+ ->Arg(kWantGradX | kWantGradU );
400
464
401
465
BENCHMARK_DEFINE_F (CassieExpression, PositionKinematics)
402
466
// NOLINTNEXTLINE(runtime/references)
@@ -425,38 +489,38 @@ BENCHMARK_DEFINE_F(CassieExpression, MassMatrix)(benchmark::State& state) {
425
489
DoMassMatrix (state);
426
490
}
427
491
BENCHMARK_REGISTER_F (CassieExpression, MassMatrix)
428
- ->Unit (benchmark::kMicrosecond )
429
- ->Arg(kWantNoGrad )
430
- ->Arg(kWantGradQ )
431
- ->Arg(kWantGradV )
432
- ->Arg(kWantGradX );
492
+ ->Unit (benchmark::kMicrosecond )
493
+ ->Arg(kWantNoGrad )
494
+ ->Arg(kWantGradQ )
495
+ ->Arg(kWantGradV )
496
+ ->Arg(kWantGradX );
433
497
434
498
// NOLINTNEXTLINE(runtime/references)
435
499
BENCHMARK_DEFINE_F (CassieExpression, InverseDynamics)(benchmark::State& state) {
436
500
DoInverseDynamics (state);
437
501
}
438
502
BENCHMARK_REGISTER_F (CassieExpression, InverseDynamics)
439
- ->Unit (benchmark::kMicrosecond )
440
- ->Arg(kWantNoGrad )
441
- ->Arg(kWantGradQ )
442
- ->Arg(kWantGradV )
443
- ->Arg(kWantGradX )
444
- ->Arg(kWantGradVdot )
445
- ->Arg(kWantGradQ | kWantGradVdot )
446
- ->Arg(kWantGradV | kWantGradVdot )
447
- ->Arg(kWantGradX | kWantGradVdot );
503
+ ->Unit (benchmark::kMicrosecond )
504
+ ->Arg(kWantNoGrad )
505
+ ->Arg(kWantGradQ )
506
+ ->Arg(kWantGradV )
507
+ ->Arg(kWantGradX )
508
+ ->Arg(kWantGradVdot )
509
+ ->Arg(kWantGradQ | kWantGradVdot )
510
+ ->Arg(kWantGradV | kWantGradVdot )
511
+ ->Arg(kWantGradX | kWantGradVdot );
448
512
449
513
// NOLINTNEXTLINE(runtime/references)
450
514
BENCHMARK_DEFINE_F (CassieExpression, ForwardDynamics)(benchmark::State& state) {
451
515
DoForwardDynamics (state);
452
516
}
453
517
BENCHMARK_REGISTER_F (CassieExpression, ForwardDynamics)
454
- ->Unit (benchmark::kMicrosecond )
455
- ->Arg(kWantNoGrad )
456
- // N.B. MbP does not support forward dynamics with Variables in 'q'.
457
- ->Arg(kWantGradV )
458
- ->Arg(kWantGradU )
459
- ->Arg(kWantGradV | kWantGradU );
518
+ ->Unit (benchmark::kMicrosecond )
519
+ ->Arg(kWantNoGrad )
520
+ // N.B. MbP does not support forward dynamics with Variables in 'q'.
521
+ ->Arg(kWantGradV )
522
+ ->Arg(kWantGradU )
523
+ ->Arg(kWantGradV | kWantGradU );
460
524
461
525
} // namespace
462
526
} // namespace multibody
0 commit comments