placo 0.6.3__0-cp310-cp310-manylinux_2_35_x86_64.whl → 0.6.5__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.
- cmeel.prefix/lib/liblibplaco.so +0 -0
- cmeel.prefix/lib/python3.10/site-packages/placo.pyi +553 -226
- cmeel.prefix/lib/python3.10/site-packages/placo.so +0 -0
- placo-0.6.5.dist-info/METADATA +62 -0
- {placo-0.6.3.dist-info → placo-0.6.5.dist-info}/RECORD +8 -8
- {placo-0.6.3.dist-info → placo-0.6.5.dist-info}/WHEEL +1 -1
- placo-0.6.3.dist-info/METADATA +0 -57
- {placo-0.6.3.dist-info/license → placo-0.6.5.dist-info/licenses}/LICENSE +0 -0
- {placo-0.6.3.dist-info → placo-0.6.5.dist-info}/top_level.txt +0 -0
cmeel.prefix/lib/liblibplaco.so
CHANGED
|
Binary file
|
|
@@ -45,6 +45,7 @@ HumanoidRobot = typing.NewType("HumanoidRobot", None)
|
|
|
45
45
|
HumanoidRobot_Side = typing.NewType("HumanoidRobot_Side", None)
|
|
46
46
|
Integrator = typing.NewType("Integrator", None)
|
|
47
47
|
IntegratorTrajectory = typing.NewType("IntegratorTrajectory", None)
|
|
48
|
+
JointSpaceHalfSpacesConstraint = typing.NewType("JointSpaceHalfSpacesConstraint", None)
|
|
48
49
|
JointsTask = typing.NewType("JointsTask", None)
|
|
49
50
|
KinematicsConstraint = typing.NewType("KinematicsConstraint", None)
|
|
50
51
|
KinematicsSolver = typing.NewType("KinematicsSolver", None)
|
|
@@ -56,10 +57,12 @@ ManipulabilityTask = typing.NewType("ManipulabilityTask", None)
|
|
|
56
57
|
OrientationTask = typing.NewType("OrientationTask", None)
|
|
57
58
|
PointContact = typing.NewType("PointContact", None)
|
|
58
59
|
PolygonConstraint = typing.NewType("PolygonConstraint", None)
|
|
60
|
+
Polynom = typing.NewType("Polynom", None)
|
|
59
61
|
PositionTask = typing.NewType("PositionTask", None)
|
|
60
62
|
Prioritized = typing.NewType("Prioritized", None)
|
|
61
63
|
Problem = typing.NewType("Problem", None)
|
|
62
64
|
ProblemConstraint = typing.NewType("ProblemConstraint", None)
|
|
65
|
+
ProblemPolynom = typing.NewType("ProblemPolynom", None)
|
|
63
66
|
PuppetContact = typing.NewType("PuppetContact", None)
|
|
64
67
|
QPError = typing.NewType("QPError", None)
|
|
65
68
|
RegularizationTask = typing.NewType("RegularizationTask", None)
|
|
@@ -68,6 +71,7 @@ RelativeOrientationTask = typing.NewType("RelativeOrientationTask", None)
|
|
|
68
71
|
RelativePositionTask = typing.NewType("RelativePositionTask", None)
|
|
69
72
|
RobotWrapper = typing.NewType("RobotWrapper", None)
|
|
70
73
|
RobotWrapper_State = typing.NewType("RobotWrapper_State", None)
|
|
74
|
+
Segment = typing.NewType("Segment", None)
|
|
71
75
|
Sparsity = typing.NewType("Sparsity", None)
|
|
72
76
|
SparsityInterval = typing.NewType("SparsityInterval", None)
|
|
73
77
|
Support = typing.NewType("Support", None)
|
|
@@ -81,9 +85,10 @@ SwingFootTrajectory = typing.NewType("SwingFootTrajectory", None)
|
|
|
81
85
|
Task = typing.NewType("Task", None)
|
|
82
86
|
TaskContact = typing.NewType("TaskContact", None)
|
|
83
87
|
Variable = typing.NewType("Variable", None)
|
|
88
|
+
WPGTrajectory = typing.NewType("WPGTrajectory", None)
|
|
89
|
+
WPGTrajectoryPart = typing.NewType("WPGTrajectoryPart", None)
|
|
84
90
|
WalkPatternGenerator = typing.NewType("WalkPatternGenerator", None)
|
|
85
91
|
WalkTasks = typing.NewType("WalkTasks", None)
|
|
86
|
-
WalkTrajectory = typing.NewType("WalkTrajectory", None)
|
|
87
92
|
WheelTask = typing.NewType("WheelTask", None)
|
|
88
93
|
map_indexing_suite_map_string_double_entry = typing.NewType("map_indexing_suite_map_string_double_entry", None)
|
|
89
94
|
map_string_double = typing.NewType("map_string_double", None)
|
|
@@ -2529,7 +2534,7 @@ class ExternalWrenchContact:
|
|
|
2529
2534
|
def __init__(
|
|
2530
2535
|
self: ExternalWrenchContact,
|
|
2531
2536
|
frame_index: any, # pinocchio::FrameIndex
|
|
2532
|
-
reference: any, # pinocchio::ReferenceFrame
|
|
2537
|
+
reference: any = None, # pinocchio::ReferenceFrame (default: pinocchio::LOCAL_WORLD_ALIGNED)
|
|
2533
2538
|
|
|
2534
2539
|
) -> any:
|
|
2535
2540
|
"""see DynamicsSolver::add_external_wrench_contact"""
|
|
@@ -2636,8 +2641,6 @@ class Footstep:
|
|
|
2636
2641
|
|
|
2637
2642
|
frame: numpy.ndarray # Eigen::Affine3d
|
|
2638
2643
|
|
|
2639
|
-
kick: bool # bool
|
|
2640
|
-
|
|
2641
2644
|
def overlap(
|
|
2642
2645
|
self: Footstep,
|
|
2643
2646
|
other: Footstep, # placo::humanoid::FootstepsPlanner::Footstep
|
|
@@ -2697,17 +2700,10 @@ class FootstepsPlanner:
|
|
|
2697
2700
|
:param parameters: Parameters of the walk"""
|
|
2698
2701
|
...
|
|
2699
2702
|
|
|
2700
|
-
@staticmethod
|
|
2701
|
-
def add_first_support(
|
|
2702
|
-
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
2703
|
-
support: Support, # placo::humanoid::FootstepsPlanner::Support
|
|
2704
|
-
|
|
2705
|
-
) -> None:
|
|
2706
|
-
...
|
|
2707
|
-
|
|
2708
2703
|
@staticmethod
|
|
2709
2704
|
def make_supports(
|
|
2710
2705
|
footsteps: list[Footstep], # std::vector<placo::humanoid::FootstepsPlanner::Footstep>
|
|
2706
|
+
t_start: float, # double
|
|
2711
2707
|
start: bool = True, # bool
|
|
2712
2708
|
middle: bool = False, # bool
|
|
2713
2709
|
end: bool = True, # bool
|
|
@@ -2745,14 +2741,6 @@ class FootstepsPlannerNaive:
|
|
|
2745
2741
|
) -> any:
|
|
2746
2742
|
...
|
|
2747
2743
|
|
|
2748
|
-
@staticmethod
|
|
2749
|
-
def add_first_support(
|
|
2750
|
-
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
2751
|
-
support: Support, # placo::humanoid::FootstepsPlanner::Support
|
|
2752
|
-
|
|
2753
|
-
) -> None:
|
|
2754
|
-
...
|
|
2755
|
-
|
|
2756
2744
|
def configure(
|
|
2757
2745
|
self: FootstepsPlannerNaive,
|
|
2758
2746
|
T_world_left_target: numpy.ndarray, # Eigen::Affine3d
|
|
@@ -2770,6 +2758,7 @@ class FootstepsPlannerNaive:
|
|
|
2770
2758
|
@staticmethod
|
|
2771
2759
|
def make_supports(
|
|
2772
2760
|
footsteps: list[Footstep], # std::vector<placo::humanoid::FootstepsPlanner::Footstep>
|
|
2761
|
+
t_start: float, # double
|
|
2773
2762
|
start: bool = True, # bool
|
|
2774
2763
|
middle: bool = False, # bool
|
|
2775
2764
|
end: bool = True, # bool
|
|
@@ -2824,14 +2813,6 @@ class FootstepsPlannerRepetitive:
|
|
|
2824
2813
|
) -> any:
|
|
2825
2814
|
...
|
|
2826
2815
|
|
|
2827
|
-
@staticmethod
|
|
2828
|
-
def add_first_support(
|
|
2829
|
-
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
2830
|
-
support: Support, # placo::humanoid::FootstepsPlanner::Support
|
|
2831
|
-
|
|
2832
|
-
) -> None:
|
|
2833
|
-
...
|
|
2834
|
-
|
|
2835
2816
|
def configure(
|
|
2836
2817
|
self: FootstepsPlannerRepetitive,
|
|
2837
2818
|
x: float, # double
|
|
@@ -2855,6 +2836,7 @@ class FootstepsPlannerRepetitive:
|
|
|
2855
2836
|
@staticmethod
|
|
2856
2837
|
def make_supports(
|
|
2857
2838
|
footsteps: list[Footstep], # std::vector<placo::humanoid::FootstepsPlanner::Footstep>
|
|
2839
|
+
t_start: float, # double
|
|
2858
2840
|
start: bool = True, # bool
|
|
2859
2841
|
middle: bool = False, # bool
|
|
2860
2842
|
end: bool = True, # bool
|
|
@@ -3064,7 +3046,7 @@ class HumanoidParameters:
|
|
|
3064
3046
|
self: HumanoidParameters,
|
|
3065
3047
|
|
|
3066
3048
|
) -> float:
|
|
3067
|
-
"""
|
|
3049
|
+
"""Default duration [s]of a double support."""
|
|
3068
3050
|
...
|
|
3069
3051
|
|
|
3070
3052
|
double_support_ratio: float # double
|
|
@@ -3075,14 +3057,14 @@ class HumanoidParameters:
|
|
|
3075
3057
|
self: HumanoidParameters,
|
|
3076
3058
|
|
|
3077
3059
|
) -> int:
|
|
3078
|
-
"""
|
|
3060
|
+
"""Default number of timesteps for one double support."""
|
|
3079
3061
|
...
|
|
3080
3062
|
|
|
3081
3063
|
def dt(
|
|
3082
3064
|
self: HumanoidParameters,
|
|
3083
3065
|
|
|
3084
3066
|
) -> float:
|
|
3085
|
-
"""
|
|
3067
|
+
"""Timestep duration for planning [s]."""
|
|
3086
3068
|
...
|
|
3087
3069
|
|
|
3088
3070
|
def ellipsoid_clip(
|
|
@@ -3120,34 +3102,16 @@ class HumanoidParameters:
|
|
|
3120
3102
|
"""Checks if the walk resulting from those parameters will have double supports."""
|
|
3121
3103
|
...
|
|
3122
3104
|
|
|
3123
|
-
def kick_support_duration(
|
|
3124
|
-
self: HumanoidParameters,
|
|
3125
|
-
|
|
3126
|
-
) -> float:
|
|
3127
|
-
"""Duration [s] of a kick support."""
|
|
3128
|
-
...
|
|
3129
|
-
|
|
3130
|
-
kick_support_ratio: float # double
|
|
3131
|
-
"""Duration ratio between single support and kick support.
|
|
3132
|
-
"""
|
|
3133
|
-
|
|
3134
|
-
def kick_support_timesteps(
|
|
3135
|
-
self: HumanoidParameters,
|
|
3136
|
-
|
|
3137
|
-
) -> int:
|
|
3138
|
-
"""Duration [timesteps]of a kick support."""
|
|
3139
|
-
...
|
|
3140
|
-
|
|
3141
3105
|
planned_timesteps: int # int
|
|
3142
3106
|
"""Planning horizon for the CoM trajectory.
|
|
3143
3107
|
"""
|
|
3144
3108
|
|
|
3145
3109
|
replan_timesteps: int # int
|
|
3146
|
-
"""Number of timesteps between each replan
|
|
3110
|
+
"""Number of timesteps between each replan for the CoM trajectory.
|
|
3147
3111
|
"""
|
|
3148
3112
|
|
|
3149
3113
|
single_support_duration: float # double
|
|
3150
|
-
"""
|
|
3114
|
+
"""Single support duration [s].
|
|
3151
3115
|
"""
|
|
3152
3116
|
|
|
3153
3117
|
single_support_timesteps: int # int
|
|
@@ -3158,18 +3122,18 @@ class HumanoidParameters:
|
|
|
3158
3122
|
self: HumanoidParameters,
|
|
3159
3123
|
|
|
3160
3124
|
) -> float:
|
|
3161
|
-
"""
|
|
3125
|
+
"""Default duration [s] of a start/end double support."""
|
|
3162
3126
|
...
|
|
3163
3127
|
|
|
3164
3128
|
startend_double_support_ratio: float # double
|
|
3165
|
-
"""Duration ratio between single support and double support.
|
|
3129
|
+
"""Duration ratio between single support and start/end double support.
|
|
3166
3130
|
"""
|
|
3167
3131
|
|
|
3168
3132
|
def startend_double_support_timesteps(
|
|
3169
3133
|
self: HumanoidParameters,
|
|
3170
3134
|
|
|
3171
3135
|
) -> int:
|
|
3172
|
-
"""
|
|
3136
|
+
"""Default number of timesteps for one start/end double support."""
|
|
3173
3137
|
...
|
|
3174
3138
|
|
|
3175
3139
|
walk_com_height: float # double
|
|
@@ -4001,7 +3965,7 @@ class Integrator:
|
|
|
4001
3965
|
"""Builds an expression for the given step and differentiation.
|
|
4002
3966
|
|
|
4003
3967
|
|
|
4004
|
-
:param step: the step
|
|
3968
|
+
:param step: the step, (if -1 the last step will be used)
|
|
4005
3969
|
|
|
4006
3970
|
:param diff: differentiation (if -1, the expression will be a vector of size order with all orders)
|
|
4007
3971
|
|
|
@@ -4106,6 +4070,50 @@ class IntegratorTrajectory:
|
|
|
4106
4070
|
...
|
|
4107
4071
|
|
|
4108
4072
|
|
|
4073
|
+
class JointSpaceHalfSpacesConstraint:
|
|
4074
|
+
A: numpy.ndarray # Eigen::MatrixXd
|
|
4075
|
+
"""Matrix A in Aq <= b.
|
|
4076
|
+
"""
|
|
4077
|
+
|
|
4078
|
+
def __init__(
|
|
4079
|
+
self: JointSpaceHalfSpacesConstraint,
|
|
4080
|
+
A: numpy.ndarray, # const Eigen::MatrixXd
|
|
4081
|
+
b: numpy.ndarray, # Eigen::VectorXd
|
|
4082
|
+
|
|
4083
|
+
) -> any:
|
|
4084
|
+
"""Ensures that, in joint-space we have Aq <= b Note that the floating base terms will be ignored in A. However, A should still be of dimension n_constraints x n_q."""
|
|
4085
|
+
...
|
|
4086
|
+
|
|
4087
|
+
b: numpy.ndarray # Eigen::VectorXd
|
|
4088
|
+
"""Vector b in Aq <= b.
|
|
4089
|
+
"""
|
|
4090
|
+
|
|
4091
|
+
def configure(
|
|
4092
|
+
self: JointSpaceHalfSpacesConstraint,
|
|
4093
|
+
name: str, # std::string
|
|
4094
|
+
priority: any, # placo::kinematics::ConeConstraint::Priority
|
|
4095
|
+
weight: float = 1.0, # double
|
|
4096
|
+
|
|
4097
|
+
) -> None:
|
|
4098
|
+
"""Configures the object.
|
|
4099
|
+
|
|
4100
|
+
|
|
4101
|
+
:param name: task name
|
|
4102
|
+
|
|
4103
|
+
:param priority: task priority (hard, soft or scaled)
|
|
4104
|
+
|
|
4105
|
+
:param weight: task weight"""
|
|
4106
|
+
...
|
|
4107
|
+
|
|
4108
|
+
name: str # std::string
|
|
4109
|
+
"""Object name.
|
|
4110
|
+
"""
|
|
4111
|
+
|
|
4112
|
+
priority: any # placo::kinematics::ConeConstraint::Priority
|
|
4113
|
+
"""Object priority.
|
|
4114
|
+
"""
|
|
4115
|
+
|
|
4116
|
+
|
|
4109
4117
|
class JointsTask:
|
|
4110
4118
|
A: numpy.ndarray # Eigen::MatrixXd
|
|
4111
4119
|
"""Matrix A in the task Ax = b, where x are the joint delta positions.
|
|
@@ -4374,7 +4382,7 @@ class KinematicsSolver:
|
|
|
4374
4382
|
def add_frame_task(
|
|
4375
4383
|
self: KinematicsSolver,
|
|
4376
4384
|
frame: str, # std::string
|
|
4377
|
-
T_world_frame: numpy.ndarray, # Eigen::Affine3d
|
|
4385
|
+
T_world_frame: numpy.ndarray = None, # Eigen::Affine3d (default: Eigen::Affine3d::Identity())
|
|
4378
4386
|
|
|
4379
4387
|
) -> FrameTask:
|
|
4380
4388
|
"""Adds a frame task, this is equivalent to a position + orientation task, resulting in decoupled tasks for a given frame.
|
|
@@ -4399,6 +4407,22 @@ class KinematicsSolver:
|
|
|
4399
4407
|
:return: gear task"""
|
|
4400
4408
|
...
|
|
4401
4409
|
|
|
4410
|
+
def add_joint_space_half_spaces_constraint(
|
|
4411
|
+
self: KinematicsSolver,
|
|
4412
|
+
A: numpy.ndarray, # Eigen::MatrixXd
|
|
4413
|
+
b: numpy.ndarray, # Eigen::VectorXd
|
|
4414
|
+
|
|
4415
|
+
) -> JointSpaceHalfSpacesConstraint:
|
|
4416
|
+
"""Adds a joint-space half-spaces constraint, such that Aq <= b.
|
|
4417
|
+
|
|
4418
|
+
|
|
4419
|
+
:param A: matrix A in Aq <= b
|
|
4420
|
+
|
|
4421
|
+
:param b: vector b in Aq <= b
|
|
4422
|
+
|
|
4423
|
+
:return: the constraint"""
|
|
4424
|
+
...
|
|
4425
|
+
|
|
4402
4426
|
def add_joints_task(
|
|
4403
4427
|
self: KinematicsSolver,
|
|
4404
4428
|
|
|
@@ -4760,11 +4784,12 @@ class LIPM:
|
|
|
4760
4784
|
def __init__(
|
|
4761
4785
|
self: LIPM,
|
|
4762
4786
|
problem: Problem, # placo::problem::Problem
|
|
4763
|
-
timesteps: int, # int
|
|
4764
4787
|
dt: float, # double
|
|
4788
|
+
timesteps: int, # int
|
|
4789
|
+
t_start: float, # double
|
|
4765
4790
|
initial_pos: numpy.ndarray, # Eigen::Vector2d
|
|
4766
|
-
initial_vel: numpy.ndarray, # Eigen::Vector2d
|
|
4767
|
-
initial_acc: numpy.ndarray, # Eigen::Vector2d
|
|
4791
|
+
initial_vel: numpy.ndarray = None, # Eigen::Vector2d (default: Eigen::Vector2d::Zero())
|
|
4792
|
+
initial_acc: numpy.ndarray = None, # Eigen::Vector2d (default: Eigen::Vector2d::Zero())
|
|
4768
4793
|
|
|
4769
4794
|
) -> any:
|
|
4770
4795
|
...
|
|
@@ -4776,6 +4801,17 @@ class LIPM:
|
|
|
4776
4801
|
) -> Expression:
|
|
4777
4802
|
...
|
|
4778
4803
|
|
|
4804
|
+
@staticmethod
|
|
4805
|
+
def build_LIPM_from_previous(
|
|
4806
|
+
problem: Problem, # placo::problem::Problem
|
|
4807
|
+
dt: float, # double
|
|
4808
|
+
timesteps: int, # int
|
|
4809
|
+
t_start: float, # double
|
|
4810
|
+
previous: LIPM, # placo::humanoid::LIPM
|
|
4811
|
+
|
|
4812
|
+
) -> LIPM:
|
|
4813
|
+
...
|
|
4814
|
+
|
|
4779
4815
|
@staticmethod
|
|
4780
4816
|
def compute_omega(
|
|
4781
4817
|
com_height: float, # double
|
|
@@ -4792,6 +4828,8 @@ class LIPM:
|
|
|
4792
4828
|
) -> Expression:
|
|
4793
4829
|
...
|
|
4794
4830
|
|
|
4831
|
+
dt: float # double
|
|
4832
|
+
|
|
4795
4833
|
def dzmp(
|
|
4796
4834
|
self: LIPM,
|
|
4797
4835
|
timestep: int, # int
|
|
@@ -4804,6 +4842,7 @@ class LIPM:
|
|
|
4804
4842
|
self: LIPM,
|
|
4805
4843
|
|
|
4806
4844
|
) -> LIPMTrajectory:
|
|
4845
|
+
"""Get the LIPM trajectory. Should be used after solving the problem."""
|
|
4807
4846
|
...
|
|
4808
4847
|
|
|
4809
4848
|
def jerk(
|
|
@@ -4820,6 +4859,12 @@ class LIPM:
|
|
|
4820
4859
|
) -> Expression:
|
|
4821
4860
|
...
|
|
4822
4861
|
|
|
4862
|
+
t_end: float # double
|
|
4863
|
+
|
|
4864
|
+
t_start: float # double
|
|
4865
|
+
|
|
4866
|
+
timesteps: int # int
|
|
4867
|
+
|
|
4823
4868
|
def vel(
|
|
4824
4869
|
self: LIPM,
|
|
4825
4870
|
timestep: int, # int
|
|
@@ -4829,8 +4874,12 @@ class LIPM:
|
|
|
4829
4874
|
|
|
4830
4875
|
x: Integrator # placo::problem::Integrator
|
|
4831
4876
|
|
|
4877
|
+
x_var: Variable # placo::problem::Variable
|
|
4878
|
+
|
|
4832
4879
|
y: Integrator # placo::problem::Integrator
|
|
4833
4880
|
|
|
4881
|
+
y_var: Variable # placo::problem::Variable
|
|
4882
|
+
|
|
4834
4883
|
def zmp(
|
|
4835
4884
|
self: LIPM,
|
|
4836
4885
|
timestep: int, # int
|
|
@@ -5215,6 +5264,43 @@ class PolygonConstraint:
|
|
|
5215
5264
|
...
|
|
5216
5265
|
|
|
5217
5266
|
|
|
5267
|
+
class Polynom:
|
|
5268
|
+
def __init__(
|
|
5269
|
+
self: Polynom,
|
|
5270
|
+
coefficients: numpy.ndarray, # Eigen::VectorXd
|
|
5271
|
+
|
|
5272
|
+
) -> any:
|
|
5273
|
+
...
|
|
5274
|
+
|
|
5275
|
+
coefficients: numpy.ndarray # Eigen::VectorXd
|
|
5276
|
+
"""coefficients, from highest to lowest
|
|
5277
|
+
"""
|
|
5278
|
+
|
|
5279
|
+
@staticmethod
|
|
5280
|
+
def derivative_coefficient(
|
|
5281
|
+
degree: int, # int
|
|
5282
|
+
derivative: int, # int
|
|
5283
|
+
|
|
5284
|
+
) -> int:
|
|
5285
|
+
...
|
|
5286
|
+
|
|
5287
|
+
def value(
|
|
5288
|
+
self: Polynom,
|
|
5289
|
+
x: float, # double
|
|
5290
|
+
derivative: int = 0, # int
|
|
5291
|
+
|
|
5292
|
+
) -> float:
|
|
5293
|
+
"""Computes the value of polynom.
|
|
5294
|
+
|
|
5295
|
+
|
|
5296
|
+
:param x: abscissa
|
|
5297
|
+
|
|
5298
|
+
:param derivative: differentiation order (0: p, 1: p', 2: p'' etc.)
|
|
5299
|
+
|
|
5300
|
+
:return: value"""
|
|
5301
|
+
...
|
|
5302
|
+
|
|
5303
|
+
|
|
5218
5304
|
class PositionTask:
|
|
5219
5305
|
A: numpy.ndarray # Eigen::MatrixXd
|
|
5220
5306
|
"""Matrix A in the task Ax = b, where x are the joint delta positions.
|
|
@@ -5496,6 +5582,43 @@ class ProblemConstraint:
|
|
|
5496
5582
|
"""
|
|
5497
5583
|
|
|
5498
5584
|
|
|
5585
|
+
class ProblemPolynom:
|
|
5586
|
+
"""Represents a polynom for which decision variables are problem coefficients.
|
|
5587
|
+
"""
|
|
5588
|
+
def __init__(
|
|
5589
|
+
self: ProblemPolynom,
|
|
5590
|
+
variable: Variable, # placo::problem::Variable
|
|
5591
|
+
|
|
5592
|
+
) -> any:
|
|
5593
|
+
...
|
|
5594
|
+
|
|
5595
|
+
def expr(
|
|
5596
|
+
self: ProblemPolynom,
|
|
5597
|
+
x: float, # double
|
|
5598
|
+
derivative: int = 0, # int
|
|
5599
|
+
|
|
5600
|
+
) -> Expression:
|
|
5601
|
+
"""Builds a problem expression for the value of the polynom.
|
|
5602
|
+
|
|
5603
|
+
|
|
5604
|
+
:param x: abscissa
|
|
5605
|
+
|
|
5606
|
+
:param derivative: differentiation order (0: p, 1: p', 2: p'' etc.)
|
|
5607
|
+
|
|
5608
|
+
:return: problem expression"""
|
|
5609
|
+
...
|
|
5610
|
+
|
|
5611
|
+
def get_polynom(
|
|
5612
|
+
self: ProblemPolynom,
|
|
5613
|
+
|
|
5614
|
+
) -> Polynom:
|
|
5615
|
+
"""Obtain resulting polynom (after problem is solved)
|
|
5616
|
+
|
|
5617
|
+
|
|
5618
|
+
:return:"""
|
|
5619
|
+
...
|
|
5620
|
+
|
|
5621
|
+
|
|
5499
5622
|
class PuppetContact:
|
|
5500
5623
|
def __init__(
|
|
5501
5624
|
self: PuppetContact,
|
|
@@ -6425,6 +6548,136 @@ class RobotWrapper_State:
|
|
|
6425
6548
|
"""
|
|
6426
6549
|
|
|
6427
6550
|
|
|
6551
|
+
class Segment:
|
|
6552
|
+
def __init__(
|
|
6553
|
+
self: Segment,
|
|
6554
|
+
start: numpy.ndarray, # const Eigen::Vector2d &
|
|
6555
|
+
end: numpy.ndarray, # const Eigen::Vector2d &
|
|
6556
|
+
|
|
6557
|
+
) -> any:
|
|
6558
|
+
...
|
|
6559
|
+
|
|
6560
|
+
end: numpy.ndarray # Eigen::Vector2d
|
|
6561
|
+
|
|
6562
|
+
def half_line_pass_through(
|
|
6563
|
+
self: Segment,
|
|
6564
|
+
s: Segment, # placo::tools::Segment
|
|
6565
|
+
|
|
6566
|
+
) -> bool:
|
|
6567
|
+
"""Checks if the half-line starting from the start of this segment and going through its end pass through another segment.
|
|
6568
|
+
|
|
6569
|
+
|
|
6570
|
+
:param s: The other segment.
|
|
6571
|
+
|
|
6572
|
+
:return: True if the intersection is a point of the other segment."""
|
|
6573
|
+
...
|
|
6574
|
+
|
|
6575
|
+
def intersects(
|
|
6576
|
+
self: Segment,
|
|
6577
|
+
s: Segment, # placo::tools::Segment
|
|
6578
|
+
|
|
6579
|
+
) -> bool:
|
|
6580
|
+
"""Checks if there is an intersection between this segment and another one, i.e. if the intersection of their guiding lines is a point of both segments.
|
|
6581
|
+
|
|
6582
|
+
|
|
6583
|
+
:param s: The other segment.
|
|
6584
|
+
|
|
6585
|
+
:return: True if there is an intersection."""
|
|
6586
|
+
...
|
|
6587
|
+
|
|
6588
|
+
def is_collinear(
|
|
6589
|
+
self: Segment,
|
|
6590
|
+
s: Segment, # placo::tools::Segment
|
|
6591
|
+
epsilon: float = 1e-6, # double
|
|
6592
|
+
|
|
6593
|
+
) -> bool:
|
|
6594
|
+
"""Checks if this segment is collinear with another one.
|
|
6595
|
+
|
|
6596
|
+
|
|
6597
|
+
:param s: The segment to check collinearity with.
|
|
6598
|
+
|
|
6599
|
+
:param epsilon: To account for floating point errors.
|
|
6600
|
+
|
|
6601
|
+
:return: True if the segments are collinear."""
|
|
6602
|
+
...
|
|
6603
|
+
|
|
6604
|
+
def is_parallel(
|
|
6605
|
+
self: Segment,
|
|
6606
|
+
s: Segment, # placo::tools::Segment
|
|
6607
|
+
epsilon: float = 1e-6, # double
|
|
6608
|
+
|
|
6609
|
+
) -> bool:
|
|
6610
|
+
"""Checks if this segment is parallel to another one.
|
|
6611
|
+
|
|
6612
|
+
|
|
6613
|
+
:param s: The segment to check parallelism with.
|
|
6614
|
+
|
|
6615
|
+
:param epsilon: To account for floating point errors.
|
|
6616
|
+
|
|
6617
|
+
:return: True if the segments are parallel."""
|
|
6618
|
+
...
|
|
6619
|
+
|
|
6620
|
+
def is_point_aligned(
|
|
6621
|
+
self: Segment,
|
|
6622
|
+
point: numpy.ndarray, # const Eigen::Vector2d &
|
|
6623
|
+
epsilon: float = 1e-6, # double
|
|
6624
|
+
|
|
6625
|
+
) -> bool:
|
|
6626
|
+
"""Checks if a point is aligned with this segment.
|
|
6627
|
+
|
|
6628
|
+
|
|
6629
|
+
:param point: The point to check alignment with.
|
|
6630
|
+
|
|
6631
|
+
:param epsilon: To account for floating point errors.
|
|
6632
|
+
|
|
6633
|
+
:return: True if the point is aligned with the segment."""
|
|
6634
|
+
...
|
|
6635
|
+
|
|
6636
|
+
def is_point_in_segment(
|
|
6637
|
+
self: Segment,
|
|
6638
|
+
point: numpy.ndarray, # const Eigen::Vector2d &
|
|
6639
|
+
epsilon: float = 1e-6, # double
|
|
6640
|
+
|
|
6641
|
+
) -> bool:
|
|
6642
|
+
"""Checks if a point is in the segment.
|
|
6643
|
+
|
|
6644
|
+
|
|
6645
|
+
:param point: The point to check.
|
|
6646
|
+
|
|
6647
|
+
:param epsilon: To account for floating point errors.
|
|
6648
|
+
|
|
6649
|
+
:return: True if the point is in the segment."""
|
|
6650
|
+
...
|
|
6651
|
+
|
|
6652
|
+
def line_pass_through(
|
|
6653
|
+
self: Segment,
|
|
6654
|
+
s: Segment, # placo::tools::Segment
|
|
6655
|
+
|
|
6656
|
+
) -> bool:
|
|
6657
|
+
"""Checks if the guiding line of another segment pass through this segment, i.e. if the intersection between the guiding lines of this segment and another one is a point of this segment.
|
|
6658
|
+
|
|
6659
|
+
|
|
6660
|
+
:param s: The other segment.
|
|
6661
|
+
|
|
6662
|
+
:return: True if the intersection is a point of this segment."""
|
|
6663
|
+
...
|
|
6664
|
+
|
|
6665
|
+
def lines_intersection(
|
|
6666
|
+
self: Segment,
|
|
6667
|
+
s: Segment, # placo::tools::Segment
|
|
6668
|
+
|
|
6669
|
+
) -> numpy.ndarray:
|
|
6670
|
+
"""Return the intersection between the guiding lines of this segment and another one.
|
|
6671
|
+
|
|
6672
|
+
|
|
6673
|
+
:param s: The other segment.
|
|
6674
|
+
|
|
6675
|
+
:return: The intersection point."""
|
|
6676
|
+
...
|
|
6677
|
+
|
|
6678
|
+
start: numpy.ndarray # Eigen::Vector2d
|
|
6679
|
+
|
|
6680
|
+
|
|
6428
6681
|
class Sparsity:
|
|
6429
6682
|
"""Internal helper to check the column sparsity of a matrix.
|
|
6430
6683
|
"""
|
|
@@ -6495,11 +6748,21 @@ class Support:
|
|
|
6495
6748
|
"""A support is a set of footsteps (can be one or two foot on the ground)
|
|
6496
6749
|
"""
|
|
6497
6750
|
def __init__(
|
|
6498
|
-
|
|
6751
|
+
self: Support,
|
|
6752
|
+
footsteps: list[Footstep], # std::vector<placo::humanoid::FootstepsPlanner::Footstep>
|
|
6753
|
+
|
|
6754
|
+
) -> any:
|
|
6755
|
+
...
|
|
6756
|
+
|
|
6757
|
+
def apply_offset(
|
|
6758
|
+
self: Support,
|
|
6759
|
+
offset: numpy.ndarray, # Eigen::Vector2d
|
|
6499
6760
|
|
|
6500
6761
|
) -> None:
|
|
6501
6762
|
...
|
|
6502
6763
|
|
|
6764
|
+
elapsed_ratio: float # double
|
|
6765
|
+
|
|
6503
6766
|
end: bool # bool
|
|
6504
6767
|
|
|
6505
6768
|
def footstep_frame(
|
|
@@ -6534,11 +6797,7 @@ class Support:
|
|
|
6534
6797
|
"""Checks whether this support is a double support."""
|
|
6535
6798
|
...
|
|
6536
6799
|
|
|
6537
|
-
|
|
6538
|
-
self: Support,
|
|
6539
|
-
|
|
6540
|
-
) -> bool:
|
|
6541
|
-
...
|
|
6800
|
+
replanned: bool # bool
|
|
6542
6801
|
|
|
6543
6802
|
def set_end(
|
|
6544
6803
|
arg1: Support,
|
|
@@ -6569,6 +6828,10 @@ class Support:
|
|
|
6569
6828
|
) -> list[numpy.ndarray]:
|
|
6570
6829
|
...
|
|
6571
6830
|
|
|
6831
|
+
t_start: float # double
|
|
6832
|
+
|
|
6833
|
+
time_ratio: float # double
|
|
6834
|
+
|
|
6572
6835
|
|
|
6573
6836
|
class Supports:
|
|
6574
6837
|
def __init__(
|
|
@@ -6634,11 +6897,13 @@ class SwingFootCubic:
|
|
|
6634
6897
|
@staticmethod
|
|
6635
6898
|
def make_trajectory(
|
|
6636
6899
|
t_start: float, # double
|
|
6637
|
-
|
|
6900
|
+
virt_duration: float, # double
|
|
6638
6901
|
height: float, # double
|
|
6639
6902
|
rise_ratio: float, # double
|
|
6640
6903
|
start: numpy.ndarray, # Eigen::Vector3d
|
|
6641
6904
|
target: numpy.ndarray, # Eigen::Vector3d
|
|
6905
|
+
elapsed_ratio: float = 0., # double
|
|
6906
|
+
start_vel: numpy.ndarray = None, # Eigen::Vector3d (default: Eigen::Vector3d::Zero())
|
|
6642
6907
|
|
|
6643
6908
|
) -> SwingFootCubicTrajectory:
|
|
6644
6909
|
...
|
|
@@ -6872,193 +7137,63 @@ class Variable:
|
|
|
6872
7137
|
"""
|
|
6873
7138
|
|
|
6874
7139
|
|
|
6875
|
-
class
|
|
7140
|
+
class WPGTrajectory:
|
|
6876
7141
|
def __init__(
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
7142
|
+
arg1: object,
|
|
7143
|
+
arg2: float,
|
|
7144
|
+
arg3: float,
|
|
7145
|
+
arg4: float,
|
|
6880
7146
|
|
|
6881
|
-
) ->
|
|
7147
|
+
) -> None:
|
|
6882
7148
|
...
|
|
6883
7149
|
|
|
6884
|
-
def
|
|
6885
|
-
self:
|
|
6886
|
-
|
|
6887
|
-
t_replan: float, # double
|
|
7150
|
+
def apply_transform(
|
|
7151
|
+
self: WPGTrajectory,
|
|
7152
|
+
T: numpy.ndarray, # Eigen::Affine3d
|
|
6888
7153
|
|
|
6889
|
-
) ->
|
|
6890
|
-
"""
|
|
7154
|
+
) -> None:
|
|
7155
|
+
"""Applies a given transformation to the left of all values issued by the trajectory."""
|
|
6891
7156
|
...
|
|
6892
7157
|
|
|
6893
|
-
|
|
6894
|
-
self: WalkPatternGenerator,
|
|
6895
|
-
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
6896
|
-
initial_com_world: numpy.ndarray, # Eigen::Vector3d
|
|
6897
|
-
t_start: float = 0., # double
|
|
6898
|
-
|
|
6899
|
-
) -> WalkTrajectory:
|
|
6900
|
-
"""Plan a walk trajectory following given footsteps based on the parameters of the WPG.
|
|
6901
|
-
|
|
6902
|
-
|
|
6903
|
-
:param supports: Supports generated from the foosteps to follow
|
|
6904
|
-
|
|
6905
|
-
:return: Planned trajectory"""
|
|
6906
|
-
...
|
|
6907
|
-
|
|
6908
|
-
def replan(
|
|
6909
|
-
self: WalkPatternGenerator,
|
|
6910
|
-
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
6911
|
-
old_trajectory: WalkTrajectory, # placo::humanoid::WalkPatternGenerator::Trajectory
|
|
6912
|
-
t_replan: float, # double
|
|
6913
|
-
|
|
6914
|
-
) -> WalkTrajectory:
|
|
6915
|
-
"""Update the walk trajectory to follow given footsteps based on the parameters of the WPG.
|
|
6916
|
-
|
|
6917
|
-
|
|
6918
|
-
:param supports: Supports generated from the current foosteps or the new ones to follow. Contain the current support
|
|
6919
|
-
|
|
6920
|
-
:param old_trajectory: Current walk trajectory
|
|
6921
|
-
|
|
6922
|
-
:param t_replan: The time (in the original trajectory) where the replan happens
|
|
6923
|
-
|
|
6924
|
-
:return: True if the trajectory have been replanned, false it hasn't"""
|
|
6925
|
-
...
|
|
6926
|
-
|
|
6927
|
-
def replan_supports(
|
|
6928
|
-
self: WalkPatternGenerator,
|
|
6929
|
-
planner: FootstepsPlanner, # placo::humanoid::FootstepsPlanner
|
|
6930
|
-
trajectory: WalkTrajectory, # placo::humanoid::WalkPatternGenerator::Trajectory
|
|
6931
|
-
t_replan: float, # double
|
|
6932
|
-
|
|
6933
|
-
) -> list[Support]:
|
|
6934
|
-
"""Replan the supports for a given trajectory given a footsteps planner."""
|
|
6935
|
-
...
|
|
6936
|
-
|
|
6937
|
-
|
|
6938
|
-
class WalkTasks:
|
|
6939
|
-
def __init__(
|
|
6940
|
-
arg1: object,
|
|
6941
|
-
|
|
6942
|
-
) -> None:
|
|
6943
|
-
...
|
|
6944
|
-
|
|
6945
|
-
com_x: float # double
|
|
6946
|
-
|
|
6947
|
-
com_y: float # double
|
|
6948
|
-
|
|
6949
|
-
def get_tasks_error(
|
|
6950
|
-
self: WalkTasks,
|
|
6951
|
-
|
|
6952
|
-
) -> any:
|
|
6953
|
-
...
|
|
6954
|
-
|
|
6955
|
-
def initialize_tasks(
|
|
6956
|
-
self: WalkTasks,
|
|
6957
|
-
solver: KinematicsSolver, # placo::kinematics::KinematicsSolver
|
|
6958
|
-
robot: HumanoidRobot, # placo::humanoid::HumanoidRobot
|
|
6959
|
-
|
|
6960
|
-
) -> None:
|
|
6961
|
-
...
|
|
6962
|
-
|
|
6963
|
-
left_foot_task: FrameTask # placo::kinematics::FrameTask
|
|
6964
|
-
|
|
6965
|
-
def reach_initial_pose(
|
|
6966
|
-
self: WalkTasks,
|
|
6967
|
-
T_world_left: numpy.ndarray, # Eigen::Affine3d
|
|
6968
|
-
feet_spacing: float, # double
|
|
6969
|
-
com_height: float, # double
|
|
6970
|
-
trunk_pitch: float, # double
|
|
6971
|
-
|
|
6972
|
-
) -> None:
|
|
6973
|
-
...
|
|
6974
|
-
|
|
6975
|
-
def remove_tasks(
|
|
6976
|
-
self: WalkTasks,
|
|
6977
|
-
|
|
6978
|
-
) -> None:
|
|
6979
|
-
...
|
|
6980
|
-
|
|
6981
|
-
right_foot_task: FrameTask # placo::kinematics::FrameTask
|
|
6982
|
-
|
|
6983
|
-
scaled: bool # bool
|
|
6984
|
-
|
|
6985
|
-
solver: KinematicsSolver # placo::kinematics::KinematicsSolver
|
|
6986
|
-
|
|
6987
|
-
trunk_mode: bool # bool
|
|
6988
|
-
|
|
6989
|
-
trunk_orientation_task: OrientationTask # placo::kinematics::OrientationTask
|
|
6990
|
-
|
|
6991
|
-
def update_tasks(
|
|
6992
|
-
self: WalkTasks,
|
|
6993
|
-
T_world_left: numpy.ndarray, # Eigen::Affine3d
|
|
6994
|
-
T_world_right: numpy.ndarray, # Eigen::Affine3d
|
|
6995
|
-
com_world: numpy.ndarray, # Eigen::Vector3d
|
|
6996
|
-
R_world_trunk: numpy.ndarray, # Eigen::Matrix3d
|
|
6997
|
-
|
|
6998
|
-
) -> None:
|
|
6999
|
-
...
|
|
7000
|
-
|
|
7001
|
-
def update_tasks_from_trajectory(
|
|
7002
|
-
arg1: WalkTasks,
|
|
7003
|
-
arg2: WalkTrajectory,
|
|
7004
|
-
arg3: float,
|
|
7005
|
-
|
|
7006
|
-
) -> None:
|
|
7007
|
-
...
|
|
7008
|
-
|
|
7009
|
-
|
|
7010
|
-
class WalkTrajectory:
|
|
7011
|
-
def __init__(
|
|
7012
|
-
arg1: object,
|
|
7013
|
-
|
|
7014
|
-
) -> None:
|
|
7015
|
-
...
|
|
7016
|
-
|
|
7017
|
-
def apply_transform(
|
|
7018
|
-
self: WalkTrajectory,
|
|
7019
|
-
T: numpy.ndarray, # Eigen::Affine3d
|
|
7020
|
-
|
|
7021
|
-
) -> None:
|
|
7022
|
-
"""Applies a given transformation to the left of all values issued by the trajectory."""
|
|
7023
|
-
...
|
|
7158
|
+
com_target_z: float # double
|
|
7024
7159
|
|
|
7025
7160
|
def get_R_world_trunk(
|
|
7026
|
-
self:
|
|
7161
|
+
self: WPGTrajectory,
|
|
7027
7162
|
t: float, # double
|
|
7028
7163
|
|
|
7029
7164
|
) -> numpy.ndarray:
|
|
7030
7165
|
...
|
|
7031
7166
|
|
|
7032
7167
|
def get_T_world_left(
|
|
7033
|
-
self:
|
|
7168
|
+
self: WPGTrajectory,
|
|
7034
7169
|
t: float, # double
|
|
7035
7170
|
|
|
7036
7171
|
) -> numpy.ndarray:
|
|
7037
7172
|
...
|
|
7038
7173
|
|
|
7039
7174
|
def get_T_world_right(
|
|
7040
|
-
self:
|
|
7175
|
+
self: WPGTrajectory,
|
|
7041
7176
|
t: float, # double
|
|
7042
7177
|
|
|
7043
7178
|
) -> numpy.ndarray:
|
|
7044
7179
|
...
|
|
7045
7180
|
|
|
7046
7181
|
def get_a_world_CoM(
|
|
7047
|
-
self:
|
|
7182
|
+
self: WPGTrajectory,
|
|
7048
7183
|
t: float, # double
|
|
7049
7184
|
|
|
7050
7185
|
) -> numpy.ndarray:
|
|
7051
7186
|
...
|
|
7052
7187
|
|
|
7053
7188
|
def get_j_world_CoM(
|
|
7054
|
-
self:
|
|
7189
|
+
self: WPGTrajectory,
|
|
7055
7190
|
t: float, # double
|
|
7056
7191
|
|
|
7057
7192
|
) -> numpy.ndarray:
|
|
7058
7193
|
...
|
|
7059
7194
|
|
|
7060
7195
|
def get_next_support(
|
|
7061
|
-
self:
|
|
7196
|
+
self: WPGTrajectory,
|
|
7062
7197
|
t: float, # double
|
|
7063
7198
|
n: int = 1, # int
|
|
7064
7199
|
|
|
@@ -7067,14 +7202,14 @@ class WalkTrajectory:
|
|
|
7067
7202
|
...
|
|
7068
7203
|
|
|
7069
7204
|
def get_p_world_CoM(
|
|
7070
|
-
self:
|
|
7205
|
+
self: WPGTrajectory,
|
|
7071
7206
|
t: float, # double
|
|
7072
7207
|
|
|
7073
7208
|
) -> numpy.ndarray:
|
|
7074
7209
|
...
|
|
7075
7210
|
|
|
7076
7211
|
def get_p_world_DCM(
|
|
7077
|
-
self:
|
|
7212
|
+
self: WPGTrajectory,
|
|
7078
7213
|
t: float, # double
|
|
7079
7214
|
omega: float, # double
|
|
7080
7215
|
|
|
@@ -7082,7 +7217,7 @@ class WalkTrajectory:
|
|
|
7082
7217
|
...
|
|
7083
7218
|
|
|
7084
7219
|
def get_p_world_ZMP(
|
|
7085
|
-
self:
|
|
7220
|
+
self: WPGTrajectory,
|
|
7086
7221
|
t: float, # double
|
|
7087
7222
|
omega: float, # double
|
|
7088
7223
|
|
|
@@ -7090,7 +7225,7 @@ class WalkTrajectory:
|
|
|
7090
7225
|
...
|
|
7091
7226
|
|
|
7092
7227
|
def get_part_t_start(
|
|
7093
|
-
self:
|
|
7228
|
+
self: WPGTrajectory,
|
|
7094
7229
|
t: float, # double
|
|
7095
7230
|
|
|
7096
7231
|
) -> float:
|
|
@@ -7098,7 +7233,7 @@ class WalkTrajectory:
|
|
|
7098
7233
|
...
|
|
7099
7234
|
|
|
7100
7235
|
def get_prev_support(
|
|
7101
|
-
self:
|
|
7236
|
+
self: WPGTrajectory,
|
|
7102
7237
|
t: float, # double
|
|
7103
7238
|
n: int = 1, # int
|
|
7104
7239
|
|
|
@@ -7107,7 +7242,7 @@ class WalkTrajectory:
|
|
|
7107
7242
|
...
|
|
7108
7243
|
|
|
7109
7244
|
def get_support(
|
|
7110
|
-
self:
|
|
7245
|
+
self: WPGTrajectory,
|
|
7111
7246
|
t: float, # double
|
|
7112
7247
|
|
|
7113
7248
|
) -> Support:
|
|
@@ -7115,29 +7250,50 @@ class WalkTrajectory:
|
|
|
7115
7250
|
...
|
|
7116
7251
|
|
|
7117
7252
|
def get_supports(
|
|
7118
|
-
self:
|
|
7253
|
+
self: WPGTrajectory,
|
|
7119
7254
|
|
|
7120
7255
|
) -> list[Support]:
|
|
7121
7256
|
...
|
|
7122
7257
|
|
|
7123
7258
|
def get_v_world_CoM(
|
|
7124
|
-
self:
|
|
7259
|
+
self: WPGTrajectory,
|
|
7260
|
+
t: float, # double
|
|
7261
|
+
|
|
7262
|
+
) -> numpy.ndarray:
|
|
7263
|
+
...
|
|
7264
|
+
|
|
7265
|
+
def get_v_world_foot(
|
|
7266
|
+
self: WPGTrajectory,
|
|
7267
|
+
side: any, # placo::humanoid::HumanoidRobot::Side
|
|
7268
|
+
t: float, # double
|
|
7269
|
+
|
|
7270
|
+
) -> numpy.ndarray:
|
|
7271
|
+
...
|
|
7272
|
+
|
|
7273
|
+
def get_v_world_right(
|
|
7274
|
+
self: WPGTrajectory,
|
|
7125
7275
|
t: float, # double
|
|
7126
7276
|
|
|
7127
7277
|
) -> numpy.ndarray:
|
|
7128
7278
|
...
|
|
7129
7279
|
|
|
7130
|
-
|
|
7280
|
+
kept_ts: int # int
|
|
7281
|
+
|
|
7282
|
+
def print_parts_timings(
|
|
7283
|
+
self: WPGTrajectory,
|
|
7284
|
+
|
|
7285
|
+
) -> None:
|
|
7286
|
+
...
|
|
7131
7287
|
|
|
7132
7288
|
def support_is_both(
|
|
7133
|
-
self:
|
|
7289
|
+
self: WPGTrajectory,
|
|
7134
7290
|
t: float, # double
|
|
7135
7291
|
|
|
7136
7292
|
) -> bool:
|
|
7137
7293
|
...
|
|
7138
7294
|
|
|
7139
7295
|
def support_side(
|
|
7140
|
-
self:
|
|
7296
|
+
self: WPGTrajectory,
|
|
7141
7297
|
t: float, # double
|
|
7142
7298
|
|
|
7143
7299
|
) -> any:
|
|
@@ -7147,6 +7303,177 @@ class WalkTrajectory:
|
|
|
7147
7303
|
|
|
7148
7304
|
t_start: float # double
|
|
7149
7305
|
|
|
7306
|
+
trunk_pitch: float # double
|
|
7307
|
+
|
|
7308
|
+
trunk_roll: float # double
|
|
7309
|
+
|
|
7310
|
+
|
|
7311
|
+
class WPGTrajectoryPart:
|
|
7312
|
+
def __init__(
|
|
7313
|
+
arg1: object,
|
|
7314
|
+
arg2: Support,
|
|
7315
|
+
arg3: float,
|
|
7316
|
+
|
|
7317
|
+
) -> None:
|
|
7318
|
+
...
|
|
7319
|
+
|
|
7320
|
+
support: Support # placo::humanoid::FootstepsPlanner::Support
|
|
7321
|
+
|
|
7322
|
+
t_end: float # double
|
|
7323
|
+
|
|
7324
|
+
t_start: float # double
|
|
7325
|
+
|
|
7326
|
+
|
|
7327
|
+
class WalkPatternGenerator:
|
|
7328
|
+
def __init__(
|
|
7329
|
+
self: WalkPatternGenerator,
|
|
7330
|
+
robot: HumanoidRobot, # placo::humanoid::HumanoidRobot
|
|
7331
|
+
parameters: HumanoidParameters, # placo::humanoid::HumanoidParameters
|
|
7332
|
+
|
|
7333
|
+
) -> any:
|
|
7334
|
+
...
|
|
7335
|
+
|
|
7336
|
+
def can_replan_supports(
|
|
7337
|
+
self: WalkPatternGenerator,
|
|
7338
|
+
trajectory: WPGTrajectory, # placo::humanoid::WalkPatternGenerator::Trajectory
|
|
7339
|
+
t_replan: float, # double
|
|
7340
|
+
|
|
7341
|
+
) -> bool:
|
|
7342
|
+
"""Checks if a trajectory can be replanned for supports."""
|
|
7343
|
+
...
|
|
7344
|
+
|
|
7345
|
+
def compute_next_support(
|
|
7346
|
+
self: WalkPatternGenerator,
|
|
7347
|
+
t: float, # double
|
|
7348
|
+
current_support: Support, # placo::humanoid::FootstepsPlanner::Support
|
|
7349
|
+
next_support: Support, # placo::humanoid::FootstepsPlanner::Support
|
|
7350
|
+
world_measured_dcm: numpy.ndarray, # Eigen::Vector2d
|
|
7351
|
+
world_initial_dcm: numpy.ndarray, # Eigen::Vector2d
|
|
7352
|
+
|
|
7353
|
+
) -> any:
|
|
7354
|
+
"""Computes the position and time of the next support ensuring the DCM viability based on the measured DCM.
|
|
7355
|
+
|
|
7356
|
+
|
|
7357
|
+
:param TODO:"""
|
|
7358
|
+
...
|
|
7359
|
+
|
|
7360
|
+
def plan(
|
|
7361
|
+
self: WalkPatternGenerator,
|
|
7362
|
+
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
7363
|
+
initial_com_world: numpy.ndarray, # Eigen::Vector3d
|
|
7364
|
+
t_start: float = 0., # double
|
|
7365
|
+
|
|
7366
|
+
) -> WPGTrajectory:
|
|
7367
|
+
"""Plans a walk trajectory following given footsteps based on the parameters of the WPG.
|
|
7368
|
+
|
|
7369
|
+
|
|
7370
|
+
:param supports: Supports generated from the foosteps to follow
|
|
7371
|
+
|
|
7372
|
+
:return: Planned trajectory"""
|
|
7373
|
+
...
|
|
7374
|
+
|
|
7375
|
+
def replan(
|
|
7376
|
+
self: WalkPatternGenerator,
|
|
7377
|
+
supports: list[Support], # std::vector<placo::humanoid::FootstepsPlanner::Support>
|
|
7378
|
+
old_trajectory: WPGTrajectory, # placo::humanoid::WalkPatternGenerator::Trajectory
|
|
7379
|
+
t_replan: float, # double
|
|
7380
|
+
|
|
7381
|
+
) -> WPGTrajectory:
|
|
7382
|
+
"""Updates the walk trajectory to follow given footsteps based on the parameters of the WPG.
|
|
7383
|
+
|
|
7384
|
+
|
|
7385
|
+
:param supports: Supports generated from the current foosteps or the new ones to follow. Contain the current support
|
|
7386
|
+
|
|
7387
|
+
:param old_trajectory: Current walk trajectory
|
|
7388
|
+
|
|
7389
|
+
:param t_replan: The time (in the original trajectory) where the replan happens
|
|
7390
|
+
|
|
7391
|
+
:return: Updated trajectory"""
|
|
7392
|
+
...
|
|
7393
|
+
|
|
7394
|
+
def replan_supports(
|
|
7395
|
+
self: WalkPatternGenerator,
|
|
7396
|
+
planner: FootstepsPlanner, # placo::humanoid::FootstepsPlanner
|
|
7397
|
+
trajectory: WPGTrajectory, # placo::humanoid::WalkPatternGenerator::Trajectory
|
|
7398
|
+
t_replan: float, # double
|
|
7399
|
+
t_last_replan: float, # double
|
|
7400
|
+
|
|
7401
|
+
) -> list[Support]:
|
|
7402
|
+
"""Replans the supports for a given trajectory given a footsteps planner."""
|
|
7403
|
+
...
|
|
7404
|
+
|
|
7405
|
+
|
|
7406
|
+
class WalkTasks:
|
|
7407
|
+
def __init__(
|
|
7408
|
+
arg1: object,
|
|
7409
|
+
|
|
7410
|
+
) -> None:
|
|
7411
|
+
...
|
|
7412
|
+
|
|
7413
|
+
com_x: float # double
|
|
7414
|
+
|
|
7415
|
+
com_y: float # double
|
|
7416
|
+
|
|
7417
|
+
def get_tasks_error(
|
|
7418
|
+
self: WalkTasks,
|
|
7419
|
+
|
|
7420
|
+
) -> any:
|
|
7421
|
+
...
|
|
7422
|
+
|
|
7423
|
+
def initialize_tasks(
|
|
7424
|
+
self: WalkTasks,
|
|
7425
|
+
solver: KinematicsSolver, # placo::kinematics::KinematicsSolver
|
|
7426
|
+
robot: HumanoidRobot, # placo::humanoid::HumanoidRobot
|
|
7427
|
+
|
|
7428
|
+
) -> None:
|
|
7429
|
+
...
|
|
7430
|
+
|
|
7431
|
+
left_foot_task: FrameTask # placo::kinematics::FrameTask
|
|
7432
|
+
|
|
7433
|
+
def reach_initial_pose(
|
|
7434
|
+
self: WalkTasks,
|
|
7435
|
+
T_world_left: numpy.ndarray, # Eigen::Affine3d
|
|
7436
|
+
feet_spacing: float, # double
|
|
7437
|
+
com_height: float, # double
|
|
7438
|
+
trunk_pitch: float, # double
|
|
7439
|
+
|
|
7440
|
+
) -> None:
|
|
7441
|
+
...
|
|
7442
|
+
|
|
7443
|
+
def remove_tasks(
|
|
7444
|
+
self: WalkTasks,
|
|
7445
|
+
|
|
7446
|
+
) -> None:
|
|
7447
|
+
...
|
|
7448
|
+
|
|
7449
|
+
right_foot_task: FrameTask # placo::kinematics::FrameTask
|
|
7450
|
+
|
|
7451
|
+
scaled: bool # bool
|
|
7452
|
+
|
|
7453
|
+
solver: KinematicsSolver # placo::kinematics::KinematicsSolver
|
|
7454
|
+
|
|
7455
|
+
trunk_mode: bool # bool
|
|
7456
|
+
|
|
7457
|
+
trunk_orientation_task: OrientationTask # placo::kinematics::OrientationTask
|
|
7458
|
+
|
|
7459
|
+
def update_tasks(
|
|
7460
|
+
self: WalkTasks,
|
|
7461
|
+
T_world_left: numpy.ndarray, # Eigen::Affine3d
|
|
7462
|
+
T_world_right: numpy.ndarray, # Eigen::Affine3d
|
|
7463
|
+
com_world: numpy.ndarray, # Eigen::Vector3d
|
|
7464
|
+
R_world_trunk: numpy.ndarray, # Eigen::Matrix3d
|
|
7465
|
+
|
|
7466
|
+
) -> None:
|
|
7467
|
+
...
|
|
7468
|
+
|
|
7469
|
+
def update_tasks_from_trajectory(
|
|
7470
|
+
arg1: WalkTasks,
|
|
7471
|
+
arg2: WPGTrajectory,
|
|
7472
|
+
arg3: float,
|
|
7473
|
+
|
|
7474
|
+
) -> None:
|
|
7475
|
+
...
|
|
7476
|
+
|
|
7150
7477
|
|
|
7151
7478
|
class WheelTask:
|
|
7152
7479
|
A: numpy.ndarray # Eigen::MatrixXd
|
|
@@ -7567,4 +7894,4 @@ def wrap_angle(
|
|
|
7567
7894
|
...
|
|
7568
7895
|
|
|
7569
7896
|
|
|
7570
|
-
__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', '
|
|
7897
|
+
__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', 'JointSpaceHalfSpacesConstraint', 'JointsTask', 'KinematicsConstraint', 'KinematicsSolver', 'KineticEnergyRegularizationTask', 'ManipulabilityTask', 'OrientationTask', 'PositionTask', 'RegularizationTask', 'RelativeFrameTask', 'RelativeOrientationTask', 'RelativePositionTask', 'Task', 'WheelTask'], 'placo::tools': ['AxisesMask', 'CubicSpline', 'CubicSpline3D', 'Polynom', 'Prioritized', 'Segment'], 'placo::model': ['Collision', 'Distance', 'RobotWrapper', 'RobotWrapper_State'], 'placo::problem': ['Expression', 'Integrator', 'IntegratorTrajectory', 'PolygonConstraint', 'Problem', 'ProblemConstraint', 'ProblemPolynom', 'QPError', 'Sparsity', 'SparsityInterval', 'Variable'], 'placo::humanoid': ['Footstep', 'FootstepsPlanner', 'FootstepsPlannerNaive', 'FootstepsPlannerRepetitive', 'HumanoidParameters', 'HumanoidRobot', 'LIPM', 'LIPMTrajectory', 'Support', 'SwingFoot', 'SwingFootCubic', 'SwingFootCubicTrajectory', 'SwingFootQuintic', 'SwingFootQuinticTrajectory', 'SwingFootTrajectory', 'WPGTrajectory', 'WPGTrajectoryPart', 'WalkPatternGenerator', 'WalkTasks']}
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: placo
|
|
3
|
+
Version: 0.6.5
|
|
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
|
+
<img width="400" src="https://placo.readthedocs.io/en/latest/_static/placo.png" />
|
|
25
|
+
|
|
26
|
+
## Planning & Control
|
|
27
|
+
|
|
28
|
+
PlaCo is Rhoban's planning and control library. It is built on the top of [pinocchio](https://github.com/stack-of-tasks/pinocchio), [eiquadprog](https://github.com/stack-of-tasks/eiquadprog) QP solver, and fully written in C++ with Python bindings, allowing fast prototyping with good runtime performances. It features task-space inverse kinematics and dynamics (see below) high-level API for whole-body control tasks.
|
|
29
|
+
|
|
30
|
+
### Task-Space Inverse Kinematics
|
|
31
|
+
|
|
32
|
+
[](https://github.com/Rhoban/placo-examples/blob/master/kinematics/videos/quadruped_targets.mp4?raw=true)
|
|
33
|
+
|
|
34
|
+
High-level API to specify tasks for constrained inverse kinematics (IK).
|
|
35
|
+
|
|
36
|
+
- [See documentation](https://placo.readthedocs.io/en/latest/kinematics/getting_started.html)
|
|
37
|
+
- [Examples](https://placo.readthedocs.io/en/latest/kinematics/examples_gallery.html)
|
|
38
|
+
|
|
39
|
+
### Task-Space Inverse Dynamics
|
|
40
|
+
|
|
41
|
+
[](https://github.com/Rhoban/placo-examples/blob/master/dynamics/videos/megabot.mp4?raw=true)
|
|
42
|
+
|
|
43
|
+
High-level API to specify tasks for constrained inverse dynamics (ID).
|
|
44
|
+
|
|
45
|
+
- [See documentation](https://placo.readthedocs.io/en/latest/dynamics/getting_started.html)
|
|
46
|
+
- [Examples](https://placo.readthedocs.io/en/latest/dynamics/examples_gallery.html)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
## Installing
|
|
50
|
+
|
|
51
|
+
PlaCo can be installed from ``pip``
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
pip install placo
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Or [built from sources](https://placo.readthedocs.io/en/latest/basics/installation_source.html)
|
|
58
|
+
|
|
59
|
+
## Resources
|
|
60
|
+
|
|
61
|
+
* [Documentation](https://placo.readthedocs.io/en/latest/)
|
|
62
|
+
* [Examples](https://github.com/rhoban/placo-examples) repository
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
cmeel.prefix/lib/liblibplaco.so,sha256=
|
|
2
|
-
cmeel.prefix/lib/python3.10/site-packages/placo.pyi,sha256=
|
|
3
|
-
cmeel.prefix/lib/python3.10/site-packages/placo.so,sha256=
|
|
1
|
+
cmeel.prefix/lib/liblibplaco.so,sha256=JHPCSivZCpUJilIWFEzM8EC9fp7mWKb5UMiplzI6Y0Q,2619816
|
|
2
|
+
cmeel.prefix/lib/python3.10/site-packages/placo.pyi,sha256=7qqoiIhhkYkGKgIuYE9NV1InLRwFwO3VBMjnUnL2LaE,165405
|
|
3
|
+
cmeel.prefix/lib/python3.10/site-packages/placo.so,sha256=haijm8VCNbRolUpwCWsZuOmxRJxkr-4UjpuSwocy3X4,8201384
|
|
4
4
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/__init__.py,sha256=UN-fc5KfBWQ-_qkm0Ajouh-T9tBGm5aUtuzBiH1tRtk,80
|
|
5
5
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/tf.py,sha256=fFRXNbeLlXzn5VOqYl7hcSuvOOtTDTiLi_Lpd9_l6wA,36
|
|
6
6
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/view.py,sha256=7KiLYGpTKaPJtFHZ6kjERdOzJiPSDUtkIKHbziHpkYk,928
|
|
@@ -8,8 +8,8 @@ cmeel.prefix/lib/python3.10/site-packages/placo_utils/visualization.py,sha256=6E
|
|
|
8
8
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/__init__.cpython-310.pyc,sha256=tJrTajdA7hNO9tZkE1oN49rU-61lCNUED-mQXdAvzAs,261
|
|
9
9
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/tf.cpython-310.pyc,sha256=APWQ5-zKgbEcMnkv6Hxgj_Q46jpnuOyL9YbSrj6Z5Vw,204
|
|
10
10
|
cmeel.prefix/lib/python3.10/site-packages/placo_utils/__pycache__/visualization.cpython-310.pyc,sha256=kMdmKY2LZKM4rkKm4j0y-TOMBQ3PeVIpbfB_YJxNz5c,6781
|
|
11
|
-
placo-0.6.
|
|
12
|
-
placo-0.6.
|
|
13
|
-
placo-0.6.
|
|
14
|
-
placo-0.6.
|
|
15
|
-
placo-0.6.
|
|
11
|
+
placo-0.6.5.dist-info/licenses/LICENSE,sha256=q2bBXvk4Eh7TmP11LoIOIGSUuJbR30JBI6ZZ37g52T4,1061
|
|
12
|
+
placo-0.6.5.dist-info/METADATA,sha256=lvTtWBMQSRl3ZM85U5-DlJ57HNEiDwpnD7cMrrxBNP4,2622
|
|
13
|
+
placo-0.6.5.dist-info/WHEEL,sha256=lhhHTnYbOJzqsg4pPctu5MqgY8RxNHlH5gszBU8FPYs,115
|
|
14
|
+
placo-0.6.5.dist-info/top_level.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
|
+
placo-0.6.5.dist-info/RECORD,,
|
placo-0.6.3.dist-info/METADATA
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: placo
|
|
3
|
-
Version: 0.6.3
|
|
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
|
-
[](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
|
-
[](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.
|
|
File without changes
|
|
File without changes
|