New SDF objective function.
This solves the jittery behavior observed with the gear example in the case of small applied torques (~0.5). The new quadratic option has the form max(A, 0)^2/2 + max(B, 0)^2/2 - min(A, 0)*min(B, 0). This function has a minimum in the intersections of two SDFs A and B, while avoiding the flat areas which would be generated if only the clearance field A+B were employed. See for example [the function resulting from two colliding circles](https://www.wolframalpha.com/input?i=minimize+max%28sqrt%28x%5E2%2By%5E2%29-1%2C0%29%5E2+%2B+max%28sqrt%28%28x-1%29%5E2%2B%28y-1%29%5E2%29-1%2C0%29%5E2+-+2*min%28sqrt%28x%5E2%2By%5E2%29-1%2C0%29*min%28sqrt%28%28x-1%29%5E2%2B%28y-1%29%5E2%29-1%2C0%29) PiperOrigin-RevId: 583992855 Change-Id: I135a1b5931cd136d7d33cc275f8d361a8b7e290c
This commit is contained in:
committed by
Copybara-Service
parent
98082ae7f9
commit
dbf44fe2b4
@@ -24,10 +24,11 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum mjtSDFType_ {
|
||||
mjSDFTYPE_SINGLE = 0,
|
||||
mjSDFTYPE_INTERSECTION,
|
||||
mjSDFTYPE_AVERAGE,
|
||||
typedef enum mjtSDFType_ { // signed distance function (SDF) type
|
||||
mjSDFTYPE_SINGLE = 0, // single SDF
|
||||
mjSDFTYPE_INTERSECTION, // max(A, B)
|
||||
mjSDFTYPE_MIDSURFACE, // A - B
|
||||
mjSDFTYPE_QUADRATIC, // max(A, 0)^2/2 + max(B, 0)^2/2 + min(A, 0)*min(B, 0)
|
||||
} mjtSDFType;
|
||||
|
||||
struct mjSDF_ {
|
||||
|
||||
Reference in New Issue
Block a user