@@ -219,6 +219,8 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
219219 a->Visit (DRAKE_NVP (workspace_limits));
220220 a->Visit (DRAKE_NVP (workspace_margins));
221221
222+ DRAKE_ASSERT (num_friction_directions.has_value ());
223+
222224 // Set a few parameters based on num_contacts_index, differentiating between
223225 // for C3 solve and for C3 cost computation.
224226 resolve_contacts_to = resolve_contacts_to_lists[num_contacts_index];
@@ -239,12 +241,12 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
239241 num_contacts_for_cost =
240242 std::accumulate (resolve_contacts_to_for_cost.begin (),
241243 resolve_contacts_to_for_cost.end (), 0 );
242- mu. clear ();
244+ mu = std::vector< double > ();
243245 for (size_t i = 0 ; i < mu_per_pair_type.size (); ++i) {
244246 int repeat = resolve_contacts_to_lists[num_contacts_index][i];
245- mu.insert (mu.end (), repeat, mu_per_pair_type[i]);
247+ mu.value (). insert (mu. value () .end (), repeat, mu_per_pair_type[i]);
246248 }
247- mu_for_cost. clear ();
249+ mu_for_cost = std::vector< double > ();
248250 for (size_t i = 0 ; i < mu_per_pair_type.size (); ++i) {
249251 int repeat = resolve_contacts_to_lists[num_contacts_index_for_cost][i];
250252 mu_for_cost.insert (mu_for_cost.end (), repeat, mu_per_pair_type[i]);
@@ -254,12 +256,12 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
254256 std::tie (num_planar_contacts, num_friction_directions_per_contact) =
255257 ProcessPlanarContactInformation (resolve_as_planar_contacts_list,
256258 resolve_contacts_to,
257- num_friction_directions);
259+ num_friction_directions. value () );
258260 std::tie (num_planar_contacts_cost,
259261 num_friction_directions_per_contact_for_cost) =
260262 ProcessPlanarContactInformation (resolve_as_planar_contacts_list,
261263 resolve_contacts_to_for_cost,
262- num_friction_directions);
264+ num_friction_directions. value () );
263265
264266 for (size_t i = 0 ; i < num_contacts; ++i) {
265267 starting_index_per_contact_in_lambda_t_vector.push_back (
@@ -274,11 +276,11 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
274276 num_friction_directions_per_contact_for_cost.begin () + i, 0 ));
275277 }
276278
277- n_lambda_with_tangential =
278- 2 * num_friction_directions * (num_contacts - num_planar_contacts) +
279- 2 * num_planar_contacts;
279+ n_lambda_with_tangential = 2 * num_friction_directions. value () *
280+ (num_contacts - num_planar_contacts) +
281+ 2 * num_planar_contacts;
280282 n_lambda_with_tangential_cost =
281- 2 * num_friction_directions *
283+ 2 * num_friction_directions. value () *
282284 (num_contacts_for_cost - num_planar_contacts_cost) +
283285 2 * num_planar_contacts_cost;
284286
@@ -400,14 +402,16 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
400402 c3_options->M = M;
401403 c3_options->qp_projection_alpha = qp_projection_alpha;
402404 c3_options->qp_projection_scaling = qp_projection_scaling;
405+ c3_options->final_augmented_cost_scaling = final_augmented_cost_scaling;
403406
404407 lcs_factory_options->contact_model = contact_model;
405408 lcs_factory_options->num_contacts = num_contacts;
406409 lcs_factory_options->num_friction_directions = num_friction_directions;
407410 lcs_factory_options->spring_stiffness = 0 ; // not used in sampling C3
408411 lcs_factory_options->mu = mu;
409412 lcs_factory_options->N = N;
410- lcs_factory_options->num_friction_directions_per_contact = num_friction_directions_per_contact;
413+ lcs_factory_options->num_friction_directions_per_contact =
414+ num_friction_directions_per_contact;
411415 }
412416
413417 void SetPositionTrackingOptions (
@@ -446,6 +450,7 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
446450 c3_options->u_eta = u_eta_position_list[num_contacts_index];
447451 }
448452
453+ MakePlanarLambdaCost (c3_options, lcs_factory_options);
449454 PopulateCostMatricesFromVectors (c3_options);
450455 }
451456
@@ -485,94 +490,61 @@ struct SamplingC3Options : C3Options, LCSFactoryOptions {
485490 c3_options->u_eta = u_eta_list[num_contacts_index];
486491 }
487492
488- MakePlanarLambdaCost (c3_options);
493+ MakePlanarLambdaCost (c3_options, lcs_factory_options );
489494 PopulateCostMatricesFromVectors (c3_options);
490495 }
491496
492- void SetPoseTrackingOptions (C3Options* options) const {
493- options->dt = planning_dt_pose;
494- options->dt_cost = planning_dt_pose / lcs_dt_resolution;
495- options->w_Q = w_Q;
496- options->w_R = w_R;
497- options->w_G = w_G;
498- options->w_U = w_U;
499- options->q_vector = q_vector;
500- options->r_vector = r_vector;
501-
502- options->g_x = g_x;
503- options->g_gamma = g_gamma_list[num_contacts_index];
504- options->g_lambda_n = g_lambda_n_list[num_contacts_index];
505- options->g_lambda_t = g_lambda_t_list[num_contacts_index];
506- options->g_lambda = g_lambda_list[num_contacts_index];
507- options->g_u = g_u;
508-
509- options->u_x = u_x;
510- options->u_gamma = u_gamma_list[num_contacts_index];
511- options->u_lambda_n = u_lambda_n_list[num_contacts_index];
512- options->u_lambda_t = u_lambda_t_list[num_contacts_index];
513- options->u_lambda = u_lambda_list[num_contacts_index];
514- options->u_u = u_u;
515-
516- if (options->projection_type == " C3+" ) {
517- options->g_eta_slack = g_eta_slack_list[num_contacts_index];
518- options->g_eta_n = g_eta_n_list[num_contacts_index];
519- options->g_eta_t = g_eta_t_list[num_contacts_index];
520- options->g_eta = g_eta_list[num_contacts_index];
521- options->u_eta_slack = u_eta_slack_list[num_contacts_index];
522- options->u_eta_n = u_eta_n_list[num_contacts_index];
523- options->u_eta_t = u_eta_t_list[num_contacts_index];
524- options->u_eta = u_eta_list[num_contacts_index];
525- }
526- MakePlanarLambdaCost (options);
527- PopulateCostMatricesFromVectors (options);
528- }
529-
530497 // Convert lambda weights to the planar form:
531- void MakePlanarLambdaCost (C3Options* options) const {
498+ void MakePlanarLambdaCost (C3Options* c3_options,
499+ LCSFactoryOptions* lcs_factory_options) const {
532500 int offset = 0 ;
533501 for (size_t i = 0 ; i < resolve_contacts_to_lists[num_contacts_index].size ();
534502 ++i) {
535503 if (resolve_as_planar_contacts_list[i]) {
536504 int erase_start_index_for_lambda =
537- 2 * num_friction_directions *
505+ 2 * num_friction_directions. value () *
538506 std::accumulate (
539507 resolve_contacts_to_lists[num_contacts_index].begin (),
540508 resolve_contacts_to_lists[num_contacts_index].begin () + i,
541509 0 ) -
542510 offset;
543511 int erase_end_index_for_lambda =
544512 erase_start_index_for_lambda +
545- 2 * (num_friction_directions - 1 ) *
513+ 2 * (num_friction_directions. value () - 1 ) *
546514 resolve_contacts_to_lists[num_contacts_index][i];
547515
548- options->g_lambda .erase (
549- options->g_lambda .begin () + erase_start_index_for_lambda,
550- options->g_lambda .begin () + erase_end_index_for_lambda);
551- options->u_lambda .erase (
552- options->u_lambda .begin () + erase_start_index_for_lambda,
553- options->u_lambda .begin () + erase_end_index_for_lambda);
554- options->g_lambda_t .erase (
555- options->g_lambda_t .begin () + erase_start_index_for_lambda,
556- options->g_lambda_t .begin () + erase_end_index_for_lambda);
557- options->u_lambda_t .erase (
558- options->u_lambda_t .begin () + erase_start_index_for_lambda,
559- options->u_lambda_t .begin () + erase_end_index_for_lambda);
560-
561- if (options->projection_type == " C3+" ) {
562- options->g_eta .erase (
563- options->g_eta .begin () + erase_start_index_for_lambda,
564- options->g_eta .begin () + erase_end_index_for_lambda);
565- options->u_eta .erase (
566- options->u_eta .begin () + erase_start_index_for_lambda,
567- options->u_eta .begin () + erase_end_index_for_lambda);
568- options->g_eta_t .erase (
569- options->g_eta_t .begin () + erase_start_index_for_lambda,
570- options->g_eta_t .begin () + erase_end_index_for_lambda);
571- options->u_eta_t .erase (
572- options->u_eta_t .begin () + erase_start_index_for_lambda,
573- options->u_eta_t .begin () + erase_end_index_for_lambda);
516+ c3_options->g_lambda .erase (
517+ c3_options->g_lambda .begin () + erase_start_index_for_lambda,
518+ c3_options->g_lambda .begin () + erase_end_index_for_lambda);
519+ c3_options->u_lambda .erase (
520+ c3_options->u_lambda .begin () + erase_start_index_for_lambda,
521+ c3_options->u_lambda .begin () + erase_end_index_for_lambda);
522+ c3_options->g_lambda_t .erase (
523+ c3_options->g_lambda_t .begin () + erase_start_index_for_lambda,
524+ c3_options->g_lambda_t .begin () + erase_end_index_for_lambda);
525+ c3_options->u_lambda_t .erase (
526+ c3_options->u_lambda_t .begin () + erase_start_index_for_lambda,
527+ c3_options->u_lambda_t .begin () + erase_end_index_for_lambda);
528+
529+ if (projection_type == " C3+" ) {
530+ DRAKE_ASSERT (c3_options->g_eta .has_value ());
531+ auto & g_eta = c3_options->g_eta .value ();
532+ DRAKE_ASSERT (c3_options->u_eta .has_value ());
533+ auto & u_eta = c3_options->u_eta .value ();
534+ DRAKE_ASSERT (c3_options->g_eta_t .has_value ());
535+ auto & g_eta_t = c3_options->g_eta_t .value ();
536+ DRAKE_ASSERT (c3_options->u_eta_t .has_value ());
537+ auto & u_eta_t = c3_options->u_eta_t .value ();
538+ g_eta.erase (g_eta.begin () + erase_start_index_for_lambda,
539+ g_eta.begin () + erase_end_index_for_lambda);
540+ u_eta.erase (u_eta.begin () + erase_start_index_for_lambda,
541+ u_eta.begin () + erase_end_index_for_lambda);
542+ g_eta_t .erase (g_eta_t .begin () + erase_start_index_for_lambda,
543+ g_eta_t .begin () + erase_end_index_for_lambda);
544+ u_eta_t .erase (u_eta_t .begin () + erase_start_index_for_lambda,
545+ u_eta_t .begin () + erase_end_index_for_lambda);
574546 }
575- offset += 2 * (num_friction_directions - 1 ) *
547+ offset += 2 * (num_friction_directions. value () - 1 ) *
576548 resolve_contacts_to_lists[num_contacts_index][i];
577549 }
578550 }
0 commit comments