Skip to content

Commit 5ea2ad2

Browse files
authored
Ewellix Lift (#136) (#153)
Ewellix Lift - Add lift description - Add lifts to generators
1 parent 0a0dae2 commit 5ea2ad2

File tree

15 files changed

+363
-1
lines changed

15 files changed

+363
-1
lines changed

clearpath_generator_common/clearpath_generator_common/description/generator.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ def generate_manipulators(self) -> None:
205205
self.xacro_writer.write_comment('Manipulators')
206206
self.xacro_writer.write_newline()
207207
self.generate_arms()
208+
self.generate_lifts()
208209
self.generate_grippers()
209210

210211
def generate_arms(self) -> None:
@@ -257,6 +258,30 @@ def generate_grippers(self) -> None:
257258

258259
self.xacro_writer.write_newline()
259260

261+
def generate_lifts(self) -> None:
262+
lifts = self.clearpath_config.manipulators.get_all_lifts()
263+
for lift in lifts:
264+
lift_description = ManipulatorDescription(lift)
265+
266+
self.xacro_writer.write_comment(
267+
'{0}'.format(lift_description.name)
268+
)
269+
270+
self.xacro_writer.write_include(
271+
package=lift_description.package,
272+
file=lift_description.model,
273+
path=lift_description.path
274+
)
275+
276+
self.xacro_writer.write_macro(
277+
macro='{0}'.format(lift_description.model),
278+
parameters=lift_description.parameters,
279+
blocks=XacroWriter.add_origin(
280+
lift_description.xyz, lift_description.rpy)
281+
)
282+
283+
self.xacro_writer.write_newline()
284+
260285
def generate_extras(self) -> None:
261286
self.xacro_writer.write_comment('Extras')
262287
self.xacro_writer.write_newline()

clearpath_generator_common/clearpath_generator_common/description/manipulators.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
Robotiq2F140,
4444
Robotiq2F85
4545
)
46+
from clearpath_config.manipulators.types.lifts import (
47+
BaseLift,
48+
Ewellix
49+
)
4650
from clearpath_config.manipulators.types.manipulator import BaseManipulator
4751

4852

@@ -119,11 +123,23 @@ def __init__(self, arm: BaseArm) -> None:
119123
self.parameters.pop(self.PORT)
120124
self.parameters.update(arm.get_urdf_parameters())
121125

126+
class LiftDescription(BaseDescription):
127+
128+
def __init__(self, lift: BaseLift) -> None:
129+
super().__init__(lift)
130+
131+
class EwellixDescription(LiftDescription):
132+
133+
def __init__(self, lift: BaseLift) -> None:
134+
super().__init__(lift)
135+
self.parameters.update(lift.get_urdf_parameters())
136+
122137
MODEL = {
123138
KinovaGen3Dof6.MANIPULATOR_MODEL: KinovaArmDescription,
124139
KinovaGen3Dof7.MANIPULATOR_MODEL: KinovaArmDescription,
125140
KinovaGen3Lite.MANIPULATOR_MODEL: KinovaArmDescription,
126141
UniversalRobots.MANIPULATOR_MODEL: UniversalRobotsDescription,
142+
Ewellix.MANIPULATOR_MODEL: EwellixDescription,
127143
}
128144

129145
def __new__(cls, manipulator: BaseManipulator) -> BaseManipulator:

clearpath_generator_common/clearpath_generator_common/param/manipulators.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,25 @@ def generate_parameters(self, use_sim_time: bool = False) -> None:
127127
self.param_file.parameters = merge_dict(
128128
self.param_file.parameters, updated_parameters)
129129

130+
# Lifts
131+
for lift in self.clearpath_config.manipulators.get_all_lifts():
132+
# Lift Control Parameter File
133+
lift_param_file = ParamFile(
134+
name='control',
135+
package=Package('clearpath_manipulators_description'),
136+
path='config/%s/%s' % (
137+
lift.get_manipulator_type(),
138+
lift.get_manipulator_model()),
139+
parameters={}
140+
)
141+
lift_param_file.read()
142+
updated_parameters = replace_dict_items(
143+
lift_param_file.parameters,
144+
{r'${name}': lift.name}
145+
)
146+
self.param_file.parameters = merge_dict(
147+
self.param_file.parameters, updated_parameters)
148+
130149
def generate_parameter_file(self):
131150
param_writer = ParamWriter(self.param_file)
132151
param_writer.write_file()
@@ -258,6 +277,18 @@ def get_kinematics_parameters(self):
258277
r'${name}': gripper.name
259278
})
260279
parameter_file += kinematics_file
280+
# Lifts
281+
for lift in self.clearpath_config.manipulators.get_all_lifts():
282+
kinematics_file = MoveItParamFile(
283+
name=lift.get_manipulator_type(),
284+
path=parameter_directory,
285+
package=parameter_package
286+
)
287+
kinematics_file.read()
288+
kinematics_file.replace({
289+
r'${name}': lift.name
290+
})
291+
parameter_file += kinematics_file
261292
parameter_file.add_header('robot_description_kinematics')
262293
return parameter_file
263294

@@ -328,6 +359,26 @@ def get_moveit_controller_parameters(self, use_sim_time: bool = False) -> None:
328359
r'${name}': gripper.name
329360
})
330361
parameter_file += controller_file
362+
# Lifts
363+
for lift in self.clearpath_config.manipulators.get_all_lifts():
364+
controller_file = MoveItParamFile(
365+
name=parameter_name,
366+
path=os.path.join(
367+
parameter_directory,
368+
lift.get_manipulator_type(),
369+
lift.get_manipulator_model()
370+
),
371+
package=parameter_package
372+
)
373+
controller_name = lift.name
374+
if not use_sim_time:
375+
controller_name = 'manipulators/' + controller_name
376+
controller_file.read()
377+
controller_file.replace({
378+
r'${controller_name}': controller_name,
379+
r'${name}': lift.name
380+
})
381+
parameter_file += controller_file
331382
return parameter_file
332383

