placo 0.5.6__0-cp310-cp310-manylinux_2_35_x86_64.whl → 0.6.0__0-cp310-cp310-manylinux_2_35_x86_64.whl

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.

Binary file
@@ -22,7 +22,6 @@ DynamicsGearTask = typing.NewType("DynamicsGearTask", None)
22
22
  DynamicsJointsTask = typing.NewType("DynamicsJointsTask", None)
23
23
  DynamicsOrientationTask = typing.NewType("DynamicsOrientationTask", None)
24
24
  DynamicsPositionTask = typing.NewType("DynamicsPositionTask", None)
25
- DynamicsReactionRatioConstraint = typing.NewType("DynamicsReactionRatioConstraint", None)
26
25
  DynamicsRelativeFrameTask = typing.NewType("DynamicsRelativeFrameTask", None)
27
26
  DynamicsRelativeOrientationTask = typing.NewType("DynamicsRelativeOrientationTask", None)
28
27
  DynamicsRelativePositionTask = typing.NewType("DynamicsRelativePositionTask", None)
@@ -52,6 +51,7 @@ KinematicsSolver = typing.NewType("KinematicsSolver", None)
52
51
  KineticEnergyRegularizationTask = typing.NewType("KineticEnergyRegularizationTask", None)
53
52
  LIPM = typing.NewType("LIPM", None)
54
53
  LIPMTrajectory = typing.NewType("LIPMTrajectory", None)
54
+ LineContact = typing.NewType("LineContact", None)
55
55
  ManipulabilityTask = typing.NewType("ManipulabilityTask", None)
56
56
  OrientationTask = typing.NewType("OrientationTask", None)
57
57
  PointContact = typing.NewType("PointContact", None)
@@ -63,10 +63,8 @@ ProblemConstraint = typing.NewType("ProblemConstraint", None)
63
63
  PuppetContact = typing.NewType("PuppetContact", None)
64
64
  QPError = typing.NewType("QPError", None)
65
65
  RegularizationTask = typing.NewType("RegularizationTask", None)
66
- Relative6DContact = typing.NewType("Relative6DContact", None)
67
66
  RelativeFrameTask = typing.NewType("RelativeFrameTask", None)
68
67
  RelativeOrientationTask = typing.NewType("RelativeOrientationTask", None)
69
- RelativePointContact = typing.NewType("RelativePointContact", None)
70
68
  RelativePositionTask = typing.NewType("RelativePositionTask", None)
71
69
  RobotWrapper = typing.NewType("RobotWrapper", None)
72
70
  RobotWrapper_State = typing.NewType("RobotWrapper_State", None)
@@ -638,6 +636,10 @@ class Contact:
638
636
  """Weight of moments for optimization (if relevant)
639
637
  """
640
638
 
639
+ weight_tangentials: float # double
640
+ """Extra cost for tangential forces.
641
+ """
642
+
641
643
  wrench: numpy.ndarray # Eigen::VectorXd
642
644
  """Wrench populated after the DynamicsSolver::solve call.
643
645
  """
@@ -691,6 +693,10 @@ class Contact6D:
691
693
  """Weight of moments for optimization (if relevant)
692
694
  """
693
695
 
696
+ weight_tangentials: float # double
697
+ """Extra cost for tangential forces.
698
+ """
699
+
694
700
  width: float # double
695
701
  """Rectangular contact width along local y-axis.
696
702
  """
@@ -718,6 +724,19 @@ class CubicSpline:
718
724
  ) -> any:
719
725
  ...
720
726
 
727
+ def acc(
728
+ self: CubicSpline,
729
+ x: float, # double
730
+
731
+ ) -> float:
732
+ """Retrieve acceleration at a given time.
733
+
734
+
735
+ :param t: time
736
+
737
+ :return: acceleration"""
738
+ ...
739
+
721
740
  def add_point(
722
741
  self: CubicSpline,
723
742
  t: float, # double
@@ -786,6 +805,19 @@ class CubicSpline3D:
786
805
  ) -> None:
787
806
  ...
788
807
 
