@@ -80,6 +80,7 @@ def __init__(
80
80
tol : float = 1e-6 ,
81
81
mask : Union [ArrayLike , None ] = None ,
82
82
joint_limits : bool = True ,
83
+ seed : Union [int , None ] = None ,
83
84
):
84
85
"""
85
86
name: The name of the IK algorithm
@@ -102,6 +103,9 @@ def __init__(
102
103
self .ilimit = ilimit
103
104
self .tol = tol
104
105
106
+ # Random number generator
107
+ self ._private_random = np .random .default_rng (seed = seed )
108
+
105
109
if mask is None :
106
110
mask = np .ones (6 )
107
111
@@ -143,7 +147,6 @@ def solve(
143
147
# Initialise variables
144
148
E = 0.0
145
149
q = q0 [0 ]
146
- jl_valid = False
147
150
148
151
for search in range (self .slimit ):
149
152
q = q0 [search ].copy ()
@@ -254,6 +257,33 @@ def step(
254
257
"""
255
258
pass
256
259
260
+ def random_q (self , ets : "rtb.ETS" , i : int = 1 ) -> np .ndarray :
261
+ """
262
+ Generate a random valid joint configuration
263
+
264
+ :param i: number of configurations to generate
265
+
266
+ Generates a random q vector within the joint limits defined by
267
+ `self.qlim`.
268
+ """
269
+
270
+ if i == 1 :
271
+ q = np .zeros (ets .n )
272
+
273
+ for i in range (ets .n ):
274
+ q [i ] = self ._private_random .uniform (ets .qlim [0 , i ], ets .qlim [1 , i ])
275
+
276
+ else :
277
+ q = np .zeros ((i , ets .n ))
278
+
279
+ for j in range (i ):
280
+ for i in range (ets .n ):
281
+ q [j , i ] = self ._private_random .uniform (
282
+ ets .qlim [0 , i ], ets .qlim [1 , i ]
283
+ )
284
+
285
+ return q
286
+
257
287
258
288
def null_Σ (ets : "rtb.ETS" , q : np .ndarray , ps : float , pi : Optional [np .ndarray ]):
259
289
"""
0 commit comments