333384
# Joint Limits
@@ -375,6 +426,22 @@ def get_joint_limits_parameters(self):
375426
r'${name}': gripper.name
376427
})
377428
parameter_file += controller_file
429+
# Lifts
430+
for lift in self.clearpath_config.manipulators.get_all_lifts():
431+
controller_file = MoveItParamFile(
432+
name=parameter_name,
433+
path=os.path.join(
434+
parameter_directory,
435+
lift.get_manipulator_type(),
436+
lift.get_manipulator_model()
437+
),
438+
package=parameter_package
439+
)
440+
controller_file.read()
441+
controller_file.replace({
442+
r'${name}': lift.name
443+
})
444+
parameter_file += controller_file
378445
parameter_file.add_header('robot_description_planning')
379446
return parameter_file
380447

clearpath_generator_common/clearpath_generator_common/param/platform.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,26 @@ def generate_parameters(self, use_sim_time: bool = False) -> None:
161161
self.param_file.parameters = merge_dict(
162162
self.param_file.parameters, updated_parameters)
163163

164+
# Lift Control
165+
if self.parameter == PlatformParam.CONTROL and use_sim_time:
166+
for lift in self.clearpath_config.manipulators.get_all_lifts():
167+
# Arm Control Parameter File
168+
lift_param_file = ParamFile(
169+
name='control',
170+
package=Package('clearpath_manipulators_description'),
171+
path='config/%s/%s' % (
172+
lift.get_manipulator_type(),
173+
lift.get_manipulator_model()),
174+
parameters={}
175+
)
176+
lift_param_file.read()
177+
updated_parameters = replace_dict_items(
178+
lift_param_file.parameters,
179+
{r'${name}': lift.name}
180+
)
181+
self.param_file.parameters = merge_dict(
182+
self.param_file.parameters, updated_parameters)
183+
164184
# Get extra ros parameters from config
165185
extras = self.clearpath_config.platform.extras.ros_parameters
166186
for node in extras:

clearpath_generator_common/clearpath_generator_common/semantic_description/generator.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ def generate(self) -> None:
5151
self.generate_grippers()
5252
self.xacro_writer.write_newline()
5353

54+
# Lifts
55+
self.generate_lifts()
56+
self.xacro_writer.write_newline()
57+
5458
self.xacro_writer.close_file()
5559
print(f'Generated {self.xacro_writer.file_path}robot.srdf.xacro')
5660

@@ -105,4 +109,25 @@ def generate_grippers(self) -> None:
105109
self.xacro_writer.write_newline()
106110

107111
def generate_lifts(self) -> None:
108-
pass
112+
self.xacro_writer.write_comment('Lifts')
113+
self.xacro_writer.write_newline()
114+
lifts = self.clearpath_config.manipulators.get_all_lifts()
115+
for lift in lifts:
116+
lift_semantic_description = ManipulatorSemanticDescription(lift)
117+
118+
self.xacro_writer.write_comment(
119+
'{0}'.format(lift_semantic_description.name)
120+
)
121+
122+
self.xacro_writer.write_include(
123+
package=lift_semantic_description.package,
124+
file=lift_semantic_description.model,
125+
path=lift_semantic_description.path,
126+
)
127+
128+
self.xacro_writer.write_macro(
129+
macro='{0}'.format(lift_semantic_description.model),
130+
parameters=lift_semantic_description.parameters,
131+
)
132+
133+
self.xacro_writer.write_newline()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
controller_manager:
2+
ros__parameters:
3+
update_rate: 10 # Hz
4+
5+
joint_state_broadcaster:
6+
type: joint_state_broadcaster/JointStateBroadcaster
7+
8+
${name}_position_controller:
9+
type: position_controllers/JointGroupPositionController
10+
11+
${name}_position_controller:
12+
ros__parameters:
13+
joints:
14+
- ${name}_lower_joint
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
controller_manager:
2+
ros__parameters:
3+
update_rate: 10 # Hz
4+
5+
joint_state_broadcaster:
6+
type: joint_state_broadcaster/JointStateBroadcaster
7+
8+
${name}_position_controller:
9+
type: position_controllers/JointGroupPositionController
10+
11+
${name}_position_controller:
12+
ros__parameters:
13+
joints:
14+
- ${name}_lower_joint
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
controller_manager:
2+
ros__parameters:
3+
update_rate: 10 # Hz
4+
5+
joint_state_broadcaster:
6+
type: joint_state_broadcaster/JointStateBroadcaster
7+
8+
${name}_joint_trajectory_controller:
9+
type: joint_trajectory_controller/JointTrajectoryController
10+
11+
${name}_joint_trajectory_controller:
12+
ros__parameters:
13+
joints:
14+
- ${name}_lower_joint
15+
command_interfaces:
16+
- position
17+
state_interfaces:
18+
- position
19+
- velocity
20+
state_publish_rate: 10.0
21+
action_monitor_rate: 10.0
22+
allow_partial_joints_goal: false
23+
constraints:
24+
stopped_velocity_tolerance: 0.0
25+
goal_time: 0.0
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
initial_positions:
2+
${name}_upper_joint: 0.0
3+
${name}_lower_joint: 0.0
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
default_velocity_scaling_factor: 0.5
2+
default_acceleration_scaling_factor: 0.5
3+
4+
joint_limits:
5+
${name}_upper_joint:
6+
has_acceleration_limits: true
7+
max_acceleration: 1.0
8+
${name}_lower_joint:
9+
has_acceleration_limits: true
10+
max_acceleration: 1.0

0 commit comments

Comments
 (0)