808
+ def acc(
809
+ self: CubicSpline3D,
810
+ t: float, # double
811
+
812
+ ) -> numpy.ndarray:
813
+ """Returns the spline accleeration at time t.
814
+
815
+
816
+ :param t: time
817
+
818
+ :return: acceleration (3D vector)"""
819
+ ...
820
+
789
821
  def add_point(
790
822
  self: CubicSpline3D,
791
823
  t: float, # double
@@ -1002,10 +1034,6 @@ class DynamicsCoMTask:
1002
1034
  :param weight: task weight"""
1003
1035
  ...
1004
1036
 
1005
- critically_damped: bool # bool
1006
- """If this is true, kd will be computed from kp to have a critically damped system.
1007
- """
1008
-
1009
1037
  ddtarget_world: numpy.ndarray # Eigen::Vector3d
1010
1038
  """Target acceleration in the world.
1011
1039
  """
@@ -1023,7 +1051,7 @@ class DynamicsCoMTask:
1023
1051
  """
1024
1052
 
1025
1053
  kd: float # double
1026
- """D gain for position control.
1054
+ """D gain for position control (if negative, will be critically damped)
1027
1055
  """
1028
1056
 
1029
1057
  kp: float # double
@@ -1170,10 +1198,6 @@ class DynamicsGearTask:
1170
1198
  :param weight: task weight"""
1171
1199
  ...
1172
1200
 
1173
- critically_damped: bool # bool
1174
- """If this is true, kd will be computed from kp to have a critically damped system.
1175
- """
1176
-
1177
1201
  derror: numpy.ndarray # Eigen::MatrixXd
1178
1202
  """Current velocity error vector.
1179
1203
  """
@@ -1183,7 +1207,7 @@ class DynamicsGearTask:
1183
1207
  """
1184
1208
 
1185
1209
  kd: float # double
1186
- """D gain for position control.
1210
+ """D gain for position control (if negative, will be critically damped)
1187
1211
  """
1188
1212
 
1189
1213
  kp: float # double
@@ -1248,10 +1272,6 @@ class DynamicsJointsTask:
1248
1272
  :param weight: task weight"""
1249
1273
  ...
1250
1274
 
1251
- critically_damped: bool # bool
1252
- """If this is true, kd will be computed from kp to have a critically damped system.
1253
- """
1254
-
1255
1275
  derror: numpy.ndarray # Eigen::MatrixXd
1256
1276
  """Current velocity error vector.
1257
1277
  """
@@ -1260,8 +1280,21 @@ class DynamicsJointsTask:
1260
1280
  """Current error vector.
1261
1281
  """
1262
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
+
1263
1296
  kd: float # double
1264
- """D gain for position control.
1297
+ """D gain for position control (if negative, will be critically damped)
1265
1298
  """
1266
1299
 
1267
1300
  kp: float # double
@@ -1349,10 +1382,6 @@ class DynamicsOrientationTask:
1349
1382
  :param weight: task weight"""
1350
1383
  ...
1351
1384
 
1352
- critically_damped: bool # bool
1353
- """If this is true, kd will be computed from kp to have a critically damped system.
1354
- """
1355
-
1356
1385
  derror: numpy.ndarray # Eigen::MatrixXd
1357
1386
  """Current velocity error vector.
1358
1387
  """
@@ -1366,7 +1395,7 @@ class DynamicsOrientationTask:
1366
1395
  """
1367
1396
 
1368
1397
  kd: float # double
1369
- """D gain for position control.
1398
+ """D gain for position control (if negative, will be critically damped)
1370
1399
  """
1371
1400
 
1372
1401
  kp: float # double
@@ -1424,8 +1453,8 @@ class DynamicsPositionTask:
1424
1453
  :param weight: task weight"""
1425
1454
  ...
1426
1455
 
1427
- critically_damped: bool # bool
1428
- """If this is true, kd will be computed from kp to have a critically damped system.
1456
+ ddtarget_world: numpy.ndarray # Eigen::Vector3d
1457
+ """Target acceleration in the world.
1429
1458
  """
1430
1459
 
1431
1460
  derror: numpy.ndarray # Eigen::MatrixXd
@@ -1445,7 +1474,7 @@ class DynamicsPositionTask:
1445
1474
  """
1446
1475
 
1447
1476
  kd: float # double
1448
- """D gain for position control.
1477
+ """D gain for position control (if negative, will be critically damped)
1449
1478
  """
1450
1479
 
1451
1480
  kp: float # double
@@ -1469,45 +1498,6 @@ class DynamicsPositionTask:
1469
1498
  """
1470
1499
 
1471
1500
 
1472
- class DynamicsReactionRatioConstraint:
1473
- def __init__(
1474
- arg1: object,
1475
- arg2: Contact,
1476
- arg3: float,
1477
-
1478
- ) -> None:
1479
- ...
1480
-
1481
- def configure(
1482
- self: DynamicsReactionRatioConstraint,
1483
- name: str, # std::string
1484
- priority: any, # placo::kinematics::ConeConstraint::Priority
1485
- weight: float = 1.0, # double
1486
-
1487
- ) -> None:
1488
- """Configures the object.
1489
-
1490
-
1491
- :param name: task name
1492
-
1493
- :param priority: task priority (hard, soft or scaled)
1494
-
1495
- :param weight: task weight"""
1496
- ...
1497
-
1498
- name: str # std::string
1499
- """Object name.
1500
- """
1501
-
1502
- priority: any # placo::kinematics::ConeConstraint::Priority
1503
- """Object priority.
1504
- """
1505
-
1506
- reaction_ratio: float # double
1507
- """Reaction ratio to be enforced.
1508
- """
1509
-
1510
-
1511
1501
  class DynamicsRelativeFrameTask:
1512
1502
  T_a_b: any
1513
1503
 
@@ -1591,10 +1581,6 @@ class DynamicsRelativeOrientationTask:
1591
1581
  :param weight: task weight"""
1592
1582
  ...
1593
1583
 
1594
- critically_damped: bool # bool
1595
- """If this is true, kd will be computed from kp to have a critically damped system.
1596
- """
1597
-
1598
1584
  derror: numpy.ndarray # Eigen::MatrixXd
1599
1585
  """Current velocity error vector.
1600
1586
  """
@@ -1608,7 +1594,7 @@ class DynamicsRelativeOrientationTask:
1608
1594
  """
1609
1595
 
1610
1596
  kd: float # double
1611
- """D gain for position control.
1597
+ """D gain for position control (if negative, will be critically damped)
1612
1598
  """
1613
1599
 
1614
1600
  kp: float # double
@@ -1667,12 +1653,8 @@ class DynamicsRelativePositionTask:
1667
1653
  :param weight: task weight"""
1668
1654
  ...
1669
1655
 
1670
- critically_damped: bool # bool
1671
- """If this is true, kd will be computed from kp to have a critically damped system.
1672
- """
1673
-
1674
1656
  ddtarget: numpy.ndarray # Eigen::Vector3d
1675
- """Target relative velocity.
1657
+ """Target relative acceleration.
1676
1658
  """
1677
1659
 
1678
1660
  derror: numpy.ndarray # Eigen::MatrixXd
@@ -1688,7 +1670,7 @@ class DynamicsRelativePositionTask:
1688
1670
  """
1689
1671
 
1690
1672
  kd: float # double
1691
- """D gain for position control.
1673
+ """D gain for position control (if negative, will be critically damped)
1692
1674
  """
1693
1675
 
1694
1676
  kp: float # double
@@ -1759,6 +1741,7 @@ class DynamicsSolver:
1759
1741
  def add_external_wrench_contact(
1760
1742
  self: DynamicsSolver,
1761
1743
  frame_name: str, # std::string
1744
+ reference: str = "world", # std::string
1762
1745
 
1763
1746
  ) -> ExternalWrenchContact:
1764
1747
  """Adds an external wrench.
@@ -1766,6 +1749,8 @@ class DynamicsSolver:
1766
1749
 
1767
1750
  :param frame_name: frame
1768
1751
 
1752
+ :param reference: reference frame (world or local)
1753
+
1769
1754
  :return: external wrench contact"""
1770
1755
  ...
1771
1756
 
@@ -1818,6 +1803,19 @@ class DynamicsSolver:
1818
1803
  :return: joints task"""
1819
1804
  ...
1820
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
+
1821
1819
  def add_orientation_task(
1822
1820
  self: DynamicsSolver,
1823
1821
  frame_name: str, # std::string
@@ -1886,35 +1884,6 @@ class DynamicsSolver:
1886
1884
  :return: puppet contact"""
1887
1885
  ...
1888
1886
 
1889
- def add_reaction_ratio_constraint(
1890
- self: DynamicsSolver,
1891
- contact: Contact, # placo::dynamics::Contact
1892
- reaction_ratio: float, # double
1893
-
1894
- ) -> DynamicsReactionRatioConstraint:
1895
- """Adds a constraint enforce reaction ratio.
1896
-
1897
-
1898
- :param contact: contact
1899
-
1900
- :param reaction_ratio: reaction ratio to enforce
1901
-
1902
- :return: reaction ratio constraint"""
1903
- ...
1904
-
1905
- def add_relative_fixed_contact(
1906
- self: DynamicsSolver,
1907
- frame_task: DynamicsRelativeFrameTask, # placo::dynamics::RelativeFrameTask
1908
-
1909
- ) -> Relative6DContact:
1910
- """Adds a relative fixed contact, can be used for fixed closed loops.
1911
-
1912
-
1913
- :param frame_task: the associated relative frame task
1914
-
1915
- :return: relative fixed contact"""
1916
- ...
1917
-
1918
1887
  def add_relative_frame_task(
1919
1888
  self: DynamicsSolver,
1920
1889
  frame_a_name: str, # std::string
@@ -1953,19 +1922,6 @@ class DynamicsSolver:
1953
1922
  :return: relative orientation task"""
1954
1923
  ...
1955
1924
 
1956
- def add_relative_point_contact(
1957
- self: DynamicsSolver,
1958
- position_task: DynamicsRelativePositionTask, # placo::dynamics::RelativePositionTask
1959
-
1960
- ) -> RelativePointContact:
1961
- """Adds a relative point contact, which can be typically used for internal forces like loop-closing.
1962
-
1963
-
1964
- :param position_task: associated relative position task
1965
-
1966
- :return: relative point contact"""
1967
- ...
1968
-
1969
1925
  def add_relative_position_task(
1970
1926
  self: DynamicsSolver,
1971
1927
  frame_a_name: str, # std::string
@@ -2021,6 +1977,19 @@ class DynamicsSolver:
2021
1977
  :return: torque task"""
2022
1978
  ...
2023
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
+
2024
1993
  def add_unilateral_point_contact(
2025
1994
  self: DynamicsSolver,
2026
1995
  position_task: DynamicsPositionTask, # placo::dynamics::PositionTask
@@ -2117,10 +2086,6 @@ class DynamicsSolver:
2117
2086
  """Instance of the problem.
2118
2087
  """
2119
2088
 
2120
- qdd_safe: float # double
2121
- """The value of qdd safe.
2122
- """
2123
-
2124
2089
  def remove_constraint(
2125
2090
  self: DynamicsSolver,
2126
2091
  constraint: DynamicsConstraint, # placo::dynamics::Constraint
@@ -2178,6 +2143,34 @@ class DynamicsSolver:
2178
2143
  :param kp:"""
2179
2144
  ...
2180
2145
 
2146
+ def set_qdd_safe(
2147
+ self: DynamicsSolver,
2148
+ joint: str, # std::string
2149
+ qdd: float, # double
2150
+
2151
+ ) -> None:
2152
+ """Sets the "safe" Qdd acceptable for a given joint (used by joint limits)
2153
+
2154
+
2155
+ :param joint:
2156
+
2157
+ :param qdd:"""
2158
+ ...
2159
+
2160
+ def set_torque_limit(
2161
+ self: DynamicsSolver,
2162
+ joint: str, # std::string
2163
+ limit: float, # double
2164
+
2165
+ ) -> None:
2166
+ """Sets the allowed torque limit by the solver for a given joint. This will not affect the robot's model effort limit. When computing the velocity vs torque limit, the robot's model effort will still be used. You can see this limit as a continuous limit allowable for the robot, while the robot's model limit is the maximum possible torque.
2167
+
2168
+
2169
+ :param joint:
2170
+
2171
+ :param limit:"""
2172
+ ...
2173
+
2181
2174
  def solve(
2182
2175
  self: DynamicsSolver,
2183
2176
  integrate: bool = False, # bool
@@ -2186,7 +2179,7 @@ class DynamicsSolver:
2186
2179
  ...
2187
2180
 
2188
2181
  torque_cost: float # double
2189
- """Cost for torque regularization.
2182
+ """Cost for torque regularization (1e-3 by default)
2190
2183
  """
2191
2184
 
2192
2185
 
@@ -2244,10 +2237,6 @@ class DynamicsTask:
2244
2237
  :param weight: task weight"""
2245
2238
  ...
2246
2239
 
2247
- critically_damped: bool # bool
2248
- """If this is true, kd will be computed from kp to have a critically damped system.
2249
- """
2250
-
2251
2240
  derror: numpy.ndarray # Eigen::MatrixXd
2252
2241
  """Current velocity error vector.
2253
2242
  """
@@ -2257,7 +2246,7 @@ class DynamicsTask:
2257
2246
  """
2258
2247
 
2259
2248
  kd: float # double
2260
- """D gain for position control.
2249
+ """D gain for position control (if negative, will be critically damped)
2261
2250
  """
2262
2251
 
2263
2252
  kp: float # double
@@ -2305,10 +2294,6 @@ class DynamicsTorqueTask:
2305
2294
  :param weight: task weight"""
2306
2295
  ...
2307
2296
 
2308
- critically_damped: bool # bool
2309
- """If this is true, kd will be computed from kp to have a critically damped system.
2310
- """
2311
-
2312
2297
  derror: numpy.ndarray # Eigen::MatrixXd
2313
2298
  """Current velocity error vector.
2314
2299
  """
@@ -2318,7 +2303,7 @@ class DynamicsTorqueTask:
2318
2303
  """
2319
2304
 
2320
2305
  kd: float # double
2321
- """D gain for position control.
2306
+ """D gain for position control (if negative, will be critically damped)
2322
2307
  """
2323
2308
 
2324
2309
  kp: float # double
@@ -2430,6 +2415,16 @@ class Expression:
2430
2415
  :return: expression"""
2431
2416
  ...
2432
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
+
2433
2428
  def is_scalar(
2434
2429
  self: Expression,
2435
2430
 
@@ -2440,26 +2435,26 @@ class Expression:
2440
2435
  :return: true if the expression is a scalar"""
2441
2436
  ...
2442
2437
 
2443
- def mean(
2438
+ def left_multiply(
2444
2439
  self: Expression,
2440
+ M: numpy.ndarray, # const Eigen::MatrixXd
2445
2441
 
2446
2442
  ) -> Expression:
2447
- """Reduces a multi-rows expression to the mean of its items.
2443
+ """Multiply an expression on the left by a given matrix M.
2448
2444
 
2449
2445
 
2446
+ :param M: matrix
2447
+
2450
2448
  :return: expression"""
2451
2449
  ...
2452
2450
 
2453
- def multiply(
2451
+ def mean(
2454
2452
  self: Expression,
2455
- M: numpy.ndarray, # const Eigen::MatrixXd
2456
2453
 
2457
2454
  ) -> Expression:
2458
- """Multiply an expression on the left by a given matrix M.
2455
+ """Reduces a multi-rows expression to the mean of its items.
2459
2456
 
2460
2457
 
2461
- :param M: matrix
2462
-
2463
2458
  :return: expression"""
2464
2459
  ...
2465
2460
 
@@ -2530,6 +2525,7 @@ class ExternalWrenchContact:
2530
2525
  def __init__(
2531
2526
  self: ExternalWrenchContact,
2532
2527
  frame_index: any, # pinocchio::FrameIndex
2528
+ reference: any, # pinocchio::ReferenceFrame
2533
2529
 
2534
2530
  ) -> any:
2535
2531
  """see DynamicsSolver::add_external_wrench_contact"""
@@ -2555,6 +2551,10 @@ class ExternalWrenchContact:
2555
2551
  """Weight of moments for optimization (if relevant)
2556
2552
  """
2557
2553
 
2554
+ weight_tangentials: float # double
2555
+ """Extra cost for tangential forces.
2556
+ """
2557
+
2558
2558
  wrench: numpy.ndarray # Eigen::VectorXd
2559
2559
  """Wrench populated after the DynamicsSolver::solve call.
2560
2560
  """
@@ -3227,6 +3227,14 @@ class HumanoidRobot:
3227
3227
  ) -> any:
3228
3228
  ...
3229
3229
 
3230
+ def add_q_noise(
3231
+ self: HumanoidRobot,
3232
+ noise: float, # double
3233
+
3234
+ ) -> None:
3235
+ """Adds some noise to the configuration."""
3236
+ ...
3237
+
3230
3238
  def centroidal_map(
3231
3239
  self: HumanoidRobot,
3232
3240
 
@@ -3676,6 +3684,15 @@ class HumanoidRobot:
3676
3684
  :param T_world_frameTarget: transformation matrix"""
3677
3685
  ...
3678
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
+
3679
3696
  def set_gravity(
3680
3697
  self: HumanoidRobot,
3681
3698
  gravity: numpy.ndarray, # Eigen::Vector3d
@@ -3743,6 +3760,15 @@ class HumanoidRobot:
3743
3760
  :param value: joint velocity"""
3744
3761
  ...
3745
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
+
3746
3772
  def set_torque_limit(
3747
3773
  self: HumanoidRobot,
3748
3774
  name: str, # const std::string &
@@ -4129,6 +4155,19 @@ class JointsTask:
4129
4155
  :return: task error norm"""
4130
4156
  ...
4131
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
+
4132
4171
  name: str # std::string
4133
4172
  """Object name.
4134
4173
  """
@@ -4428,17 +4467,6 @@ class KinematicsSolver:
4428
4467
  :return: position task"""
4429
4468
  ...
4430
4469
 
4431
- def add_q_noise(
4432
- self: KinematicsSolver,
4433
- noise: float = 1e-5, # double
4434
-
4435
- ) -> None:
4436
- """Adds some noise on the configuration of the robot (q)
4437
-
4438
-
4439
- :param noise: noise level, expressed in ratio of the joint limits"""
4440
- ...
4441
-
4442
4470
  def add_regularization_task(
4443
4471
  self: KinematicsSolver,
4444
4472
  magnitude: float = 1e-6, # double
@@ -4868,6 +4896,77 @@ class LIPMTrajectory:
4868
4896
  ...
4869
4897
 
4870
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
+
4871
4970
  class ManipulabilityTask:
4872
4971
  A: numpy.ndarray # Eigen::MatrixXd
4873
4972
  """Matrix A in the task Ax = b, where x are the joint delta positions.
@@ -5033,6 +5132,10 @@ class OrientationTask:
5033
5132
 
5034
5133
 
5035
5134
  class PointContact:
5135
+ R_world_surface: numpy.ndarray # Eigen::Matrix3d
5136
+ """rotation matrix expressing the surface frame in the world frame (for unilateral contact)
5137
+ """
5138
+
5036
5139
  def __init__(
5037
5140
  self: PointContact,
5038
5141
  position_task: DynamicsPositionTask, # placo::dynamics::PositionTask
@@ -5069,6 +5172,10 @@ class PointContact:
5069
5172
  """Weight of moments for optimization (if relevant)
5070
5173
  """
5071
5174
 
5175
+ weight_tangentials: float # double
5176
+ """Extra cost for tangential forces.
5177
+ """
5178
+
5072
5179
  wrench: numpy.ndarray # Eigen::VectorXd
5073
5180
  """Wrench populated after the DynamicsSolver::solve call.
5074
5181
  """
@@ -5313,6 +5420,10 @@ class Problem:
5313
5420
  """Number of problem variables that need to be solved.
5314
5421
  """
5315
5422
 
5423
+ regularization: float # double
5424
+ """Default internal regularization.
5425
+ """
5426
+
5316
5427
  rewrite_equalities: bool # bool
5317
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.
5318
5429
  """
@@ -5336,6 +5447,10 @@ class Problem:
5336
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.
5337
5448
  """
5338
5449
 
5450
+ x: numpy.ndarray # Eigen::VectorXd
5451
+ """Computed result.
5452
+ """
5453
+
5339
5454
 
5340
5455
  class ProblemConstraint:
5341
5456
  """Represents a constraint to be enforced by a Problem.
@@ -5401,6 +5516,10 @@ class PuppetContact:
5401
5516
  """Weight of moments for optimization (if relevant)
5402
5517
  """
5403
5518
 
5519
+ weight_tangentials: float # double
5520
+ """Extra cost for tangential forces.
5521
+ """
5522
+
5404
5523
  wrench: numpy.ndarray # Eigen::VectorXd
5405
5524
  """Wrench populated after the DynamicsSolver::solve call.
5406
5525
  """
@@ -5491,36 +5610,6 @@ class RegularizationTask:
5491
5610
  ...
5492
5611
 
5493
5612
 
5494
- class Relative6DContact:
5495
- def __init__(
5496
- self: Relative6DContact,
5497
- frame_task: DynamicsRelativeFrameTask, # placo::dynamics::RelativeFrameTask
5498
-
5499
- ) -> any:
5500
- """see DynamicsSolver::add_relative_fixed_contact"""
5501
- ...
5502
-
5503
- active: bool # bool
5504
- """true if the contact is active (ignored by the solver else, this allow to enable/disable a contact without removing it from the solver)
5505
- """
5506
-
5507
- mu: float # double
5508
- """Coefficient of friction (if relevant)
5509
- """
5510
-
5511
- weight_forces: float # double
5512
- """Weight of forces for the optimization (if relevant)
5513
- """
5514
-
5515
- weight_moments: float # double
5516
- """Weight of moments for optimization (if relevant)
5517
- """
5518
-
5519
- wrench: numpy.ndarray # Eigen::VectorXd
5520
- """Wrench populated after the DynamicsSolver::solve call.
5521
- """
5522
-
5523
-
5524
5613
  class RelativeFrameTask:
5525
5614
  T_a_b: any
5526
5615
 
@@ -5656,36 +5745,6 @@ class RelativeOrientationTask:
5656
5745
  ...
5657
5746
 
5658
5747
 
5659
- class RelativePointContact:
5660
- def __init__(
5661
- self: RelativePointContact,
5662
- position_task: DynamicsRelativePositionTask, # placo::dynamics::RelativePositionTask
5663
-
5664
- ) -> any:
5665
- """see DynamicsSolver::add_relative_point_contact"""
5666
- ...
5667
-
5668
- active: bool # bool
5669
- """true if the contact is active (ignored by the solver else, this allow to enable/disable a contact without removing it from the solver)
5670
- """
5671
-
5672
- mu: float # double
5673
- """Coefficient of friction (if relevant)
5674
- """
5675
-
5676
- weight_forces: float # double
5677
- """Weight of forces for the optimization (if relevant)
5678
- """
5679
-
5680
- weight_moments: float # double
5681
- """Weight of moments for optimization (if relevant)
5682
- """
5683
-
5684
- wrench: numpy.ndarray # Eigen::VectorXd
5685
- """Wrench populated after the DynamicsSolver::solve call.
5686
- """
5687
-
5688
-
5689
5748
  class RelativePositionTask:
5690
5749
  A: numpy.ndarray # Eigen::MatrixXd
5691
5750
  """Matrix A in the task Ax = b, where x are the joint delta positions.
@@ -5794,6 +5853,14 @@ class RobotWrapper:
5794
5853
  :param urdf_content: if it is not empty, it will be used as the URDF content instead of loading it from the file"""
5795
5854
  ...
5796
5855
 
5856
+ def add_q_noise(
5857
+ self: RobotWrapper,
5858
+ noise: float, # double
5859
+
5860
+ ) -> None:
5861
+ """Adds some noise to the configuration."""
5862
+ ...
5863
+
5797
5864
  def centroidal_map(
5798
5865
  self: RobotWrapper,
5799
5866
 
@@ -6145,6 +6212,15 @@ class RobotWrapper:
6145
6212
  :param T_world_frameTarget: transformation matrix"""
6146
6213
  ...
6147
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
+
6148
6224
  def set_gravity(
6149
6225
  self: RobotWrapper,
6150
6226
  gravity: numpy.ndarray, # Eigen::Vector3d
@@ -6212,6 +6288,15 @@ class RobotWrapper:
6212
6288
  :param value: joint velocity"""
6213
6289
  ...
6214
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
+
6215
6300
  def set_torque_limit(
6216
6301
  self: RobotWrapper,
6217
6302
  name: str, # const std::string &
@@ -6736,6 +6821,10 @@ class TaskContact:
6736
6821
  """Weight of moments for optimization (if relevant)
6737
6822
  """
6738
6823
 
6824
+ weight_tangentials: float # double
6825
+ """Extra cost for tangential forces.
6826
+ """
6827
+
6739
6828
  wrench: numpy.ndarray # Eigen::VectorXd
6740
6829
  """Wrench populated after the DynamicsSolver::solve call.
6741
6830
  """
@@ -7169,12 +7258,6 @@ def frame_yaw(
7169
7258
  ...
7170
7259
 
7171
7260
 
7172
- def getNumpyType(
7173
-
7174
- ) -> any:
7175
- ...
7176
-
7177
-
7178
7261
  def get_classes_registry(
7179
7262
 
7180
7263
  ) -> any:
@@ -7233,7 +7316,7 @@ def optimal_transformation(
7233
7316
  points_in_B: numpy.ndarray, # Eigen::MatrixXd
7234
7317
 
7235
7318
  ) -> numpy.ndarray:
7236
- """Finds the optimal transformation T_a_b that minimizes the sum of squared distances between the (same) points in A and T_a_b * points in B Points are stacked in lines (columns are x, y and z) in the matrices."""
7319
+ """Finds the optimal transformation T_a_b that minimizes the sum of squared distances between the (same) points with coordinates expressed in A and B. Points are stacked in lines (columns are x, y and z) in the matrices."""
7237
7320
  ...
7238
7321
 
7239
7322
 
@@ -7260,13 +7343,6 @@ def seed(
7260
7343
  ...
7261
7344
 
7262
7345
 
7263
- def setNumpyType(
7264
- numpy_type: object,
7265
-
7266
- ) -> None:
7267
- ...
7268
-
7269
-
7270
7346
  def sharedMemory(
7271
7347
  value: bool,
7272
7348
 
@@ -7274,18 +7350,6 @@ def sharedMemory(
7274
7350
  ...
7275
7351
 
7276
7352
 
7277
- def switchToNumpyArray(
7278
-
7279
- ) -> any:
7280
- ...
7281
-
7282
-
7283
- def switchToNumpyMatrix(
7284
-
7285
- ) -> any:
7286
- ...
7287
-
7288
-
7289
7353
  class vector_Collision:
7290
7354
  def __init__(
7291
7355
  arg1: object,
@@ -7470,4 +7534,4 @@ def wrap_angle(
7470
7534
  ...
7471
7535
 
7472
7536
 
7473
- __groups__ = {'placo::dynamics': ['AvoidSelfCollisionsDynamicsConstraint', 'Contact', 'Contact6D', 'DynamicsCoMTask', 'DynamicsConstraint', 'DynamicsFrameTask', 'DynamicsGearTask', 'DynamicsJointsTask', 'DynamicsOrientationTask', 'DynamicsPositionTask', 'DynamicsReactionRatioConstraint', 'DynamicsRelativeFrameTask', 'DynamicsRelativeOrientationTask', 'DynamicsRelativePositionTask', 'DynamicsSolver', 'DynamicsSolverResult', 'DynamicsTask', 'DynamicsTorqueTask', 'ExternalWrenchContact', 'PointContact', 'PuppetContact', 'Relative6DContact', 'RelativePointContact', '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']}
@@ -0,0 +1,37 @@
1
+ import argparse
2
+ import placo
3
+ import time
4
+ from placo_utils.visualization import *
5
+
6
+ arg_parser = argparse.ArgumentParser()
7
+ arg_parser.add_argument("path", help="Path to the URDF")
8
+ arg_parser.add_argument("--frames", help="Frame to display", nargs="+")
9
+ arg_parser.add_argument("--animate", help="Animate the robot", action="store_true")
10
+ args = arg_parser.parse_args()
11
+
12
+ robot = placo.RobotWrapper(args.path, placo.Flags.ignore_collisions)
13
+ robot.update_kinematics()
14
+
15
+ print("Joint names:")
16
+ print(list(robot.joint_names()))
17
+
18
+ print("Frame names:")
19
+ print(list(robot.frame_names()))
20
+
21
+ viz = robot_viz(robot)
22
+ t = 0
23
+
24
+ while True:
25
+ viz.display(robot.state.q)
26
+
27
+ if args.frames:
28
+ for frame in args.frames:
29
+ robot_frame_viz(robot, frame)
30
+
31
+ if args.animate:
32
+ for joint in robot.joint_names():
33
+ robot.set_joint(joint, np.sin(t))
34
+ robot.update_kinematics()
35
+
36
+ t += 0.01
37
+ time.sleep(0.01)
@@ -238,7 +238,12 @@ def contacts_viz(solver: placo.DynamicsSolver, ratio=0.1, radius=0.005):
238
238
  frame_name = frames[contact.position_task().frame_index]
239
239
  T_world_frame = robot.get_T_world_frame(frame_name)
240
240
  wrench = T_world_frame[:3, :3] @ contact.wrench[:3]
241
- origin = T_world_frame[:3, 3] + T_world_frame[:3, :3] @ contact.zmp()
241
+
242
+ if np.linalg.norm(wrench) < 1e-6:
243
+ origin = T_world_frame[:3, 3]
244
+ else:
245
+ origin = T_world_frame[:3, 3] + T_world_frame[:3, :3] @ contact.zmp()
246
+
242
247
  arrow_viz(
243
248
  f"contact_{k}",
244
249
  origin,
@@ -246,6 +251,23 @@ def contacts_viz(solver: placo.DynamicsSolver, ratio=0.1, radius=0.005):
246
251
  color=0x00FFAA,
247
252
  radius=radius,
248
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
+ )
249
271
  elif isinstance(contact, placo.ExternalWrenchContact):
250
272
  frame_name = frames[contact.frame_index]
251
273
  T_world_frame = robot.get_T_world_frame(frame_name)
@@ -0,0 +1,57 @@
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
+ License-File: LICENSE
8
+ Author-email: Rhoban team <team@rhoban.com>
9
+ Project-URL: Changelog, https://github.com/rhoban/placo/blob/main/CHANGELOG.md
10
+ Home-page: https://placo.readthedocs.io/en/latest/
11
+ Project-URL: Repository, https://github.com/rhoban/placo.git
12
+ Requires-Dist: cmeel
13
+ Requires-Dist: eiquadprog >= 1.2.6, < 2
14
+ Requires-Dist: pin >= 2.6.18, < 3
15
+ Requires-Dist: rhoban-cmeel-jsoncpp
16
+ Requires-Dist: meshcat
17
+ Requires-Dist: numpy<2
18
+ Requires-Dist: ischedule
19
+ Provides-Extra: build
20
+ Requires-Dist: pin[build] >= 2.6.18, < 3 ; extra == "build"
21
+ Requires-Dist: cmeel-urdfdom[build] ; extra == "build"
22
+ Description-Content-Type: text/markdown
23
+
24
+ # PlaCo
25
+
26
+ PlaCo is Rhoban's planning and control library.
27
+ Its main features are:
28
+
29
+ * Task-space Inverse Kinematics with constraints,
30
+ * Task-space Inverse Dynamics with constraints,
31
+ * QP problem formulation,
32
+ * Built on the top of [pinocchio](https://github.com/stack-of-tasks/pinocchio)
33
+ * Written in C++ with Python bindings
34
+
35
+ [![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)
36
+
37
+ *Inverse Kinematics Example: a quadruped robot hitting targets with a leg while keeping its three legs on the ground*
38
+
39
+ [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)
40
+
41
+ [![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)
42
+
43
+ *Inverse Dynamics Example: a quadruped with many loop closure joints*
44
+
45
+ [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)
46
+
47
+ ## Installing
48
+
49
+ PlaCo is available from [pip](https://placo.readthedocs.io/en/latest/basics/installation_pip.html),
50
+ or can be [built from sources](https://placo.readthedocs.io/en/latest/basics/installation_source.html).
51
+
52
+ ## Documentation
53
+
54
+ Here is the [official documentation](https://placo.readthedocs.io/en/latest/)
55
+
56
+ You can also find many examples in the [placo-examples](https://github.com/rhoban/placo-examples)
57
+ repository.
@@ -0,0 +1,15 @@
1
+ cmeel.prefix/lib/liblibplaco.so,sha256=7BNsWrxXq_APe8CVkc8Bkl8imlqKAG1V93nPEHGPaqU,2616096
2
+ cmeel.prefix/lib/python3.10/site-packages/placo.pyi,sha256=HJCwhAyosdLE5Qx1XzowfYE2mb3STniQ9CmznKEFtKU,157034
3
+ cmeel.prefix/lib/python3.10/site-packages/placo.so,sha256=M4xqzpZPG_SX9CC3Onrw2Ra5unDB62qEMPMoTmaFAsw,7660312
4
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/__init__.py,sha256=UN-fc5KfBWQ-_qkm0Ajouh-T9tBGm5aUtuzBiH1tRtk,80
5
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/tf.py,sha256=fFRXNbeLlXzn5VOqYl7hcSuvOOtTDTiLi_Lpd9_l6wA,36
6
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/view.py,sha256=7KiLYGpTKaPJtFHZ6kjERdOzJiPSDUtkIKHbziHpkYk,928
7
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/visualization.py,sha256=6ET7YkZBuIWoJg2qVO-rPt3Nj4ZnezyvGAe458G4VGo,8201
8
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/__init__.cpython-310.pyc,sha256=tJrTajdA7hNO9tZkE1oN49rU-61lCNUED-mQXdAvzAs,261
9
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/tf.cpython-310.pyc,sha256=APWQ5-zKgbEcMnkv6Hxgj_Q46jpnuOyL9YbSrj6Z5Vw,204
10
+ cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/visualization.cpython-310.pyc,sha256=kMdmKY2LZKM4rkKm4j0y-TOMBQ3PeVIpbfB_YJxNz5c,6781
11
+ placo-0.6.0.dist-info/license/LICENSE,sha256=q2bBXvk4Eh7TmP11LoIOIGSUuJbR30JBI6ZZ37g52T4,1061
12
+ placo-0.6.0.dist-info/METADATA,sha256=bIXZzN9vthtBPRlowPrlUKkhCLV_VhPK1XcLJUTG-xA,2569
13
+ placo-0.6.0.dist-info/WHEEL,sha256=y7GzdFHC0qrZwnE2SqFjrXxL9NLtXflO9hVb0PhWwIU,115
14
+ placo-0.6.0.dist-info/top_level.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ placo-0.6.0.dist-info/RECORD,,
@@ -1,26 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: placo
3
- Version: 0.5.6
4
- Summary: PlaCo: Rhoban Planning and Control
5
- Requires-Python: >= 3.8
6
- License-Expression: MIT
7
- License-File: LICENSE
8
- Author-email: Rhoban team <team@rhoban.com>
9
- Project-URL: Changelog, https://github.com/rhoban/placo/blob/main/CHANGELOG.md
10
- Home-page: https://placo.readthedocs.io/en/latest/
11
- Project-URL: Repository, https://github.com/rhoban/placo.git
12
- Requires-Dist: cmeel
13
- Requires-Dist: eiquadprog >= 1.2.6, < 2
14
- Requires-Dist: pin >= 2.6.18, < 3
15
- Requires-Dist: rhoban-cmeel-jsoncpp
16
- Requires-Dist: meshcat
17
- Requires-Dist: numpy<2
18
- Requires-Dist: ischedule
19
- Provides-Extra: build
20
- Requires-Dist: pin[build] >= 2.6.18, < 3 ; extra == "build"
21
- Requires-Dist: cmeel-urdfdom[build] ; extra == "build"
22
- Description-Content-Type: text/markdown
23
-
24
- # Rhoban Planning and Control (placo)
25
-
26
- * [Documentation](https://placo.readthedocs.io/en/latest/)
@@ -1,14 +0,0 @@
1
- cmeel.prefix/lib/liblibplaco.so,sha256=fzs8u8zYuPud3Rxb0XtDoxebFfbmp-LVKWgk8WMzA14,2625456
2
- cmeel.prefix/lib/python3.10/site-packages/placo.pyi,sha256=O4XUe9BdLlLOwYqP8E8UHR5dX6RUYBHX3npfRdHir9A,155599
3
- cmeel.prefix/lib/python3.10/site-packages/placo.so,sha256=OWgoySsIDEx0L4KC1M5fHYRH9inaBcDKBDQGSyV_0-M,7598744
4
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/__init__.py,sha256=UN-fc5KfBWQ-_qkm0Ajouh-T9tBGm5aUtuzBiH1tRtk,80
5
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/tf.py,sha256=fFRXNbeLlXzn5VOqYl7hcSuvOOtTDTiLi_Lpd9_l6wA,36
6
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/visualization.py,sha256=EOXNjYKiOSE2F4vbEXoFJ4UBbGBUvC5v4ANjYL3IUVo,7440
7
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/__init__.cpython-310.pyc,sha256=tJrTajdA7hNO9tZkE1oN49rU-61lCNUED-mQXdAvzAs,261
8
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/tf.cpython-310.pyc,sha256=APWQ5-zKgbEcMnkv6Hxgj_Q46jpnuOyL9YbSrj6Z5Vw,204
9
- cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/visualization.cpython-310.pyc,sha256=csu-iQsBSz2cD40662EShITueJ9_KY5jhSLqDlItRew,6485
10
- placo-0.5.6.dist-info/license/LICENSE,sha256=q2bBXvk4Eh7TmP11LoIOIGSUuJbR30JBI6ZZ37g52T4,1061
11
- placo-0.5.6.dist-info/METADATA,sha256=mals_hZHHdNB65FpfsA0WysvcpcChih7nmDj7IidE64,875
12
- placo-0.5.6.dist-info/WHEEL,sha256=y7GzdFHC0qrZwnE2SqFjrXxL9NLtXflO9hVb0PhWwIU,115
13
- placo-0.5.6.dist-info/top_level.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- placo-0.5.6.dist-info/RECORD,,
File without changes