Add mjModel.sensor_intprm, integer parameters of sensors
PiperOrigin-RevId: 781053754 Change-Id: I90e5ef1cab3f87b894dbc70dccfc8bf0046ce1b6
This commit is contained in:
committed by
Copybara-Service
parent
9d64ed9575
commit
a3d251f552
@@ -444,6 +444,10 @@ shown in the table below. Their names are in the format ``mjKEY_XXX``. They corr
|
|||||||
- 5
|
- 5
|
||||||
- The maximal number of real-valued parameters used to define the impedance of each scalar constraint.
|
- The maximal number of real-valued parameters used to define the impedance of each scalar constraint.
|
||||||
Determines the size of all ``mjModel.XXX_solimp`` fields.
|
Determines the size of all ``mjModel.XXX_solimp`` fields.
|
||||||
|
* - ``mjNSENS``
|
||||||
|
- 2
|
||||||
|
- The number of sensor parameters.
|
||||||
|
Determines the size of ``mjModel.sensor_intprm``.
|
||||||
* - ``mjNSOLVER``
|
* - ``mjNSOLVER``
|
||||||
- 200
|
- 200
|
||||||
- The number of iterations where solver statistics can be stored in ``mjData.solver``. This array is used
|
- The number of iterations where solver statistics can be stored in ``mjData.solver``. This array is used
|
||||||
|
|||||||
@@ -1458,6 +1458,7 @@ struct mjModel_ {
|
|||||||
int* sensor_objid; // id of sensorized object (nsensor x 1)
|
int* sensor_objid; // id of sensorized object (nsensor x 1)
|
||||||
int* sensor_reftype; // type of reference frame (mjtObj) (nsensor x 1)
|
int* sensor_reftype; // type of reference frame (mjtObj) (nsensor x 1)
|
||||||
int* sensor_refid; // id of reference frame; -1: global frame (nsensor x 1)
|
int* sensor_refid; // id of reference frame; -1: global frame (nsensor x 1)
|
||||||
|
int* sensor_intprm; // sensor parameters (nsensor x mjNSENS)
|
||||||
int* sensor_dim; // number of scalar outputs (nsensor x 1)
|
int* sensor_dim; // number of scalar outputs (nsensor x 1)
|
||||||
int* sensor_adr; // address in sensor array (nsensor x 1)
|
int* sensor_adr; // address in sensor array (nsensor x 1)
|
||||||
mjtNum* sensor_cutoff; // cutoff for real and positive; 0: ignore (nsensor x 1)
|
mjtNum* sensor_cutoff; // cutoff for real and positive; 0: ignore (nsensor x 1)
|
||||||
@@ -2324,6 +2325,7 @@ typedef struct mjsSensor_ { // sensor specification
|
|||||||
mjString* objname; // name of sensorized object
|
mjString* objname; // name of sensorized object
|
||||||
mjtObj reftype; // type of referenced object
|
mjtObj reftype; // type of referenced object
|
||||||
mjString* refname; // name of referenced object
|
mjString* refname; // name of referenced object
|
||||||
|
int intprm[mjNSENS]; // integer parameters
|
||||||
|
|
||||||
// user-defined sensors
|
// user-defined sensors
|
||||||
mjtDataType datatype; // data type for sensor measurement
|
mjtDataType datatype; // data type for sensor measurement
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
#define mjNFLUID 12 // number of fluid interaction parameters
|
#define mjNFLUID 12 // number of fluid interaction parameters
|
||||||
#define mjNREF 2 // number of solver reference parameters
|
#define mjNREF 2 // number of solver reference parameters
|
||||||
#define mjNIMP 5 // number of solver impedance parameters
|
#define mjNIMP 5 // number of solver impedance parameters
|
||||||
|
#define mjNSENS 2 // number of sensor parameters
|
||||||
#define mjNSOLVER 200 // size of one mjData.solver array
|
#define mjNSOLVER 200 // size of one mjData.solver array
|
||||||
#define mjNISLAND 20 // number of mjData.solver arrays
|
#define mjNISLAND 20 // number of mjData.solver arrays
|
||||||
|
|
||||||
@@ -1130,6 +1131,7 @@ struct mjModel_ {
|
|||||||
int* sensor_objid; // id of sensorized object (nsensor x 1)
|
int* sensor_objid; // id of sensorized object (nsensor x 1)
|
||||||
int* sensor_reftype; // type of reference frame (mjtObj) (nsensor x 1)
|
int* sensor_reftype; // type of reference frame (mjtObj) (nsensor x 1)
|
||||||
int* sensor_refid; // id of reference frame; -1: global frame (nsensor x 1)
|
int* sensor_refid; // id of reference frame; -1: global frame (nsensor x 1)
|
||||||
|
int* sensor_intprm; // sensor parameters (nsensor x mjNSENS)
|
||||||
int* sensor_dim; // number of scalar outputs (nsensor x 1)
|
int* sensor_dim; // number of scalar outputs (nsensor x 1)
|
||||||
int* sensor_adr; // address in sensor array (nsensor x 1)
|
int* sensor_adr; // address in sensor array (nsensor x 1)
|
||||||
mjtNum* sensor_cutoff; // cutoff for real and positive; 0: ignore (nsensor x 1)
|
mjtNum* sensor_cutoff; // cutoff for real and positive; 0: ignore (nsensor x 1)
|
||||||
|
|||||||
@@ -692,6 +692,7 @@ typedef struct mjsSensor_ { // sensor specification
|
|||||||
mjString* objname; // name of sensorized object
|
mjString* objname; // name of sensorized object
|
||||||
mjtObj reftype; // type of referenced object
|
mjtObj reftype; // type of referenced object
|
||||||
mjString* refname; // name of referenced object
|
mjString* refname; // name of referenced object
|
||||||
|
int intprm[mjNSENS]; // integer parameters
|
||||||
|
|
||||||
// user-defined sensors
|
// user-defined sensors
|
||||||
mjtDataType datatype; // data type for sensor measurement
|
mjtDataType datatype; // data type for sensor measurement
|
||||||
|
|||||||
@@ -540,6 +540,7 @@
|
|||||||
X ( int, sensor_objid, nsensor, 1 ) \
|
X ( int, sensor_objid, nsensor, 1 ) \
|
||||||
X ( int, sensor_reftype, nsensor, 1 ) \
|
X ( int, sensor_reftype, nsensor, 1 ) \
|
||||||
X ( int, sensor_refid, nsensor, 1 ) \
|
X ( int, sensor_refid, nsensor, 1 ) \
|
||||||
|
X ( int, sensor_intprm, nsensor, mjNSENS ) \
|
||||||
X ( int, sensor_dim, nsensor, 1 ) \
|
X ( int, sensor_dim, nsensor, 1 ) \
|
||||||
X ( int, sensor_adr, nsensor, 1 ) \
|
X ( int, sensor_adr, nsensor, 1 ) \
|
||||||
X ( mjtNum, sensor_cutoff, nsensor, 1 ) \
|
X ( mjtNum, sensor_cutoff, nsensor, 1 ) \
|
||||||
|
|||||||
@@ -4149,6 +4149,14 @@ STRUCTS: Mapping[str, StructDecl] = dict([
|
|||||||
doc='id of reference frame; -1: global frame',
|
doc='id of reference frame; -1: global frame',
|
||||||
array_extent=('nsensor',),
|
array_extent=('nsensor',),
|
||||||
),
|
),
|
||||||
|
StructFieldDecl(
|
||||||
|
name='sensor_intprm',
|
||||||
|
type=PointerType(
|
||||||
|
inner_type=ValueType(name='int'),
|
||||||
|
),
|
||||||
|
doc='sensor parameters',
|
||||||
|
array_extent=('nsensor', 'mjNSENS'),
|
||||||
|
),
|
||||||
StructFieldDecl(
|
StructFieldDecl(
|
||||||
name='sensor_dim',
|
name='sensor_dim',
|
||||||
type=PointerType(
|
type=PointerType(
|
||||||
@@ -10388,6 +10396,14 @@ STRUCTS: Mapping[str, StructDecl] = dict([
|
|||||||
),
|
),
|
||||||
doc='name of referenced object',
|
doc='name of referenced object',
|
||||||
),
|
),
|
||||||
|
StructFieldDecl(
|
||||||
|
name='intprm',
|
||||||
|
type=ArrayType(
|
||||||
|
inner_type=ValueType(name='int'),
|
||||||
|
extents=(2,),
|
||||||
|
),
|
||||||
|
doc='integer parameters',
|
||||||
|
),
|
||||||
StructFieldDecl(
|
StructFieldDecl(
|
||||||
name='datatype',
|
name='datatype',
|
||||||
type=ValueType(name='mjtDataType'),
|
type=ValueType(name='mjtDataType'),
|
||||||
|
|||||||
@@ -3454,6 +3454,7 @@ void mjCModel::CopyObjects(mjModel* m) {
|
|||||||
m->sensor_objid[i] = psen->obj ? psen->obj->id : -1;
|
m->sensor_objid[i] = psen->obj ? psen->obj->id : -1;
|
||||||
m->sensor_reftype[i] = psen->reftype;
|
m->sensor_reftype[i] = psen->reftype;
|
||||||
m->sensor_refid[i] = psen->ref ? psen->ref->id : -1;
|
m->sensor_refid[i] = psen->ref ? psen->ref->id : -1;
|
||||||
|
mjuu_copyvec(m->sensor_intprm+i*mjNSENS, psen->intprm, mjNSENS);
|
||||||
m->sensor_dim[i] = psen->dim;
|
m->sensor_dim[i] = psen->dim;
|
||||||
m->sensor_cutoff[i] = (mjtNum)psen->cutoff;
|
m->sensor_cutoff[i] = (mjtNum)psen->cutoff;
|
||||||
m->sensor_noise[i] = (mjtNum)psen->noise;
|
m->sensor_noise[i] = (mjtNum)psen->noise;
|
||||||
|
|||||||
@@ -544,7 +544,37 @@ TEST_F(SensorTest, Clock) {
|
|||||||
mj_deleteModel(model);
|
mj_deleteModel(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
// test clock sensor
|
// test that integer parameters pass through
|
||||||
|
TEST_F(SensorTest, IntPrm) {
|
||||||
|
constexpr char xml[] = R"(
|
||||||
|
<mujoco>
|
||||||
|
<sensor>
|
||||||
|
<clock name="dummy"/>
|
||||||
|
</sensor>
|
||||||
|
</mujoco>
|
||||||
|
)";
|
||||||
|
ASSERT_EQ(mjNSENS, 2);
|
||||||
|
|
||||||
|
char err[1024];
|
||||||
|
mjSpec* spec = mj_parseXMLString(xml, 0, err, sizeof(err));
|
||||||
|
ASSERT_THAT(spec, NotNull()) << err;
|
||||||
|
|
||||||
|
mjModel* model = mj_compile(spec, nullptr);
|
||||||
|
EXPECT_EQ(model->sensor_intprm[0], 0);
|
||||||
|
EXPECT_EQ(model->sensor_intprm[1], 0);
|
||||||
|
mj_deleteModel(model);
|
||||||
|
|
||||||
|
mjsSensor* s = mjs_asSensor(mjs_findElement(spec, mjOBJ_SENSOR, "dummy"));
|
||||||
|
s->intprm[0] = 3;
|
||||||
|
s->intprm[1] = 4;
|
||||||
|
model = mj_compile(spec, nullptr);
|
||||||
|
EXPECT_EQ(model->sensor_intprm[0], 3);
|
||||||
|
EXPECT_EQ(model->sensor_intprm[1], 4);
|
||||||
|
mj_deleteModel(model);
|
||||||
|
mj_deleteSpec(spec);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test sequential collision sensors
|
||||||
TEST_F(SensorTest, CollisionSequential) {
|
TEST_F(SensorTest, CollisionSequential) {
|
||||||
constexpr char xml[] = R"(
|
constexpr char xml[] = R"(
|
||||||
<mujoco>
|
<mujoco>
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public const int mjNBIAS = 10;
|
|||||||
public const int mjNFLUID = 12;
|
public const int mjNFLUID = 12;
|
||||||
public const int mjNREF = 2;
|
public const int mjNREF = 2;
|
||||||
public const int mjNIMP = 5;
|
public const int mjNIMP = 5;
|
||||||
|
public const int mjNSENS = 2;
|
||||||
public const int mjNSOLVER = 200;
|
public const int mjNSOLVER = 200;
|
||||||
public const int mjNISLAND = 20;
|
public const int mjNISLAND = 20;
|
||||||
public const bool THIRD_PARTY_MUJOCO_INCLUDE_MJPLUGIN_H_ = true;
|
public const bool THIRD_PARTY_MUJOCO_INCLUDE_MJPLUGIN_H_ = true;
|
||||||
@@ -5683,6 +5684,7 @@ public unsafe struct mjModel_ {
|
|||||||
public int* sensor_objid;
|
public int* sensor_objid;
|
||||||
public int* sensor_reftype;
|
public int* sensor_reftype;
|
||||||
public int* sensor_refid;
|
public int* sensor_refid;
|
||||||
|
public int* sensor_intprm;
|
||||||
public int* sensor_dim;
|
public int* sensor_dim;
|
||||||
public int* sensor_adr;
|
public int* sensor_adr;
|
||||||
public double* sensor_cutoff;
|
public double* sensor_cutoff;
|
||||||
|
|||||||
Reference in New Issue
Block a user