diff --git a/doc/includes/references.h b/doc/includes/references.h index b97f2b93..35fd7ff1 100644 --- a/doc/includes/references.h +++ b/doc/includes/references.h @@ -347,8 +347,8 @@ struct mjData_ { mjtNum* qfrc_constraint; // constraint force (nv x 1) // computed by mj_inverse - mjtNum* qfrc_inverse; // net external force; should equal: (nv x 1) - // qfrc_applied + J'*xfrc_applied + qfrc_actuator + mjtNum* qfrc_inverse; // net external force; should equal: + // qfrc_applied + J'*xfrc_applied + qfrc_actuator (nv x 1) // computed by mj_sensorAcc/mj_rnePostConstraint if needed; rotation:translation format mjtNum* cacc; // com-based acceleration (nbody x 6) diff --git a/include/mujoco/mjdata.h b/include/mujoco/mjdata.h index 2b5eb7c6..b5b0373b 100644 --- a/include/mujoco/mjdata.h +++ b/include/mujoco/mjdata.h @@ -375,8 +375,8 @@ struct mjData_ { mjtNum* qfrc_constraint; // constraint force (nv x 1) // computed by mj_inverse - mjtNum* qfrc_inverse; // net external force; should equal: (nv x 1) - // qfrc_applied + J'*xfrc_applied + qfrc_actuator + mjtNum* qfrc_inverse; // net external force; should equal: + // qfrc_applied + J'*xfrc_applied + qfrc_actuator (nv x 1) // computed by mj_sensorAcc/mj_rnePostConstraint if needed; rotation:translation format mjtNum* cacc; // com-based acceleration (nbody x 6) diff --git a/python/mujoco/introspect/codegen/generate_structs.py b/python/mujoco/introspect/codegen/generate_structs.py index 1c50db22..24da6e2e 100644 --- a/python/mujoco/introspect/codegen/generate_structs.py +++ b/python/mujoco/introspect/codegen/generate_structs.py @@ -47,7 +47,7 @@ _EXCLUDED = ( 'mjResource_', ) -_ARRAY_COMMENT_PATTERN = re.compile(r'(.+?)\s\s+\((.+) x (.+)\)\Z') +_ARRAY_COMMENT_PATTERN = re.compile(r'(.+?)\s+\(([^\(\)]+) x ([^\(\)]+)\)\Z') def traverse(node, visitor): @@ -93,16 +93,19 @@ class MjStructVisitor: # No valid normalization, just parse the declname. return type_parsing.parse_type(declname) - def _make_comment(self, node: ClangJsonNode) -> str: + def _make_comment(self, node: ClangJsonNode, strip: bool = True) -> str: """Makes a comment string from a Clang AST FullComment node.""" kind = node.get('kind') if kind == 'TextComment': - return node['text'].replace('\N{NO-BREAK SPACE}', ' ').strip() + retval = node['text'].replace('\N{NO-BREAK SPACE}', ' ') else: strings = [] for child in node['inner']: - strings.append(self._make_comment(child)) - return ''.join(strings).strip() + strings.append(self._make_comment(child, strip=False)) + retval = ''.join(strings) + if strip: + retval = retval.strip() + return retval def _make_field( self, node: ClangJsonNode diff --git a/python/mujoco/introspect/structs.py b/python/mujoco/introspect/structs.py index 51799032..3db9e84c 100644 --- a/python/mujoco/introspect/structs.py +++ b/python/mujoco/introspect/structs.py @@ -1744,14 +1744,16 @@ STRUCTS: Mapping[str, StructDecl] = dict([ type=PointerType( inner_type=ValueType(name='mjtNum'), ), - doc='constraint solver reference:frictionloss (nv x mjNREF)', + doc='constraint solver reference:frictionloss', + array_extent=('nv', 'mjNREF'), ), StructFieldDecl( name='dof_solimp', type=PointerType( inner_type=ValueType(name='mjtNum'), ), - doc='constraint solver impedance:frictionloss (nv x mjNIMP)', + doc='constraint solver impedance:frictionloss', + array_extent=('nv', 'mjNIMP'), ), StructFieldDecl( name='dof_frictionloss', @@ -1958,7 +1960,8 @@ STRUCTS: Mapping[str, StructDecl] = dict([ type=PointerType( inner_type=ValueType(name='mjtNum'), ), - doc='detect contact if dist