placo 0.5.9__tar.gz → 0.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of placo might be problematic. Click here for more details.

Files changed (167) hide show
  1. placo-0.6.0/PKG-INFO +56 -0
  2. placo-0.6.0/README.md +34 -0
  3. {placo-0.5.9 → placo-0.6.0}/bindings/expose-dynamics.cpp +20 -1
  4. {placo-0.5.9 → placo-0.6.0}/bindings/expose-kinematics.cpp +1 -0
  5. {placo-0.5.9 → placo-0.6.0}/bindings/expose-problem.cpp +5 -1
  6. {placo-0.5.9 → placo-0.6.0}/bindings/expose-robot-wrapper.cpp +2 -0
  7. {placo-0.5.9 → placo-0.6.0}/placo.pyi +210 -8
  8. {placo-0.5.9 → placo-0.6.0}/pyproject.toml +1 -1
  9. {placo-0.5.9 → placo-0.6.0}/python/placo_utils/visualization.py +18 -1
  10. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/avoid_self_collisions_constraint.cpp +3 -11
  11. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/contacts.cpp +94 -5
  12. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/contacts.h +49 -0
  13. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/dynamics_solver.cpp +14 -19
  14. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/dynamics_solver.h +14 -0
  15. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/joints_task.cpp +10 -0
  16. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/joints_task.h +7 -0
  17. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/joints_task.cpp +10 -0
  18. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/joints_task.h +7 -0
  19. {placo-0.5.9 → placo-0.6.0}/src/placo/model/robot_wrapper.cpp +10 -0
  20. {placo-0.5.9 → placo-0.6.0}/src/placo/model/robot_wrapper.h +10 -0
  21. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/expression.cpp +34 -5
  22. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/expression.h +8 -1
  23. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/problem.cpp +1 -3
  24. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/problem.h +5 -0
  25. placo-0.5.9/PKG-INFO +0 -25
  26. placo-0.5.9/README.md +0 -3
  27. {placo-0.5.9 → placo-0.6.0}/.clang-format +0 -0
  28. {placo-0.5.9 → placo-0.6.0}/.gitattributes +0 -0
  29. {placo-0.5.9 → placo-0.6.0}/.gitignore +0 -0
  30. {placo-0.5.9 → placo-0.6.0}/.readthedocs.yaml +0 -0
  31. {placo-0.5.9 → placo-0.6.0}/CMakeLists.txt +0 -0
  32. {placo-0.5.9 → placo-0.6.0}/Doxyfile +0 -0
  33. {placo-0.5.9 → placo-0.6.0}/LICENSE +0 -0
  34. {placo-0.5.9 → placo-0.6.0}/Makefile +0 -0
  35. {placo-0.5.9 → placo-0.6.0}/bindings/expose-eigen.cpp +0 -0
  36. {placo-0.5.9 → placo-0.6.0}/bindings/expose-footsteps.cpp +0 -0
  37. {placo-0.5.9 → placo-0.6.0}/bindings/expose-parameters.cpp +0 -0
  38. {placo-0.5.9 → placo-0.6.0}/bindings/expose-tools.cpp +0 -0
  39. {placo-0.5.9 → placo-0.6.0}/bindings/expose-utils.hpp +0 -0
  40. {placo-0.5.9 → placo-0.6.0}/bindings/expose-walk-pattern-generator.cpp +0 -0
  41. {placo-0.5.9 → placo-0.6.0}/bindings/module.cpp +0 -0
  42. {placo-0.5.9 → placo-0.6.0}/bindings/module.h +0 -0
  43. {placo-0.5.9 → placo-0.6.0}/bindings/registry.cpp +0 -0
  44. {placo-0.5.9 → placo-0.6.0}/bindings/registry.h +0 -0
  45. {placo-0.5.9 → placo-0.6.0}/doxygen_parse.py +0 -0
  46. {placo-0.5.9 → placo-0.6.0}/python/.vscode/settings.json +0 -0
  47. {placo-0.5.9 → placo-0.6.0}/python/Makefile +0 -0
  48. {placo-0.5.9 → placo-0.6.0}/python/placo_utils/__init__.py +0 -0
  49. {placo-0.5.9 → placo-0.6.0}/python/placo_utils/tf.py +0 -0
  50. {placo-0.5.9 → placo-0.6.0}/python/placo_utils/view.py +0 -0
  51. {placo-0.5.9 → placo-0.6.0}/python/run_tests.sh +0 -0
  52. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/avoid_self_collisions_constraint.h +0 -0
  53. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/com_task.cpp +0 -0
  54. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/com_task.h +0 -0
  55. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/constraint.cpp +0 -0
  56. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/constraint.h +0 -0
  57. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/frame_task.cpp +0 -0
  58. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/frame_task.h +0 -0
  59. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/gear_task.cpp +0 -0
  60. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/gear_task.h +0 -0
  61. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/orientation_task.cpp +0 -0
  62. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/orientation_task.h +0 -0
  63. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/position_task.cpp +0 -0
  64. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/position_task.h +0 -0
  65. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_frame_task.cpp +0 -0
  66. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_frame_task.h +0 -0
  67. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_orientation_task.cpp +0 -0
  68. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_orientation_task.h +0 -0
  69. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_position_task.cpp +0 -0
  70. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/relative_position_task.h +0 -0
  71. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/task.cpp +0 -0
  72. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/task.h +0 -0
  73. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/torque_task.cpp +0 -0
  74. {placo-0.5.9 → placo-0.6.0}/src/placo/dynamics/torque_task.h +0 -0
  75. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/foot_trajectory.cpp +0 -0
  76. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/foot_trajectory.h +0 -0
  77. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner.cpp +0 -0
  78. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner.h +0 -0
  79. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner_naive.cpp +0 -0
  80. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner_naive.h +0 -0
  81. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner_repetitive.cpp +0 -0
  82. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/footsteps_planner_repetitive.h +0 -0
  83. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/humanoid_parameters.cpp +0 -0
  84. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/humanoid_parameters.h +0 -0
  85. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/humanoid_robot.cpp +0 -0
  86. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/humanoid_robot.h +0 -0
  87. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/kick.cpp +0 -0
  88. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/kick.h +0 -0
  89. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/lipm.cpp +0 -0
  90. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/lipm.h +0 -0
  91. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot.cpp +0 -0
  92. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot.h +0 -0
  93. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot_cubic.cpp +0 -0
  94. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot_cubic.h +0 -0
  95. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot_quintic.cpp +0 -0
  96. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/swing_foot_quintic.h +0 -0
  97. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/walk_pattern_generator.cpp +0 -0
  98. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/walk_pattern_generator.h +0 -0
  99. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/walk_tasks.cpp +0 -0
  100. {placo-0.5.9 → placo-0.6.0}/src/placo/humanoid/walk_tasks.h +0 -0
  101. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/avoid_self_collisions_constraint.cpp +0 -0
  102. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/avoid_self_collisions_constraint.h +0 -0
  103. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/axis_align_task.cpp +0 -0
  104. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/axis_align_task.h +0 -0
  105. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/centroidal_momentum_task.cpp +0 -0
  106. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/centroidal_momentum_task.h +0 -0
  107. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/com_polygon_constraint.cpp +0 -0
  108. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/com_polygon_constraint.h +0 -0
  109. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/com_task.cpp +0 -0
  110. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/com_task.h +0 -0
  111. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/cone_constraint.cpp +0 -0
  112. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/cone_constraint.h +0 -0
  113. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/constraint.cpp +0 -0
  114. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/constraint.h +0 -0
  115. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/distance_task.cpp +0 -0
  116. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/distance_task.h +0 -0
  117. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/frame_task.cpp +0 -0
  118. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/frame_task.h +0 -0
  119. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/gear_task.cpp +0 -0
  120. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/gear_task.h +0 -0
  121. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/kinematics_solver.cpp +0 -0
  122. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/kinematics_solver.h +0 -0
  123. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/kinetic_energy_regularization_task.cpp +0 -0
  124. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/kinetic_energy_regularization_task.h +0 -0
  125. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/manipulability_task.cpp +0 -0
  126. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/manipulability_task.h +0 -0
  127. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/orientation_task.cpp +0 -0
  128. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/orientation_task.h +0 -0
  129. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/position_task.cpp +0 -0
  130. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/position_task.h +0 -0
  131. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/regularization_task.cpp +0 -0
  132. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/regularization_task.h +0 -0
  133. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_frame_task.cpp +0 -0
  134. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_frame_task.h +0 -0
  135. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_orientation_task.cpp +0 -0
  136. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_orientation_task.h +0 -0
  137. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_position_task.cpp +0 -0
  138. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/relative_position_task.h +0 -0
  139. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/task.cpp +0 -0
  140. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/task.h +0 -0
  141. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/wheel_task.cpp +0 -0
  142. {placo-0.5.9 → placo-0.6.0}/src/placo/kinematics/wheel_task.h +0 -0
  143. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/constraint.cpp +0 -0
  144. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/constraint.h +0 -0
  145. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/integrator.cpp +0 -0
  146. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/integrator.h +0 -0
  147. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/polygon_constraint.cpp +0 -0
  148. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/polygon_constraint.h +0 -0
  149. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/qp_error.cpp +0 -0
  150. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/qp_error.h +0 -0
  151. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/sparsity.cpp +0 -0
  152. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/sparsity.h +0 -0
  153. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/variable.cpp +0 -0
  154. {placo-0.5.9 → placo-0.6.0}/src/placo/problem/variable.h +0 -0
  155. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/axises_mask.cpp +0 -0
  156. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/axises_mask.h +0 -0
  157. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/cubic_spline.cpp +0 -0
  158. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/cubic_spline.h +0 -0
  159. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/cubic_spline_3d.cpp +0 -0
  160. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/cubic_spline_3d.h +0 -0
  161. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/prioritized.cpp +0 -0
  162. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/prioritized.h +0 -0
  163. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/utils.cpp +0 -0
  164. {placo-0.5.9 → placo-0.6.0}/src/placo/tools/utils.h +0 -0
  165. {placo-0.5.9 → placo-0.6.0}/stubs.py +0 -0
  166. {placo-0.5.9 → placo-0.6.0}/tweak_sdist.sh +0 -0
  167. {placo-0.5.9 → placo-0.6.0}/wks.yml +0 -0
