23
23
from rclpy .node import Node
24
24
25
25
CollisionMeshParams = namedtuple (
26
- "CollisionMeshParams" , ["filepath" , "position" , "quat_xyzw" , "frame_id" ]
26
+ "CollisionMeshParams" ,
27
+ [
28
+ "filepath" ,
29
+ "primitive_type" ,
30
+ "primitive_dims" ,
31
+ "position" ,
32
+ "quat_xyzw" ,
33
+ "frame_id" ,
34
+ ],
27
35
)
28
36
29
37
@@ -108,15 +116,47 @@ def load_parameters(self) -> None:
108
116
for object_id in object_ids .value :
109
117
filename = self .declare_parameter (
110
118
f"{ object_id } .filename" ,
119
+ None ,
111
120
descriptor = ParameterDescriptor (
112
121
name = "filename" ,
113
122
type = ParameterType .PARAMETER_STRING ,
114
- description = f"The filename of the mesh for the '{ object_id } ' object." ,
123
+ description = (
124
+ f"The filename of the mesh for the '{ object_id } ' object. "
125
+ "Either this or `primitive_type` and `primitive_dims` must "
126
+ "be specified."
127
+ ),
128
+ read_only = True ,
129
+ ),
130
+ )
131
+ primitive_type = self .declare_parameter (
132
+ f"{ object_id } .primitive_type" ,
133
+ None ,
134
+ descriptor = ParameterDescriptor (
135
+ name = "primitive_type" ,
136
+ type = ParameterType .PARAMETER_INTEGER ,
137
+ description = (
138
+ f"The primitive type of the '{ object_id } ' object. "
139
+ "Either this and `primitive_dims` must be defined, or `filename`."
140
+ ),
141
+ read_only = True ,
142
+ ),
143
+ )
144
+ primitive_dims = self .declare_parameter (
145
+ f"{ object_id } .primitive_dims" ,
146
+ None ,
147
+ descriptor = ParameterDescriptor (
148
+ name = "primitive_dims" ,
149
+ type = ParameterType .PARAMETER_DOUBLE_ARRAY ,
150
+ description = (
151
+ f"The dimensions of the '{ object_id } ' object. "
152
+ "Either this and `primitive_type` must be defined, or `filename`."
153
+ ),
115
154
read_only = True ,
116
155
),
117
156
)
118
157
position = self .declare_parameter (
119
158
f"{ object_id } .position" ,
159
+ None ,
120
160
descriptor = ParameterDescriptor (
121
161
name = "position" ,
122
162
type = ParameterType .PARAMETER_DOUBLE_ARRAY ,
@@ -126,6 +166,7 @@ def load_parameters(self) -> None:
126
166
)
127
167
quat_xyzw = self .declare_parameter (
128
168
f"{ object_id } .quat_xyzw" ,
169
+ None ,
129
170
descriptor = ParameterDescriptor (
130
171
name = "quat_xyzw" ,
131
172
type = ParameterType .PARAMETER_DOUBLE_ARRAY ,
@@ -138,6 +179,7 @@ def load_parameters(self) -> None:
138
179
)
139
180
frame_id = self .declare_parameter (
140
181
f"{ object_id } .frame_id" ,
182
+ None ,
141
183
descriptor = ParameterDescriptor (
142
184
name = "frame_id" ,
143
185
type = ParameterType .PARAMETER_STRING ,
@@ -147,8 +189,15 @@ def load_parameters(self) -> None:
147
189
)
148
190
149
191
# Add the object to the list of objects
192
+ filepath = (
193
+ None
194
+ if filename .value is None
195
+ else path .join (assets_dir .value , filename .value )
196
+ )
150
197
self .objects [object_id ] = CollisionMeshParams (
151
- filepath = path .join (assets_dir .value , filename .value ),
198
+ filepath = filepath ,
199
+ primitive_type = primitive_type .value ,
200
+ primitive_dims = primitive_dims .value ,
152
201
position = position .value ,
153
202
quat_xyzw = quat_xyzw .value ,
154
203
frame_id = frame_id .value ,
@@ -176,13 +225,23 @@ def initialize_planning_scene(self) -> None:
176
225
"""
177
226
# Add each object to the planning scene
178
227
for object_id , params in self .objects .items ():
179
- self .moveit2 .add_collision_mesh (
180
- id = object_id ,
181
- filepath = params .filepath ,
182
- position = params .position ,
183
- quat_xyzw = params .quat_xyzw ,
184
- frame_id = params .frame_id ,
185
- )
228
+ if params .primitive_type is None :
229
+ self .moveit2 .add_collision_mesh (
230
+ id = object_id ,
231
+ filepath = params .filepath ,
232
+ position = params .position ,
233
+ quat_xyzw = params .quat_xyzw ,
234
+ frame_id = params .frame_id ,
235
+ )
236
+ else :
237
+ self .moveit2 .add_collision_primitive (
238
+ id = object_id ,
239
+ prim_type = params .primitive_type ,
240
+ dims = params .primitive_dims ,
241
+ position = params .position ,
242
+ quat_xyzw = params .quat_xyzw ,
243
+ frame_id = params .frame_id ,
244
+ )
186
245
187
246
188
247
def main (args : List = None ) -> None :
0 commit comments