placo-0.6.0/PKG-INFO ADDED
@@ -0,0 +1,56 @@
1
+ Metadata-Version: 2.1
2
+ Name: placo
3
+ Version: 0.6.0
4
+ Summary: PlaCo: Rhoban Planning and Control
5
+ Requires-Python: >= 3.8
6
+ License-Expression: MIT
7
+ Author-email: Rhoban team <team@rhoban.com>
8
+ Project-URL: Changelog, https://github.com/rhoban/placo/blob/main/CHANGELOG.md
9
+ Home-page: https://placo.readthedocs.io/en/latest/
10
+ Project-URL: Repository, https://github.com/rhoban/placo.git
11
+ Requires-Dist: cmeel
12
+ Requires-Dist: eiquadprog >= 1.2.6, < 2
13
+ Requires-Dist: pin >= 2.6.18, < 3
14
+ Requires-Dist: rhoban-cmeel-jsoncpp
15
+ Requires-Dist: meshcat
16
+ Requires-Dist: numpy<2
17
+ Requires-Dist: ischedule
18
+ Provides-Extra: build
19
+ Requires-Dist: pin[build] >= 2.6.18, < 3 ; extra == "build"
20
+ Requires-Dist: cmeel-urdfdom[build] ; extra == "build"
21
+ Description-Content-Type: text/markdown
22
+
23
+ # PlaCo
24
+
25
+ PlaCo is Rhoban's planning and control library.
26
+ Its main features are:
27
+
28
+ * Task-space Inverse Kinematics with constraints,
29
+ * Task-space Inverse Dynamics with constraints,
30
+ * QP problem formulation,
31
+ * Built on the top of [pinocchio](https://github.com/stack-of-tasks/pinocchio)
32
+ * Written in C++ with Python bindings
33
+
34
+ [![Megabot demo](https://github.com/Rhoban/placo-examples/blob/master/kinematics/videos/quadruped_targets.gif?raw=true)](https://github.com/Rhoban/placo-examples/blob/master/kinematics/videos/quadruped_targets.mp4?raw=true)
35
+
36
+ *Inverse Kinematics Example: a quadruped robot hitting targets with a leg while keeping its three legs on the ground*
37
+
38
+ [source code (quadruped_targets.py)](https://github.com/Rhoban/placo-examples/blob/master/kinematics/quadruped_targets.py) / [more kinematics examples](https://placo.readthedocs.io/en/latest/kinematics/examples_gallery.html)
39
+
40
+ [![Megabot demo](https://github.com/Rhoban/placo-examples/blob/master/dynamics/videos/megabot.gif?raw=true)](https://github.com/Rhoban/placo-examples/blob/master/dynamics/videos/megabot.mp4?raw=true)
41
+
42
+ *Inverse Dynamics Example: a quadruped with many loop closure joints*
43
+
44
+ [source code (megabot.py)](https://github.com/Rhoban/placo-examples/blob/master/dynamics/megabot.py) / [more dynamics examples](https://placo.readthedocs.io/en/latest/dynamics/examples_gallery.html)
45
+
46
+ ## Installing
47
+
48
+ PlaCo is available from [pip](https://placo.readthedocs.io/en/latest/basics/installation_pip.html),
49
+ or can be [built from sources](https://placo.readthedocs.io/en/latest/basics/installation_source.html).
50
+
51
+ ## Documentation
52
+
53
+ Here is the [official documentation](https://placo.readthedocs.io/en/latest/)
54
+
55
+ You can also find many examples in the [placo-examples](https://github.com/rhoban/placo-examples)
56
+ repository.
placo-0.6.0/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # PlaCo
2
+
3
+ PlaCo is Rhoban's planning and control library.
4
+ Its main features are:
5
+
6
+ * Task-space Inverse Kinematics with constraints,
7
+ * Task-space Inverse Dynamics with constraints,
8
+ * QP problem formulation,
9
+ * Built on the top of [pinocchio](https://github.com/stack-of-tasks/pinocchio)
10
+ * Written in C++ with Python bindings
11
+
12
+ [![Megabot demo](https://github.com/Rhoban/placo-examples/blob/master/kinematics/videos/quadruped_targets.gif?raw=true)](https://github.com/Rhoban/placo-examples/blob/master/kinematics/videos/quadruped_targets.mp4?raw=true)
13
+
14
+ *Inverse Kinematics Example: a quadruped robot hitting targets with a leg while keeping its three legs on the ground*
15
+
16
+ [source code (quadruped_targets.py)](https://github.com/Rhoban/placo-examples/blob/master/kinematics/quadruped_targets.py) / [more kinematics examples](https://placo.readthedocs.io/en/latest/kinematics/examples_gallery.html)
17
+
18
+ [![Megabot demo](https://github.com/Rhoban/placo-examples/blob/master/dynamics/videos/megabot.gif?raw=true)](https://github.com/Rhoban/placo-examples/blob/master/dynamics/videos/megabot.mp4?raw=true)
19
+
20
+ *Inverse Dynamics Example: a quadruped with many loop closure joints*
21
+
22
+ [source code (megabot.py)](https://github.com/Rhoban/placo-examples/blob/master/dynamics/megabot.py) / [more dynamics examples](https://placo.readthedocs.io/en/latest/dynamics/examples_gallery.html)
23
+
24
+ ## Installing
25
+
26
+ PlaCo is available from [pip](https://placo.readthedocs.io/en/latest/basics/installation_pip.html),
27
+ or can be [built from sources](https://placo.readthedocs.io/en/latest/basics/installation_source.html).
28
+
29
+ ## Documentation
30
+
31
+ Here is the [official documentation](https://placo.readthedocs.io/en/latest/)
32
+
33
+ You can also find many examples in the [placo-examples](https://github.com/rhoban/placo-examples)
34
+ repository.
@@ -13,6 +13,7 @@ using namespace placo::dynamics;
13
13
  using namespace placo::model;
14
14
 
15
15
  // Overloads
16
+ BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(frame_configure_overloads, configure, 2, 4);
16
17
  BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(solve_overloads, solve, 0, 1);
17
18
  BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(set_torque_overloads, set_torque, 2, 4);
18
19
  BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(set_joint_overloads, set_joint, 2, 4);
@@ -43,6 +44,7 @@ void exposeDynamics()
43
44
  .def_readwrite("active", &Contact::active)
44
45
  .def_readwrite("mu", &Contact::mu)
45
46
  .def_readwrite("weight_forces", &Contact::weight_forces)
47
+ .def_readwrite("weight_tangentials", &Contact::weight_tangentials)
46
48
  .def_readwrite("weight_moments", &Contact::weight_moments)
47
49
  .add_property(
48
50
  "wrench", +[](Contact& contact) { return contact.wrench; });
@@ -68,6 +70,20 @@ void exposeDynamics()
68
70
  .def_readwrite("width", &Contact6D::width)
69
71
  .def("zmp", &Contact6D::zmp);
70
72
 
73
+ class__<LineContact, bases<Contact>>("LineContact", init<FrameTask&, bool>())
74
+ .def(
75
+ "position_task", +[](LineContact& contact) -> PositionTask& { return *contact.position_task; },
76
+ return_internal_reference<>())
77
+ .def(
78
+ "orientation_task", +[](LineContact& contact) -> OrientationTask& { return *contact.orientation_task; },
79
+ return_internal_reference<>())
80
+ .def_readwrite("unilateral", &LineContact::unilateral)
81
+ .def_readwrite("length", &LineContact::length)
82
+ .def("zmp", &LineContact::zmp)
83
+ .add_property(
84
+ "R_world_surface", +[](PointContact& contact) { return contact.R_world_surface; },
85
+ +[](PointContact& contact, Eigen::Matrix3d R) { contact.R_world_surface = R; });
86
+
71
87
  class__<ExternalWrenchContact, bases<Contact>>("ExternalWrenchContact", init<RobotWrapper::FrameIndex>())
72
88
  .add_property("frame_index", &ExternalWrenchContact::frame_index)
73
89
  .add_property(
@@ -90,6 +106,8 @@ void exposeDynamics()
90
106
  .def("add_unilateral_point_contact", &DynamicsSolver::add_unilateral_point_contact, return_internal_reference<>())
91
107
  .def("add_planar_contact", &DynamicsSolver::add_planar_contact, return_internal_reference<>())
92
108
  .def("add_fixed_contact", &DynamicsSolver::add_fixed_contact, return_internal_reference<>())
109
+ .def("add_line_contact", &DynamicsSolver::add_line_contact, return_internal_reference<>())
110
+ .def("add_unilateral_line_contact", &DynamicsSolver::add_unilateral_line_contact, return_internal_reference<>())
93
111
  .def<ExternalWrenchContact& (DynamicsSolver::*)(std::string, std::string)>(
94
112
  "add_external_wrench_contact", &DynamicsSolver::add_external_wrench_contact, return_internal_reference<>())
95
113
  .def("add_puppet_contact", &DynamicsSolver::add_puppet_contact, return_internal_reference<>())
@@ -212,7 +230,7 @@ void exposeDynamics()
212
230
  .def(
213
231
  "orientation", +[](const FrameTask& task) -> OrientationTask& { return *task.orientation; },
214
232
  return_internal_reference<>())
215
- .def("configure", &FrameTask::configure)
233
+ .def("configure", &FrameTask::configure, frame_configure_overloads())
216
234
  .add_property("T_world_frame", &FrameTask::get_T_world_frame, &FrameTask::set_T_world_frame);
217
235
 
218
236
  class__<RelativeFrameTask>("DynamicsRelativeFrameTask", init<>())
@@ -228,6 +246,7 @@ void exposeDynamics()
228
246
 
229
247
  class__<JointsTask, bases<Task>>("DynamicsJointsTask", init<>())
230
248
  .def("set_joint", &JointsTask::set_joint, set_joint_overloads())
249
+ .def("get_joint", &JointsTask::get_joint)
231
250
  .def(
232
251
  "set_joints", +[](JointsTask& task,
233
252
  boost::python::dict& py_dict) { update_map<std::string, double>(task.joints, py_dict); })
@@ -192,6 +192,7 @@ void exposeKinematics()
192
192
 
193
193
  class__<JointsTask, bases<Task>>("JointsTask", init<>())
194
194
  .def("set_joint", &JointsTask::set_joint)
195
+ .def("get_joint", &JointsTask::get_joint)
195
196
  .def(
196
197
  "set_joints", +[](JointsTask& task, boost::python::dict& py_dict) {
197
198
  update_map<std::string, double>(task.joints, py_dict);
@@ -109,6 +109,7 @@ void exposeProblem()
109
109
  .def("clear_variables", &Problem::clear_variables)
110
110
  .def("clear_constraints", &Problem::clear_constraints)
111
111
  .def("dump_status", &Problem::dump_status)
112
+ .add_property("x", &Problem::x)
112
113
  .add_property("n_variables", &Problem::n_variables, &Problem::n_variables)
113
114
  .add_property("n_inequalities", &Problem::n_inequalities, &Problem::n_inequalities)
114
115
  .add_property("n_equalities", &Problem::n_equalities, &Problem::n_equalities)
@@ -117,6 +118,7 @@ void exposeProblem()
117
118
  .add_property("slack_variables", &Problem::slack_variables, &Problem::slack_variables)
118
119
  .add_property("use_sparsity", &Problem::use_sparsity, &Problem::use_sparsity)
119
120
  .add_property("rewrite_equalities", &Problem::rewrite_equalities, &Problem::rewrite_equalities)
121
+ .add_property("regularization", &Problem::regularization, &Problem::regularization)
120
122
  .add_property(
121
123
  "slacks", +[](const Problem& problem) { return problem.slacks; });
122
124
 
@@ -133,6 +135,7 @@ void exposeProblem()
133
135
  "b", +[](Expression& e) { return e.b; })
134
136
  .def("__len__", &Expression::rows)
135
137
  .def("is_scalar", &Expression::is_scalar)
138
+ .def("is_constant", &Expression::is_constant)
136
139
  .def("slice", &Expression::slice)
137
140
  .def("rows", &Expression::rows)
138
141
  .def("cols", &Expression::cols)
@@ -149,6 +152,7 @@ void exposeProblem()
149
152
  .def(self - self)
150
153
  .def(self * float())
151
154
  .def(float() * self)
155
+ .def(self * self)
152
156
  .def(self + other<Eigen::VectorXd>())
153
157
  .def(other<Eigen::VectorXd>() + self)
154
158
  .def(self - other<Eigen::VectorXd>())
@@ -158,7 +162,7 @@ void exposeProblem()
158
162
  .def(self - float())
159
163
  .def(float() - self)
160
164
  .def(other<Eigen::MatrixXd>() * self)
161
- .def("multiply", &Expression::multiply)
165
+ .def("left_multiply", &Expression::left_multiply)
162
166
  // Compare to build constraints
163
167
  .def(self >= self)
164
168
  .def(self <= self)
@@ -61,6 +61,8 @@ void exposeRobotType(class_<RobotType, W1>& type)
61
61
  .def("com_jacobian_time_variation", &RobotType::com_jacobian_time_variation)
62
62
  .def("generalized_gravity", &RobotType::generalized_gravity)
63
63
  .def("non_linear_effects", &RobotType::non_linear_effects)
64
+ .def("set_rotor_inertia", &RobotType::set_rotor_inertia)
65
+ .def("set_gear_ratio", &RobotType::set_gear_ratio)
64
66
  .def("mass_matrix", &RobotType::mass_matrix)
65
67
  .def("set_gravity", &RobotType::set_gravity)
66
68
  .def("total_mass", &RobotType::total_mass)
@@ -51,6 +51,7 @@ KinematicsSolver = typing.NewType("KinematicsSolver", None)
51
51
  KineticEnergyRegularizationTask = typing.NewType("KineticEnergyRegularizationTask", None)
52
52
  LIPM = typing.NewType("LIPM", None)
53
53
  LIPMTrajectory = typing.NewType("LIPMTrajectory", None)
54
+ LineContact = typing.NewType("LineContact", None)
54
55
  ManipulabilityTask = typing.NewType("ManipulabilityTask", None)
55
56
  OrientationTask = typing.NewType("OrientationTask", None)
56
57
  PointContact = typing.NewType("PointContact", None)
@@ -635,6 +636,10 @@ class Contact:
635
636
  """Weight of moments for optimization (if relevant)
636
637
  """
637
638
 
639
+ weight_tangentials: float # double
640
+ """Extra cost for tangential forces.
641
+ """
642
+
638
643
  wrench: numpy.ndarray # Eigen::VectorXd
639
644
  """Wrench populated after the DynamicsSolver::solve call.
640
645
  """
@@ -688,6 +693,10 @@ class Contact6D:
688
693
  """Weight of moments for optimization (if relevant)
689
694
  """
690
695
 
696
+ weight_tangentials: float # double
697
+ """Extra cost for tangential forces.
698
+ """
699
+
691
700
  width: float # double
692
701
  """Rectangular contact width along local y-axis.
693
702
  """
@@ -1271,6 +1280,19 @@ class DynamicsJointsTask:
1271
1280
  """Current error vector.
1272
1281
  """
1273
1282
 
1283
+ def get_joint(
1284
+ self: DynamicsJointsTask,
1285
+ joint: str, # std::string
1286
+
1287
+ ) -> float:
1288
+ """Returns the current target position of a joint.
1289
+
1290
+
1291
+ :param joint: joint name
1292
+
1293
+ :return: current target position"""
1294
+ ...
1295
+
1274
1296
  kd: float # double
1275
1297
  """D gain for position control (if negative, will be critically damped)
1276
1298
  """
@@ -1781,6 +1803,19 @@ class DynamicsSolver:
1781
1803
  :return: joints task"""
1782
1804
  ...
1783
1805
 
1806
+ def add_line_contact(
1807
+ self: DynamicsSolver,
1808
+ frame_task: DynamicsFrameTask, # placo::dynamics::FrameTask
1809
+
1810
+ ) -> LineContact:
1811
+ """Adds a fixed line contact.
1812
+
1813
+
1814
+ :param frame_task: associated frame task
1815
+
1816
+ :return: line contact"""
1817
+ ...
1818
+
1784
1819
  def add_orientation_task(
1785
1820
  self: DynamicsSolver,
1786
1821
  frame_name: str, # std::string
@@ -1942,6 +1977,19 @@ class DynamicsSolver:
1942
1977
  :return: torque task"""
1943
1978
  ...
1944
1979
 
1980
+ def add_unilateral_line_contact(
1981
+ self: DynamicsSolver,
1982
+ frame_task: DynamicsFrameTask, # placo::dynamics::FrameTask
1983
+
1984
+ ) -> LineContact:
1985
+ """Adds a unilateral line contact, which is unilateral in the sense of the local body z-axis.
1986
+
1987
+
1988
+ :param frame_task: associated frame task
1989
+
1990
+ :return: unilateral line contact"""
1991
+ ...
1992
+
1945
1993
  def add_unilateral_point_contact(
1946
1994
  self: DynamicsSolver,
1947
1995
  position_task: DynamicsPositionTask, # placo::dynamics::PositionTask
@@ -2367,6 +2415,16 @@ class Expression:
2367
2415
  :return: expression"""
2368
2416
  ...
2369
2417
 
2418
+ def is_constant(
2419
+ self: Expression,
2420
+
2421
+ ) -> bool:
2422
+ """checks if the expression is constant (doesn't depend on decision variables)
2423
+
2424
+
2425
+ :return: true if the expression is constant"""
2426
+ ...
2427
+
2370
2428
  def is_scalar(
2371
2429
  self: Expression,
2372
2430
 
@@ -2377,26 +2435,26 @@ class Expression:
2377
2435
  :return: true if the expression is a scalar"""
2378
2436
  ...
2379
2437
 
2380
- def mean(
2438
+ def left_multiply(
2381
2439
  self: Expression,
2440
+ M: numpy.ndarray, # const Eigen::MatrixXd
2382
2441
 
2383
2442
  ) -> Expression:
2384
- """Reduces a multi-rows expression to the mean of its items.
2443
+ """Multiply an expression on the left by a given matrix M.
2385
2444
 
2386
2445
 
2446
+ :param M: matrix
2447
+
2387
2448
  :return: expression"""
2388
2449
  ...
2389
2450
 
2390
- def multiply(
2451
+ def mean(
2391
2452
  self: Expression,
2392
- M: numpy.ndarray, # const Eigen::MatrixXd
2393
2453
 
2394
2454
  ) -> Expression:
2395
- """Multiply an expression on the left by a given matrix M.
2455
+ """Reduces a multi-rows expression to the mean of its items.
2396
2456
 
2397
2457
 
2398
- :param M: matrix
2399
-
2400
2458
  :return: expression"""
2401
2459
  ...
2402
2460
 
@@ -2493,6 +2551,10 @@ class ExternalWrenchContact:
2493
2551
  """Weight of moments for optimization (if relevant)
2494
2552
  """
2495
2553
 
2554
+ weight_tangentials: float # double
2555
+ """Extra cost for tangential forces.
2556
+ """
2557
+
2496
2558
  wrench: numpy.ndarray # Eigen::VectorXd
2497
2559
  """Wrench populated after the DynamicsSolver::solve call.
2498
2560
  """
@@ -3622,6 +3684,15 @@ class HumanoidRobot:
3622
3684
  :param T_world_frameTarget: transformation matrix"""
3623
3685
  ...
3624
3686
 
3687
+ def set_gear_ratio(
3688
+ self: HumanoidRobot,
3689
+ joint_name: str, # const std::string &
3690
+ rotor_gear_ratio: float, # double
3691
+
3692
+ ) -> None:
3693
+ """Updates the rotor gear ratio (used for apparent inertia computation in the dynamics)"""
3694
+ ...
3695
+
3625
3696
  def set_gravity(
3626
3697
  self: HumanoidRobot,
3627
3698
  gravity: numpy.ndarray, # Eigen::Vector3d
@@ -3689,6 +3760,15 @@ class HumanoidRobot:
3689
3760
  :param value: joint velocity"""
3690
3761
  ...
3691
3762
 
3763
+ def set_rotor_inertia(
3764
+ self: HumanoidRobot,
3765
+ joint_name: str, # const std::string &
3766
+ rotor_inertia: float, # double
3767
+
3768
+ ) -> None:
3769
+ """Updates the rotor inertia (used for apparent inertia computation in the dynamics)"""
3770
+ ...
3771
+
3692
3772
  def set_torque_limit(
3693
3773
  self: HumanoidRobot,
3694
3774
  name: str, # const std::string &
@@ -4075,6 +4155,19 @@ class JointsTask:
4075
4155
  :return: task error norm"""
4076
4156
  ...
4077
4157
 
4158
+ def get_joint(
4159
+ self: JointsTask,
4160
+ joint: str, # std::string
4161
+
4162
+ ) -> float:
4163
+ """Returns the target value of a joint.
4164
+
4165
+
4166
+ :param joint: joint
4167
+
4168
+ :return: target value"""
4169
+ ...
4170
+
4078
4171
  name: str # std::string
4079
4172
  """Object name.
4080
4173
  """
@@ -4803,6 +4896,77 @@ class LIPMTrajectory:
4803
4896
  ...
4804
4897
 
4805
4898
 
4899
+ class LineContact:
4900
+ R_world_surface: numpy.ndarray # Eigen::Matrix3d
4901
+ """rotation matrix expressing the surface frame in the world frame (for unilateral contact)
4902
+ """
4903
+
4904
+ def __init__(
4905
+ self: LineContact,
4906
+ frame_task: DynamicsFrameTask, # placo::dynamics::FrameTask
4907
+ unilateral: bool, # bool
4908
+
4909
+ ) -> any:
4910
+ """see DynamicsSolver::add_fixed_planar_contact and DynamicsSolver::add_unilateral_planar_contact"""
4911
+ ...
4912
+
4913
+ active: bool # bool
4914
+ """true if the contact is active (ignored by the solver else, this allow to enable/disable a contact without removing it from the solver)
4915
+ """
4916
+
4917
+ length: float # double
4918
+ """Rectangular contact length along local x-axis.
4919
+ """
4920
+
4921
+ mu: float # double
4922
+ """Coefficient of friction (if relevant)
4923
+ """
4924
+
4925
+ def orientation_task(
4926
+ self: LineContact,
4927
+
4928
+ ) -> DynamicsOrientationTask:
4929
+ """Associated orientation task."""
4930
+ ...
4931
+
4932
+ def position_task(
4933
+ self: LineContact,
4934
+
4935
+ ) -> DynamicsPositionTask:
4936
+ """Associated position task."""
4937
+ ...
4938
+
4939
+ unilateral: bool # bool
4940
+ """true for unilateral contact with the ground
4941
+ """
4942
+
4943
+ weight_forces: float # double
4944
+ """Weight of forces for the optimization (if relevant)
4945
+ """
4946
+
4947
+ weight_moments: float # double
4948
+ """Weight of moments for optimization (if relevant)
4949
+ """
4950
+
4951
+ weight_tangentials: float # double
4952
+ """Extra cost for tangential forces.
4953
+ """
4954
+
4955
+ wrench: numpy.ndarray # Eigen::VectorXd
4956
+ """Wrench populated after the DynamicsSolver::solve call.
4957
+ """
4958
+
4959
+ def zmp(
4960
+ self: LineContact,
4961
+
4962
+ ) -> numpy.ndarray:
4963
+ """Returns the contact ZMP in the local frame.
4964
+
4965
+
4966
+ :return: zmp"""
4967
+ ...
4968
+
4969
+
4806
4970
  class ManipulabilityTask:
4807
4971
  A: numpy.ndarray # Eigen::MatrixXd
4808
4972
  """Matrix A in the task Ax = b, where x are the joint delta positions.
@@ -5008,6 +5172,10 @@ class PointContact:
5008
5172
  """Weight of moments for optimization (if relevant)
5009
5173
  """
5010
5174
 
5175
+ weight_tangentials: float # double
5176
+ """Extra cost for tangential forces.
5177
+ """
5178
+
5011
5179
  wrench: numpy.ndarray # Eigen::VectorXd
5012
5180
  """Wrench populated after the DynamicsSolver::solve call.
5013
5181
  """
@@ -5252,6 +5420,10 @@ class Problem:
5252
5420
  """Number of problem variables that need to be solved.
5253
5421
  """
5254
5422
 
5423
+ regularization: float # double
5424
+ """Default internal regularization.
5425
+ """
5426
+
5255
5427
  rewrite_equalities: bool # bool
5256
5428
  """If set to true, a QR factorization will be performed on the equality constraints, and the QP will be called with free variables only.
5257
5429
  """
@@ -5275,6 +5447,10 @@ class Problem:
5275
5447
  """If set to true, some sparsity optimizations will be performed when building the problem Hessian. This optimization is generally not useful for small problems.
5276
5448
  """
5277
5449
 
5450
+ x: numpy.ndarray # Eigen::VectorXd
5451
+ """Computed result.
5452
+ """
5453
+
5278
5454
 
5279
5455
  class ProblemConstraint:
5280
5456
  """Represents a constraint to be enforced by a Problem.
@@ -5340,6 +5516,10 @@ class PuppetContact:
5340
5516
  """Weight of moments for optimization (if relevant)
5341
5517
  """
5342
5518
 
5519
+ weight_tangentials: float # double
5520
+ """Extra cost for tangential forces.
5521
+ """
5522
+
5343
5523
  wrench: numpy.ndarray # Eigen::VectorXd
5344
5524
  """Wrench populated after the DynamicsSolver::solve call.
5345
5525
  """
@@ -6032,6 +6212,15 @@ class RobotWrapper:
6032
6212
  :param T_world_frameTarget: transformation matrix"""
6033
6213
  ...
6034
6214
 
6215
+ def set_gear_ratio(
6216
+ self: RobotWrapper,
6217
+ joint_name: str, # const std::string &
6218
+ rotor_gear_ratio: float, # double
6219
+
6220
+ ) -> None:
6221
+ """Updates the rotor gear ratio (used for apparent inertia computation in the dynamics)"""
6222
+ ...
6223
+
6035
6224
  def set_gravity(
6036
6225
  self: RobotWrapper,
6037
6226
  gravity: numpy.ndarray, # Eigen::Vector3d
@@ -6099,6 +6288,15 @@ class RobotWrapper:
6099
6288
  :param value: joint velocity"""
6100
6289
  ...
6101
6290
 
6291
+ def set_rotor_inertia(
6292
+ self: RobotWrapper,
6293
+ joint_name: str, # const std::string &
6294
+ rotor_inertia: float, # double
6295
+
6296
+ ) -> None:
6297
+ """Updates the rotor inertia (used for apparent inertia computation in the dynamics)"""
6298
+ ...
6299
+
6102
6300
  def set_torque_limit(
6103
6301
  self: RobotWrapper,
6104
6302
  name: str, # const std::string &
@@ -6623,6 +6821,10 @@ class TaskContact:
6623
6821
  """Weight of moments for optimization (if relevant)
6624
6822
  """
6625
6823
 
6824
+ weight_tangentials: float # double
6825
+ """Extra cost for tangential forces.
6826
+ """
6827
+
6626
6828
  wrench: numpy.ndarray # Eigen::VectorXd
6627
6829
  """Wrench populated after the DynamicsSolver::solve call.
6628
6830
  """
@@ -7332,4 +7534,4 @@ def wrap_angle(
7332
7534
  ...
7333
7535
 
7334
7536
 
7335
- __groups__ = {'placo::dynamics': ['AvoidSelfCollisionsDynamicsConstraint', 'Contact', 'Contact6D', 'DynamicsCoMTask', 'DynamicsConstraint', 'DynamicsFrameTask', 'DynamicsGearTask', 'DynamicsJointsTask', 'DynamicsOrientationTask', 'DynamicsPositionTask', 'DynamicsRelativeFrameTask', 'DynamicsRelativeOrientationTask', 'DynamicsRelativePositionTask', 'DynamicsSolver', 'DynamicsSolverResult', 'DynamicsTask', 'DynamicsTorqueTask', 'ExternalWrenchContact', 'PointContact', 'PuppetContact', 'TaskContact'], 'placo::kinematics': ['AvoidSelfCollisionsKinematicsConstraint', 'AxisAlignTask', 'CentroidalMomentumTask', 'CoMPolygonConstraint', 'CoMTask', 'ConeConstraint', 'DistanceTask', 'FrameTask', 'GearTask', 'JointsTask', 'KinematicsConstraint', 'KinematicsSolver', 'KineticEnergyRegularizationTask', 'ManipulabilityTask', 'OrientationTask', 'PositionTask', 'RegularizationTask', 'RelativeFrameTask', 'RelativeOrientationTask', 'RelativePositionTask', 'Task', 'WheelTask'], 'placo::tools': ['AxisesMask', 'CubicSpline', 'CubicSpline3D', 'Prioritized'], 'placo::model': ['Collision', 'Distance', 'RobotWrapper', 'RobotWrapper_State'], 'placo::problem': ['Expression', 'Integrator', 'IntegratorTrajectory', 'PolygonConstraint', 'Problem', 'ProblemConstraint', 'QPError', 'Sparsity', 'SparsityInterval', 'Variable'], 'placo::humanoid': ['Footstep', 'FootstepsPlanner', 'FootstepsPlannerNaive', 'FootstepsPlannerRepetitive', 'HumanoidParameters', 'HumanoidRobot', 'LIPM', 'LIPMTrajectory', 'Support', 'SwingFoot', 'SwingFootCubic', 'SwingFootCubicTrajectory', 'SwingFootQuintic', 'SwingFootQuinticTrajectory', 'SwingFootTrajectory', 'WalkPatternGenerator', 'WalkTasks', 'WalkTrajectory']}
7537
+ __groups__ = {'placo::dynamics': ['AvoidSelfCollisionsDynamicsConstraint', 'Contact', 'Contact6D', 'DynamicsCoMTask', 'DynamicsConstraint', 'DynamicsFrameTask', 'DynamicsGearTask', 'DynamicsJointsTask', 'DynamicsOrientationTask', 'DynamicsPositionTask', 'DynamicsRelativeFrameTask', 'DynamicsRelativeOrientationTask', 'DynamicsRelativePositionTask', 'DynamicsSolver', 'DynamicsSolverResult', 'DynamicsTask', 'DynamicsTorqueTask', 'ExternalWrenchContact', 'LineContact', 'PointContact', 'PuppetContact', 'TaskContact'], 'placo::kinematics': ['AvoidSelfCollisionsKinematicsConstraint', 'AxisAlignTask', 'CentroidalMomentumTask', 'CoMPolygonConstraint', 'CoMTask', 'ConeConstraint', 'DistanceTask', 'FrameTask', 'GearTask', 'JointsTask', 'KinematicsConstraint', 'KinematicsSolver', 'KineticEnergyRegularizationTask', 'ManipulabilityTask', 'OrientationTask', 'PositionTask', 'RegularizationTask', 'RelativeFrameTask', 'RelativeOrientationTask', 'RelativePositionTask', 'Task', 'WheelTask'], 'placo::tools': ['AxisesMask', 'CubicSpline', 'CubicSpline3D', 'Prioritized'], 'placo::model': ['Collision', 'Distance', 'RobotWrapper', 'RobotWrapper_State'], 'placo::problem': ['Expression', 'Integrator', 'IntegratorTrajectory', 'PolygonConstraint', 'Problem', 'ProblemConstraint', 'QPError', 'Sparsity', 'SparsityInterval', 'Variable'], 'placo::humanoid': ['Footstep', 'FootstepsPlanner', 'FootstepsPlannerNaive', 'FootstepsPlannerRepetitive', 'HumanoidParameters', 'HumanoidRobot', 'LIPM', 'LIPMTrajectory', 'Support', 'SwingFoot', 'SwingFootCubic', 'SwingFootCubicTrajectory', 'SwingFootQuintic', 'SwingFootQuinticTrajectory', 'SwingFootTrajectory', 'WalkPatternGenerator', 'WalkTasks', 'WalkTrajectory']}
@@ -23,7 +23,7 @@ description = "PlaCo: Rhoban Planning and Control"
23
23
  license = "MIT"
24
24
  name = "placo"
25
25
  requires-python = ">= 3.8"
26
- version = "0.5.9"
26
+ version = "0.6.0"
27
27
 
28
28
  [project.urls]
29
29
  changelog = "https://github.com/rhoban/placo/blob/main/CHANGELOG.md"
@@ -243,7 +243,7 @@ def contacts_viz(solver: placo.DynamicsSolver, ratio=0.1, radius=0.005):
243
243
  origin = T_world_frame[:3, 3]
244
244
  else:
245
245
  origin = T_world_frame[:3, 3] + T_world_frame[:3, :3] @ contact.zmp()
246
-
246
+
247
247
  arrow_viz(
248
248
  f"contact_{k}",
249
249
  origin,
@@ -251,6 +251,23 @@ def contacts_viz(solver: placo.DynamicsSolver, ratio=0.1, radius=0.005):
251
251
  color=0x00FFAA,
252
252
  radius=radius,
253
253
  )
254
+ elif isinstance(contact, placo.LineContact):
255
+ frame_name = frames[contact.position_task().frame_index]
256
+ T_world_frame = robot.get_T_world_frame(frame_name)
257
+ wrench = T_world_frame[:3, :3] @ contact.wrench[:3]
258
+
259
+ if np.linalg.norm(wrench) < 1e-6:
260
+ origin = T_world_frame[:3, 3]
261
+ else:
262
+ origin = T_world_frame[:3, 3] + T_world_frame[:3, :3] @ contact.zmp()
263
+
264
+ arrow_viz(
265
+ f"contact_{k}",
266
+ origin,
267
+ origin + wrench * ratio,
268
+ color=0xFF33AA,
269
+ radius=radius,
270
+ )
254
271
  elif isinstance(contact, placo.ExternalWrenchContact):
255
272
  frame_name = frames[contact.frame_index]
256
273
  T_world_frame = robot.get_T_world_frame(frame_name)
@@ -60,20 +60,12 @@ void AvoidSelfCollisionsConstraint::add_constraint(problem::Problem& problem, pr
60
60
  Eigen::VectorXd dJ = n.transpose() * (dJB - dJA).block(0, 0, 3, solver->N) * solver->robot.state.qd;
61
61
 
62
62
  // Computing xdd_safe from qdd_safe
63
- double lambda = -1;
63
+ double xdd_safe = 0.0;
64
64
  for (int k = 6; k < solver->N; k++)
65
65
  {
66
- if (fabs(J(0, k)) > 1e-6)
67
- {
68
- double lambda_i = fabs(solver->qdd_safe[k] / J(0, k));
69
- if (lambda < 0 || lambda_i < lambda)
70
- {
71
- lambda = lambda_i;
72
- }
73
- }
66
+ xdd_safe += fabs(J(0, k)) * solver->qdd_safe[k];
74
67
  }
75
-
76
- double xdd_safe = (lambda * (J * J.transpose()))(0, 0) + dJ[0];
68
+ xdd_safe = 0.5 * xdd_safe;
77
69
 
78
70
  if (distance.min_distance >= self_collisions_margin)
79
71
  {