add ecaa9, techpod, flappy, blackbird

This commit is contained in:
Brian Delhaisse
2019-05-12 07:16:41 +02:00
parent 41927eb606
commit 763fd8d8d4
61 changed files with 7981 additions and 21 deletions
+6 -6
View File
@@ -305,7 +305,7 @@ class Body(object):
# just create setter
def _set_force(self, force):
"""Set the given force (expressed in the world cartesian frame) on the center of mass of the body."""
self.apply_force(link_id=-1, force=force, position=None, frame=Simulator.WORLD_FRAME)
self.apply_external_force(link_id=-1, force=force, position=None, frame=Simulator.WORLD_FRAME)
force = property(fset=_set_force)
@@ -322,7 +322,7 @@ class Body(object):
"""
self.sim.change_visual_shape(object_id=self.id, link_id=link_id, rgba_color=color)
def apply_force(self, link_id=-1, force=(0., 0., 0.), position=None, frame=Simulator.LINK_FRAME):
def apply_external_force(self, force=(0., 0., 0.), link_id=-1, position=None, frame=Simulator.LINK_FRAME):
"""
Apply the given force on the specified link of the current body.
@@ -331,17 +331,17 @@ class Body(object):
- this does not work when using `sim.setRealTimeSimulation(1)`.
Args:
link_id (int): link id to apply the force, if -1 it will apply the force on the base
force (np.array[3]): Cartesian forces to be applied on the body
link_id (int): link id to apply the force, if -1 it will apply the force on the base
position (np.array[3], None): position on the link where the force is applied (expressed in the given
cartesian frame, see next attribute :attr:`frame`). If None, it is the center of mass of the body
(or the link if specified).
frame (int): allows to specify the coordinate system of force/position. sim.LINK_FRAME (=1) for local
link frame, and sim.WORLD_FRAME (=2) for world frame. By default, it is the world frame.
"""
self.sim.apply_external_force(self.id, link_id, force, position, frame)
self.sim.apply_external_force(body_id=self.id, link_id=link_id, force=force, position=position, frame=frame)
def apply_external_torque(self, link_id=-1, torque=(0., 0., 0.), frame=Simulator.LINK_FRAME):
def apply_external_torque(self, torque=(0., 0., 0.), link_id=-1, frame=Simulator.LINK_FRAME):
"""
Apply an external torque on the body, or a link of the body. Note that after each simulation step, the external
torques are cleared to 0.
@@ -349,8 +349,8 @@ class Body(object):
Warnings: This does not work when using `sim.setRealTimeSimulation(1)`.
Args:
link_id (int): link id to apply the torque, if -1 it will apply the torque on the base
torque (float[3]): Cartesian torques to be applied on the body
link_id (int): link id to apply the torque, if -1 it will apply the torque on the base
frame (int): Specify the coordinate system of force/position: either `pybullet.WORLD_FRAME` (=2) for
Cartesian world coordinates or `pybullet.LINK_FRAME` (=1) for local link coordinates.
"""
+2 -2
View File
@@ -45,14 +45,14 @@ class Crab(HexapodRobot):
self.legs = [[self.get_link_ids(link) for link in links if link in self.link_names]
for links in [['coxa_l1', 'femur_l1', 'tibia_l1'],
[ 'coxa_r1', 'femur_r1', 'tibia_r1'],
['coxa_r1', 'femur_r1', 'tibia_r1'],
['coxa_l2', 'femur_l2', 'tibia_l2'],
['coxa_r2', 'femur_r2', 'tibia_r2'],
['coxa_l3', 'femur_l3', 'tibia_l3'],
['coxa_r3', 'femur_r3', 'tibia_r3']]]
self.feet = [self.get_link_ids(link) for link in ['tibia_foot_l1', 'tibia_foot_r1', 'tibia_foot_l2',
'tibia_foot_r2', 'tibia_foot_l3', 'tibia_foot_r3']
'tibia_foot_r2', 'tibia_foot_l3', 'tibia_foot_r3']
if link in self.link_names]
+159
View File
@@ -0,0 +1,159 @@
#!/usr/bin/env python
"""Provide the ECA A9 autonomous underwater vehicle platform.
"""
import os
import numpy as np
from pyrobolearn.robots.uuv import UUVRobot
__author__ = "Brian Delhaisse"
__copyright__ = "Copyright 2018, PyRoboLearn"
__license__ = "MIT"
__version__ = "1.0.0"
__maintainer__ = "Brian Delhaisse"
__email__ = "briandelhaisse@gmail.com"
__status__ = "Development"
# TODO: fix inertia tags in the URDF file
# TODO: several methods need to be moved to the `uuv.py` file.
class ECAA9(UUVRobot):
r"""Autonomous Unmanned Underwater Vehicle A9 from the ECA group
WARNING: Currently, pybullet does not simulate fluids, so we simulate the thrust, drag, buoyancy, lift, and weight
forces acting on the body. The gravity/weight force is simulated by pybullet.
The various forces are given by [3,4]:
1. The gravity/weight force is due to the attraction pull of the Earth is given by:
.. math:: F_g = m g
where :math:`m` is the mass of the object, and :math:`g` is the gravity constant (which is around
:math:`9.81 m/s^2` on the earth).
2. The buoyancy force is given by:
.. math:: F_b = \rho g V
where :math:`\rho` is the fluid density, :math:`g` is the gravity constant, and `V` is the volume of the
body submerged in the fluid.
3. The thrust force is due to the engine/motor/propeller of the object:
.. math:: F_t = \dot{m}_e v_e - \dot{m}_0 v_0 + (p_e - p_0) A_e
where :math:`\dot{m} = \rho A v` is the mass flow rate (i.e. mass/time), :math:`\rho` is the fluid density,
:math:`v` is the velocity, :math:`A` is the area where its normal is parallel to fluid flow, :math:`p` is the
pressure. The indices :math:`e` and :math:`0` stands for the exit and free stream (at the front of the submarine).
4. The lift force is given by:
.. math:: F_l = 1/2 C_l \rho A v^2
where :math:`C_l` is the lift coefficient at the desired angle of attack, :math:`A` is the platform area, \rho is
the fluid density, and :math:`v` is the velocity.
5. The drag force (which is opposed to the movement) is given by:
.. math:: F_d = 1/2 C_d \rho A v^2
where :math:`C_d` is the drag coefficient which is depending on the shape of the object, friction and viscosity
of the fluid, :math:`\rho` is the fluid density, :math:`A` is the platform area, and :math:`v` is the velocity.
For a submarine, the coefficient is approximately around 0.04 (see [3]).
References:
[1] https://www.ecagroup.com/en/solutions/a9-s-auv-autonomous-underwater-vehicle
[2] UUV Simulator: https://uuvsimulator.github.io/
[3] Aerodynamics (Nasa - check for equation): https://www.grc.nasa.gov/www/k-12/airplane/short.html
[4] https://s2.smu.edu/propulsion/Pages/navigation.htm
[5] Introduction to Ocean Waves: http://pordlabs.ucsd.edu/rsalmon/111.textbook.pdf
[6] https://fenicsproject.org/
"""
def __init__(self, simulator, position=(0, 0, 1.), orientation=(0, 0, 0, 1), fixed_base=False, scaling=1.,
urdf_path=os.path.dirname(__file__) + '/urdfs/ecaa9/eca_a9.urdf'):
# check parameters
if position is None:
position = (0., 0., 1.)
if len(position) == 2: # assume x, y are given
position = tuple(position) + (1.,)
if orientation is None:
orientation = (0, 0, 0, 1)
if fixed_base is None:
fixed_base = False
super(ECAA9, self).__init__(simulator, urdf_path, position, orientation, fixed_base, scaling)
self.name = 'eca_a9'
self.volume = 0.0679998770412 * scaling**3 # from urdf
self.sea_water_density = 1027
self.center_buoyancy = np.array([0.000106, 0., 0.6]) # from urdf
def calculate_buoyancy_force(self, fluid_density=None, g=9.81):
r"""
Calculate the buoyancy force.
Args:
fluid_density (float, None): density of the fluid [kg/m^3]
g (gravity): gravity value in the z direction.
Returns:
np.array[3]: buoyancy force
"""
# currently, we assume that the whole body is submerged in the
if fluid_density is None:
fluid_density = self.sea_water_density
return fluid_density * g * self.volume * np.array([0., 0., 1.])
# TODO: add `fill_tank(volume)` and `empty_tank(volume)`
def add_mass(self, mass=0., local_inertia_diagonal=(0., 0., 0.)):
r"""
Add mass to the submarine; a submarine has multiple ballast/trim tanks to control its buoyancy. This is
only valid in the simulator.
Args:
mass (float): mass that will be added to the base link.
local_inertia_diagonal (np.array[3]): local inertia diagonal around the CoM of the base link.
"""
info = self.sim.get_dynamics_info(body_id=self.id, link_id=-1)
mass += info[0]
local_inertia_diagonal = np.array(local_inertia_diagonal) + np.array(info[2])
self.sim.change_dynamics(body_id=self.id, link_id=-1, mass=mass, local_inertia_diagonal=local_inertia_diagonal)
# Test
if __name__ == "__main__":
from itertools import count
from pyrobolearn.simulators import BulletSim
from pyrobolearn.worlds import BasicWorld
# Create simulator
sim = BulletSim()
# create world
world = BasicWorld(sim)
# create robot
robot = ECAA9(sim)
# print information about the robot
robot.print_info()
fb = robot.calculate_buoyancy_force()
robot.add_mass(0.05)
# robot.add_joint_slider(range(5))
# robot.change_transparency(alpha=1.)
# run simulation
for i in count():
pos = robot.get_base_position()
# apply force in the simulation
robot.apply_external_force(force=fb, link_id=-1, position=pos+robot.center_buoyancy,
frame=BulletSim.WORLD_FRAME)
# robot.update_joint_slider()
# robot.set_joint_velocities([10], [4])
# step in simulation
world.step(sleep_dt=1./240)
+433
View File
@@ -0,0 +1,433 @@
#!/usr/bin/env python
"""Provide the techpod platform.
"""
import os
import json
import numpy as np
from pyrobolearn.robots.uav import FlappingWingUAV
__author__ = "Brian Delhaisse"
__copyright__ = "Copyright 2018, PyRoboLearn"
__credits__ = "Fei et al."
__license__ = "MIT"
__version__ = "1.0.0"
__maintainer__ = "Brian Delhaisse"
__email__ = "briandelhaisse@gmail.com"
__status__ = "Development"
class SimpleNamespace:
"""A simple object subclass that provides attribute access to its namespace, as well as a meaningful repr.
Taken from: https://docs.python.org/3/library/types.html
"""
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def __repr__(self):
keys = sorted(self.__dict__)
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
return "{}({})".format(type(self).__name__, ", ".join(items))
def __eq__(self, other):
return self.__dict__ == other.__dict__
class Wing(object):
r"""Wing
Python code translated from C++ code provided in [1].
References:
[1] https://github.com/purdue-biorobotics/flappy/blob/master/flappy/envs/Wing.cpp
[2] "Flappy Hummingbird: An Open Source Dynamic Simulation of Flapping Wing Robots and Animals", Fei et al.,
2019
"""
def __init__(self, wing_index, wing_length, mean_chord, r33, r22, r11, r00, z_cp2, z_cp1, z_cp0, z_rd,
shoulder_width, stroke_plane_offset):
r"""
Initialize the wing and compute the dynamics on it.
Args:
wing_index (int): wing index (0 or 1). This is used to determine the sign of the axis for the motors.
Set it to 0 for the left wing, and 1 for the right wing.
wing_length (float): length of wing.
mean_chord (float): mean of the chord. "In aeronautics, a chord is the imaginary straight line joining the
leading and trailing edges of an aerofoil. The chord length is the distance between the trailing edge
and the point on the leading edge where the chord intersects the leading edge." (from Wikipedia)
r33 (float): wing geometry constant.
r22 (float): wing geometry constant.
r11 (float): wing geometry constant.
r00 (float): wing geometry constant.
z_cp2 (float): wing geometry constant.
z_cp1 (float): wing geometry constant.
z_cp0 (float): wing geometry constant.
z_rd (float): wing geometry constant.
shoulder_width (float): should width
stroke_plane_offset (float): stroke plane offset.
"""
self.air_density = 1.18009482370369
self.wing_index = wing_index
self.wing_length = wing_length
self.mean_chord = mean_chord
self.r33 = r33
self.r22 = r22
self.r11 = r11
self.r00 = r00
self.z_cp2 = z_cp2
self.z_cp1 = z_cp1
self.z_cp0 = z_cp0
self.z_rd = z_rd
self.sign = pow(-1, wing_index)
self.r_w = wing_length
self.d_0 = shoulder_width
self.d_s = stroke_plane_offset
self.r_cp = self.r_w * r33/r22 # span-wise center of pressure
# total force and moments
self.span_wise_center_of_pressure = 0
self.cord_wise_center_of_pressure = 0
self.normal_force = 0
self.aero_moment = 0
self.rotational_damping_moment = 0
# rotational damping moment coefficient
self.Crd = 5.0
def do_nothing(self):
# total force and moments
self.span_wise_center_of_pressure = 0
self.cord_wise_center_of_pressure = 0
self.normal_force = 0
self.aero_moment = 0
self.rotational_damping_moment = 0
def update_aero_force(self):
"""Update the aerodynamic forces applied on the wing; i.e. the normal force, aerodynamic moment and rotational
damping moment (the equations are provided in [2]).
"""
self.update_velocity_coefficients()
self.update_angle_of_attack()
self.CN = self.get_CN(self.alpha)
self.d_cp = self.get_center_of_pressure(self.alpha)
self.update_velocity_squared_coefficients()
# the normal force, aerodynamic moment and rotational damping moment are given in [2]
self.normal_force = 0.5 * self.air_density * self.mean_chord * self.CN * \
(self.a_u2 * self.r_w**3 * self.r22 + self.a_u1 * self.r_w**2 * self.r11 +
self.a_u0 * self.r_w * self.r00)
self.aero_moment = -0.5 * self.air_density * self.d_cp * self.CN * self.mean_chord**2 * \
(self.a_u2 * self.r_w**3 * self.z_cp2 + self.a_u1 * self.r_w**2 * self.z_cp1 +
self.a_u0 * self.r_w * self.z_cp0)
if self.normal_force != 0:
self.cord_wise_center_of_pressure = -self.aero_moment / self.normal_force
else:
self.cord_wise_center_of_pressure = 0
self.span_wise_center_of_pressure = self.r_cp
self.rotational_damping_moment = -0.125 * self.air_density * np.abs(self.dtheta) * self.dtheta * self.Crd * \
self.r_w * self.mean_chord**4 * self.z_rd
def update_state(self, body_velocity_rpy, body_velocity, stroke_plane_angle, stroke_plane_velocity, stroke_angle,
stroke_velocity, deviation_angle, deviation_velocity, rotate_angle, rotate_velocity):
"""Update the state of the wing."""
self.velocity = body_velocity
self.drpy = body_velocity_rpy
# stroke plane
self.Phi = stroke_plane_angle
self.dPhi = stroke_plane_velocity
# stroke
self.psi = stroke_angle
self.dpsi = stroke_velocity
# deviation
self.phi = deviation_angle
self.dphi = deviation_velocity
# wing rotation
self.theta = rotate_angle
self.dtheta = rotate_velocity
# wing trigonometry pre calculation
self.s_Phi = np.sin(self.Phi)
self.c_Phi = np.cos(self.Phi)
self.s_psi = np.sin(self.psi)
self.c_psi = np.cos(self.psi)
self.s_phi = np.sin(self.phi)
self.c_phi = np.cos(self.phi)
def update_velocity_coefficients(self):
"""Update the velocity coefficients."""
u, v, w = self.velocity
p, q, r = self.drpy
s_Phi, c_Phi, s_psi, c_psi, s_phi, c_phi = self.s_Phi, self.c_Phi, self.s_psi, self.c_psi, self.s_phi, \
self.c_phi
dPhi, dpsi, dphi = self.dPhi, self.dpsi, self.dphi
d_0, d_s = self.d_0, self.d_s
# velocity coefficients
self.u_o1 = self.sign * (p * c_psi * c_Phi - dPhi * s_psi) + (q * s_psi + r * c_psi * s_Phi + dphi)
self.u_o0 = self.sign * (-(u + q * d_s) * c_phi * s_Phi - r * d_0 * s_phi * s_psi * c_Phi - (v - p * d_s) *
s_phi * c_psi + w * s_phi * s_psi * s_Phi + p * d_0 * c_phi * c_Phi) + \
((u + q * d_s) * s_phi * s_psi * c_Phi + r * d_0 * c_phi * s_Phi + w * c_phi * c_Phi + p * d_0 *
s_phi * s_psi * s_Phi)
self.u_i1 = self.sign * (p * s_phi * s_psi * c_Phi + r * c_phi * c_Phi + dPhi * s_phi * c_psi) + \
(-p * c_phi * s_Phi - q * s_phi * c_psi + r * s_phi * s_psi * s_Phi + dpsi * c_phi)
self.u_i0 = self.sign * (r * d_0 * c_psi * c_Phi - (v - p * d_s) * s_psi - w * c_psi * s_Phi) + \
(-(u + q * d_s) * c_psi * c_Phi - p * d_0 * c_psi * s_Phi)
def update_angle_of_attack(self):
"""Update the angle of attack (AoA)."""
# AoA correction double
self.u_i = self.u_i1 * self.r_cp + self.u_i0
if self.u_i != 0:
self.delta_alpha = np.arctan((self.u_o1 * self.r_cp + self.u_o0) / (self.u_i1 * self.r_cp + self.u_i0))
else:
self.delta_alpha = 0
# geometric AoA
self.alpha_0 = self.theta + np.double(np.sign(self.u_i)) * np.pi / 2
self.alpha = self.alpha_0 - self.delta_alpha
@staticmethod
def get_CN(alpha):
# see equation (8) in paper [2]
return 1.8 * np.sin(2 * alpha) * np.cos(alpha) + 1.95 * np.sin(alpha) - 1.5 * np.cos(2 * alpha) * np.sin(alpha)
@staticmethod
def get_center_of_pressure(alpha):
return 0.46 - 0.332 * np.cos(alpha) - 0.037 * np.cos(3 * alpha) - 0.013 * np.cos(5 * alpha)
def update_velocity_squared_coefficients(self):
# velocity squared coefficients
self.a_u2 = self.u_i1**2 + self.u_o1**2
self.a_u1 = 2 * self.u_i1 * self.u_i0 + 2 * self.u_o1 * self.u_o0
self.a_u0 = self.u_i0**2 + self.u_o0**2
class Actuator:
r"""Actuator
Code copied-pasted from [1] (I didn't change anything except adding some whitespaces).
References:
[1] https://github.com/purdue-biorobotics/flappy/blob/master/flappy/envs/Wing.cpp
[2] "Flappy Hummingbird: An Open Source Dynamic Simulation of Flapping Wing Robots and Animals", Fei et al.,
2019
"""
def __init__(self, motor_properties):
config = SimpleNamespace(**motor_properties)
self.resistance = config.resistance
self.torque_constant = config.torque_constant
self.gear_ratio = config.gear_ratio
self.mechanical_efficiency = config.mechanical_efficiency
self.friction_coefficient = config.friction_coefficient
self.damping_coefficient = config.damping_coefficient
self.inertia = config.inertia
self.inertia_torque = 0
self.damping_torque = 0
self.friction_torque = 0
self.magnetic_torque = 0
self.motor_torque = 0
self.voltage = 0
self.current = 0
self.back_EMF = 0
self.output_torque = 0
self.config = config
self.reset()
def update_driver_voltage(self, voltage):
self.voltage = voltage
def update_torque(self, stroke_velocity, stroke_acceleration):
psi_dot = stroke_velocity
psi_ddot = stroke_acceleration
motor_vel = psi_dot * self.gear_ratio
motor_accel = psi_ddot * self.gear_ratio
if psi_dot > 0:
sign = 1
elif psi_dot < 0:
sign = -1
else:
sign = 0
self.back_EMF = self.torque_constant * motor_vel
self.current = (self.voltage - self.back_EMF) / self.resistance
self.inertia_torque = self.inertia * motor_accel
self.damping_torque = self.damping_coefficient * motor_vel
self.friction_torque = self.friction_coefficient * sign
self.magnetic_torque = self.torque_constant * self.current
self.motor_torque = self.magnetic_torque - self.inertia_torque - self.damping_torque - self.friction_torque
self.output_torque = self.motor_torque * self.gear_ratio * self.mechanical_efficiency
def get_torque(self):
return self.output_torque
def reset(self):
self.inertia_torque = 0
self.damping_torque = 0
self.friction_torque = 0
self.magnetic_torque = 0
self.motor_torque = 0
self.current = 0
self.back_EMF = 0
self.output_torque = 0
class Flappy(FlappingWingUAV):
r"""Flappy Hummingbird UAV (from Purdue University)
This is the main class for the flappy hummingbird (a flapping wing micro aerial vehicle (FWMAV)). Most of the code
as well as the URDF model comes from [2,3].
The flappy hummingbird has 2 wings and each one has 2 degrees of freedom; the stroke and rotation angles.
Warnings: Currently, in pybullet there is no air, so we simulate all the forces acting on the flappy vehicle as
described in the paper and code [2,3]. The gravity is carried out by pybullet.
References:
[1] "Design Optimization and System Integration of Robotic Hummingbird", 2017, Zhang et al.
[2] "Flappy Hummingbird: An Open Source Dynamic Simulation of Flapping Wing Robots and Animals", Fei et al.,
2019
[3] https://github.com/purdue-biorobotics/flappy
"""
def __init__(self, simulator, position=(0, 0, 0.5), orientation=(0, 0, 0, 1), fixed_base=False, scaling=1.,
urdf=os.path.dirname(__file__) + '/urdfs/flappy/flappy.urdf',
config=os.path.dirname(__file__) + '/urdfs/flappy/config/mav_config.json'):
super(Flappy, self).__init__(simulator, urdf, position, orientation, fixed_base)
with open(config) as f:
config = json.load(f)[0]
config = SimpleNamespace(**config)
# create wings
self.left_wing = Wing(0, config.wing_length, config.mean_chord, config.r33, config.r22, config.r11, config.r00,
config.z_cp2, config.z_cp1, config.z_cp0, config.z_rd, config.left_shoulder_width,
config.stroke_plane_offset)
self.right_wing = Wing(1, config.wing_length, config.mean_chord, config.r33, config.r22, config.r11, config.r00,
config.z_cp2, config.z_cp1, config.z_cp0, config.z_rd, config.right_shoulder_width,
config.stroke_plane_offset)
# create motors
self.left_motor = Actuator(config.left_motor_properties)
self.right_motor = Actuator(config.right_motor_properties)
# joints
self.left_wing_joints = [self.get_link_ids(link) for link in ['left_leading_edge', 'left_wing']
if link in self.link_names]
self.right_wing_joints = [self.get_link_ids(link) for link in ['right_leading_edge', 'right_wing']
if link in self.link_names]
self.wings = [self.left_wing_joints, self.right_wing_joints]
# joints = [left stroke, left rotate, right stroke, right rotate]
self.wing_joints = self.left_wing_joints + self.right_wing_joints
# dummy variables for now
# self.driver_update_time = 0
# self.dt_driver = 1./1e3
self.prev_t = None
self.prev_joint_velocities = None
def apply_voltage(self, t, input_voltage): # step(self, t, input_voltage):
# get the joint positions for the left and right wing joints
joint_positions = self.get_joint_positions(self.wing_joints)
joint_velocities = self.get_joint_velocities(self.wing_joints)
# joint_accelerations = self.get_joint_accelerations(self.wing_joints)
if self.prev_t is None:
joint_accelerations = np.zeros(len(self.wing_joints))
else:
joint_accelerations = (joint_velocities - self.prev_joint_velocities) / (t - self.prev_t)
# update aerodynamic forces
self.left_wing.update_state(self.angular_velocity, self.linear_velocity, 0, 0, joint_positions[0],
joint_velocities[0], 0, 0, joint_positions[1], joint_velocities[1])
self.right_wing.update_state(self.angular_velocity, self.linear_velocity, 0, 0, joint_positions[2],
joint_velocities[2], 0, 0, joint_positions[3], joint_velocities[3])
self.left_wing.update_aero_force()
self.right_wing.update_aero_force()
# update voltage
# if t >= self.driver_update_time:
# self.driver_update_time += self.dt_driver
self.left_motor.update_driver_voltage(input_voltage[0])
self.right_motor.update_driver_voltage(input_voltage[1])
# update torque (left and right strokes)
self.left_motor.update_torque(joint_velocities[0], joint_accelerations[0])
self.right_motor.update_torque(joint_velocities[2], joint_accelerations[2])
# apply stroke torque
torques = np.zeros(self.num_dofs)
torques[0] = self.left_motor.get_torque()
torques[2] = self.right_motor.get_torque()
self.set_joint_torques(torques)
# get aero forces
left_normal_force = np.array([self.left_wing.normal_force, 0, 0]) # in wing x direction
right_normal_force = np.array([self.right_wing.normal_force, 0, 0])
left_cop = np.array([0, self.left_wing.span_wise_center_of_pressure,
(-1) * self.left_wing.cord_wise_center_of_pressure])
right_cop = np.array([0, (-1) * self.right_wing.span_wise_center_of_pressure,
(-1) * self.right_wing.cord_wise_center_of_pressure])
left_rot_damping_moment = np.array([0, self.left_wing.rotational_damping_moment, 0]) # in wing y direction
right_rot_damping_moment = np.array([0, self.right_wing.rotational_damping_moment, 0])
# apply aero force and moment on wing
# self.apply_external_force(left_normal_force, link_id=1, position=left_cop, frame=BulletSim.LINK_FRAME)
# self.apply_external_force(right_normal_force, link_id=3, position=right_cop, frame=BulletSim.LINK_FRAME)
# self.apply_external_torque(left_rot_damping_moment, link_id=1, frame=BulletSim.LINK_FRAME)
# self.apply_external_torque(right_rot_damping_moment, link_id=3, frame=BulletSim.LINK_FRAME)
# save
self.prev_t = t
self.prev_joint_velocities = joint_velocities
# Test
if __name__ == "__main__":
import time
from itertools import count
from pyrobolearn.simulators import BulletSim
from pyrobolearn.worlds import BasicWorld
# Create simulator
sim = BulletSim()
# create world
world = BasicWorld(sim)
# create robot
robot = Flappy(sim)
# print information about the robot
robot.print_info()
robot.add_joint_slider(robot.left_wing_joints)
# run simulation
for i in count():
robot.update_joint_slider()
# signal = 3 * np.sin(2. * np.pi * i/1000) * np.ones(2)
# robot.apply_voltage(time.time(), signal)
# robot.set_joint_positions(1. * np.sin(2 * np.pi * i/240), joint_ids=0)
# step in simulation
world.step(sleep_dt=1./240)
+11 -11
View File
@@ -18,12 +18,13 @@ __email__ = "briandelhaisse@gmail.com"
__status__ = "Development"
# TODO: several methods such as the calculation of the thrust force should be done in `uav.py` file, not here
class Quadcopter(RotaryWingUAV):
r"""Quadcopter
WARNING: Currently, in pybullet there is no air, so we simulate the thrust force.
Based on momentum theory, we can calculate the thrust [4,5,6] to be:
Based on momentum theory, we can calculate the thrust [5,6,7] to be:
.. math::
@@ -56,9 +57,9 @@ class Quadcopter(RotaryWingUAV):
[3] https://github.com/prfraanje/quadcopter_sim
[4] https://github.com/ethz-asl/rotors_simulator
[4] "Propeller Thrust" (NASA): https://www.grc.nasa.gov/WWW/K-12/airplane/propth.html
[5] "Static thrust calculation": https://quadcopterproject.wordpress.com/static-thrust-calculation/
[6] "Propeller Static & Dynamic Thrust Calculation":
[5] "Propeller Thrust" (NASA): https://www.grc.nasa.gov/WWW/K-12/airplane/propth.html
[6] "Static thrust calculation": https://quadcopterproject.wordpress.com/static-thrust-calculation/
[7] "Propeller Static & Dynamic Thrust Calculation":
https://www.electricrcaircraftguy.com/2013/09/propeller-static-dynamic-thrust-equation.html
https://www.electricrcaircraftguy.com/2014/04/propeller-static-dynamic-thrust-equation-background.html
"""
@@ -133,14 +134,13 @@ class Quadcopter(RotaryWingUAV):
diameter = (4. * area / np.pi)**0.5
return air_density * area * (tmp**2 - tmp*v0) * (self.k1 * diameter / propeller_pitch)**self.k2
def set_joint_velocities(self, velocities, joint_ids=None, max_velocity=True, forces=True):
def set_propeller_velocities(self, velocities, max_velocity=True, forces=True):
"""
Set the joint velocities and apply the thrust force on the propeller link corresponding to the given
joint id(s).
Args:
velocities (float[4]): velocity of each propeller
joint_ids (int[4], None): Not used here
velocities (np.array[4]): velocity of each propeller
forces (float, np.float[N], None, bool): maximum motor torques / forces. If True, it will apply the
default maximum force values.
max_velocity (float, bool, None): if True, it will make sure that the given velocity(ies) are below their
@@ -156,7 +156,7 @@ class Quadcopter(RotaryWingUAV):
joint_ids = self.joints
# call parent method
super(Quadcopter, self).set_joint_velocities(velocities, joint_ids, max_velocity, forces)
super(Quadcopter, self).set_joint_velocities(velocities, joint_ids, forces, max_velocity)
# calculate thrust force of the given joints, and apply it on the link
for jnt, d, v in zip(joint_ids, self.turning_directions, velocities):
@@ -165,7 +165,7 @@ class Quadcopter(RotaryWingUAV):
# compute propeller speed v0
state = self.sim.get_link_state(self.id, jnt, compute_velocity=True) # , compute_forward_kinematics=True)
R = np.array(get_matrix_from_quaternion(state[1]))
R = get_matrix_from_quaternion(state[1])
linear_velocity = np.array(state[-2])
propeller_up_vec = R.dot(np.array([0., 0., 1.]))
v0 = linear_velocity.dot(propeller_up_vec)
@@ -176,7 +176,7 @@ class Quadcopter(RotaryWingUAV):
# f = self.mass * self.gravity / 4.
# apply force in the simulation
self.apply_external_force([0, 0, f], jnt, position=(0., 0., 0.))
self.apply_external_force(force=[0, 0, f], link_id=jnt, position=(0., 0., 0.))
def get_stationary_joint_velocity(self):
fg = self.mass * self.gravity / 4.
@@ -217,6 +217,6 @@ if __name__ == "__main__":
# run simulation
for i in count():
robot.set_joint_velocities(v)
robot.set_propeller_velocities(v)
# step in simulation
world.step(sleep_dt=1./240)
+6
View File
@@ -2129,9 +2129,15 @@ class Robot(ControllableBody):
# compute and return joint accelerations
torques = np.array(torques)
if not self.fixed_base: # if floating base
torques = np.concatenate((np.zeros(6), torques))
Hinv = np.linalg.inv(self.get_mass_matrix(q))
C = self.calculate_inverse_dynamics(np.zeros(len(q)), dq=dq, q=q)
if np.any(np.equal(C, None)):
C = np.zeros(len(torques))
acc = Hinv.dot(torques - C)
if not self.fixed_base: # if floating base
return acc[6:]
return acc
def get_mass_matrix(self, q=None, q_idx=None):
+255
View File
@@ -0,0 +1,255 @@
#!/usr/bin/env python
"""Provide the techpod platform.
"""
import os
import numpy as np
from pyrobolearn.robots.uav import FixedWingUAV
from pyrobolearn.utils.transformation import get_matrix_from_quaternion
from pyrobolearn.utils.units import inches_to_meters
__author__ = "Brian Delhaisse"
__copyright__ = "Copyright 2018, PyRoboLearn"
__license__ = "MIT"
__version__ = "1.0.0"
__maintainer__ = "Brian Delhaisse"
__email__ = "briandelhaisse@gmail.com"
__status__ = "Development"
# TODO: several methods have to be moved in the `uav.py` file.
class Techpod(FixedWingUAV):
r"""Techpod UAV
Four forces (thrust, lift, drag, and gravity) act on an airplane.
WARNING: Currently, in pybullet there is no air, so we simulate the lift, thrust, and drag forces. The gravity
is carried out by pybullet.
References:
[1] https://github.com/ethz-asl/rotors_simulator
[2] "Theory of flight": web.mit.edu/16.00/www/aec/flight.html
[3] "NASA: Guided Tours of the BGA": www.grc.nasa.gov/WWW/k-12/airplane/guided.html
"""
def __init__(self,
simulator,
position=(0, 0, 0.5),
orientation=(0, 0, 0, 1),
fixed_base=False,
scaling=1.,
urdf=os.path.dirname(__file__) + '/urdfs/techpod/techpod.urdf'):
# check parameters
if position is None:
position = (0., 0., 0.5)
if len(position) == 2: # assume x, y are given
position = tuple(position) + (0.5,)
if orientation is None:
orientation = (0, 0, 0, 1)
if fixed_base is None:
fixed_base = False
super(Techpod, self).__init__(simulator, urdf, position, orientation, fixed_base, scaling)
self.name = 'techpod'
# info
self.gravity = 9.81
self.air_density = 1.225
# change dynamics
self.sim.change_dynamics(body_id=self.id, link_id=0, lateral_friction=0.)
# from urdf
self.radius = 0.15 # 0.14
self.diameter = 2. * self.radius
self.area = np.pi * self.radius**2
self.max_velocity = 770 # rad/sec
# Propeller pitches are around 0.0762m (3 inches) and 0.127m (5 inches)
# (from https://www.dronezon.com/learn-about-drones-quadcopters/how-a-quadcopter-works-with-propellers-and\
# -motors-direction-design-explained/)
# The larger the prop (either increasing diameter, or pitch or both), the more energy it takes to spin it.
# When buying propellers, they follow the syntax `LxP` where `L` is the length/diameter of the propeller
# (in inches) and `P` is the propeller pitch (also in inches).
# 1 inch = 0.0254m --> 0.28m = 11 inches
# The value of the pitch below has been set by looking online for quadcopter props with 11 inches of length
self.propeller_pitch = inches_to_meters(7) # 4.7) # inches_to_meters(5.)
# some constants
self.k1 = 1./3.29546
self.k2 = 1.5
def calculate_thrust_force(self, angular_speed, area, propeller_pitch, v0=0, air_density=1.225):
r"""
Calculate the thrust force generated by the propeller (based on [6]).
Args:
angular_speed (float): angular speed of the propeller [rad/s]. If RPM, convert it to rad/s using the
formula :math:`1 RPM = \frac{2\pi}{60} rad/s`.
area (float): area of the propeller [m^2]
propeller_pitch (float): "distance a propeller would move in 1 revolution if it were moving through a
soft solid" [m]
air_density (float): density of air [kg/m^3]. By default, it is the density of the air at sea level and at
15 degrees Celsius. Note that this varies with the temperature, humidity, and pressure. It decreases
with increasing altitude.
Returns:
float: thrust force generated by the propeller [N]
References:
[1] "Thrust Equation": https://www.grc.nasa.gov/WWW/k-12/airplane/thrsteq.html
[2] "Propeller Thrust": https://www.grc.nasa.gov/WWW/k-12/airplane/propth.html
[3] "Propeller Analysis": https://www.grc.nasa.gov/WWW/k-12/airplane/propanl.html
"""
tmp = angular_speed / (2*np.pi) * propeller_pitch
diameter = (4. * area / np.pi)**0.5
return air_density * area * (tmp**2 - tmp*v0) * (self.k1 * diameter / propeller_pitch)**self.k2
def calculate_lift_force(self):
r"""
Calculate the lift force.
Returns:
float[3]: lift force (in the z direction)
References:
[1] "What is Lift?": https://www.grc.nasa.gov/WWW/k-12/airplane/lift1.html
[2] "Lift Equation": https://www.grc.nasa.gov/WWW/k-12/airplane/lifteq.html
[3] "Inclination Effects on Lift": https://www.grc.nasa.gov/WWW/k-12/airplane/incline.html
[4] https://www.comsol.com/blogs/how-do-i-compute-lift-and-drag/
"""
pass
def calculate_drag_force(self):
r"""
Calculate the drag force.
Returns:
float[3]: drag force (in the -x direction)
References:
[1] "What is Drag?": https://www.grc.nasa.gov/WWW/k-12/airplane/drag1.html
[2] "Drag Equation": https://www.grc.nasa.gov/WWW/k-12/airplane/drageq.html
[3] https://www.comsol.com/blogs/how-do-i-compute-lift-and-drag/
"""
pass
def calculate_elevator_moment(self):
r"""
Calculate the moment due to the elevators [1].
Returns:
float[3]: resulting moment in the y direction
Reference:
[1] "Horizontal Stabilizer - Elevator": https://www.grc.nasa.gov/WWW/k-12/airplane/elv.html
[2] "Aircraft Rotations": https://www.grc.nasa.gov/WWW/k-12/airplane/rotations.html
"""
pass
def calculate_aileron_moment(self):
"""
Calculate the moment due to the ailerons that increases/decreases the lift force [1].
Returns:
float[3]: resulting moment in the x direction.
References:
[1] "Ailerons": https://www.grc.nasa.gov/WWW/k-12/airplane/alr.html
[2] "Aircraft Rotations": https://www.grc.nasa.gov/WWW/k-12/airplane/rotations.html
"""
pass
def calculate_flap_moment(self):
"""
Increase lift or drag.
Returns:
References:
[1] "Flaps and Slats": https://www.grc.nasa.gov/WWW/k-12/airplane/flap.html
"""
pass
def calculate_rudder_moment(self):
"""
Calculate the moment due to the rudder [1].
Returns:
float[3]: resulting moment (in the z direction)
Reference:
[1] "Vertical Stabilizer - Rudder": https://www.grc.nasa.gov/WWW/k-12/airplane/rud.html
[2] "Aircraft Rotations": https://www.grc.nasa.gov/WWW/k-12/airplane/rotations.html
"""
pass
def set_propeller_velocities(self, velocities, max_velocity=True, forces=True):
"""
Set the joint velocities and apply the thrust force on the propeller link corresponding to the given
joint id(s).
Args:
velocities (float[4]): velocity of each propeller
forces (float, np.float[N], None, bool): maximum motor torques / forces. If True, it will apply the
default maximum force values.
max_velocity (float, bool, None): if True, it will make sure that the given velocity(ies) are below their
authorized maximum value(s) (inferred from the URDF, or set previously by the user). If you already
did the check outside the method or if you don't want limits, set this variable to False.
Returns:
None
"""
joint_id = 7
# call parent method
super(Techpod, self).set_joint_velocities(velocities, joint_id, forces, max_velocity)
# calculate thrust force of the given joints, and apply it on the link
if max_velocity and velocities > self.max_velocity:
velocities = self.max_velocity
# compute propeller speed v0
state = self.sim.get_link_state(self.id, joint_id, compute_velocity=True) # , compute_forward_kinematics=True)
R = get_matrix_from_quaternion(state[1])
linear_velocity = np.array(state[-2])
propeller_up_vec = R.dot(np.array([0., 1., 0.]))
v0 = linear_velocity.dot(propeller_up_vec)
# v0 = 0 # static thrust
# compute thrust
f = self.calculate_thrust_force(velocities, self.area, self.propeller_pitch) # , v0)
# apply force in the simulation
# f = 20
self.apply_external_force(force=[0, 0, -f], link_id=joint_id, position=(0., 0., 0.))
def apply_physics(self):
pass
# Test
if __name__ == "__main__":
from itertools import count
from pyrobolearn.simulators import BulletSim
from pyrobolearn.worlds import BasicWorld
# Create simulator
sim = BulletSim()
# create world
world = BasicWorld(sim)
# create robot
robot = Techpod(sim)
# print information about the robot
robot.print_info()
# run simulation
for i in count():
robot.set_propeller_velocities(100)
# step in simulation
world.step(sleep_dt=1./240)
+15
View File
@@ -24,12 +24,18 @@ class UAVRobot(Robot):
super(UAVRobot, self).__init__(simulator, urdf, position, orientation, fixed_base, scale)
self.propellers = [] # list of propellers id
self.wings = [] # list of wing id
@property
def num_propellers(self):
"""Return the number of propellers"""
return len(self.propellers)
@property
def num_wings(self):
"""Return the number of wings."""
return len(self.wings)
class FixedWingUAV(UAVRobot):
r"""Fixed Wing Robot
@@ -47,3 +53,12 @@ class RotaryWingUAV(UAVRobot):
def __init__(self, simulator, urdf, position=None, orientation=None, fixed_base=False, scale=1.):
super(RotaryWingUAV, self).__init__(simulator, urdf, position, orientation, fixed_base, scale)
class FlappingWingUAV(UAVRobot):
r"""Flapping Wing Robot
"""
def __init__(self, simulator, urdf, position=None, orientation=None, fixed_base=False, scale=1.):
super(FlappingWingUAV, self).__init__(simulator, urdf, position, orientation, fixed_base, scale)
@@ -0,0 +1,340 @@
<?xml version="1.0"?>
<!-- created with Phobos 0.7 -->
<robot name="biped">
<material name = "black">
<color rgba="0.25 0.25 0.25 1.0"/>
</material>
<link name="l_ab_ad">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.8"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="l_yaw_motor">
<origin xyz="0 0 -0.04328" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.009.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="l_yaw_motor">
<origin xyz="0 0 -0.04328" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.009.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="l_foot">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="l_foot_mesh">
<origin xyz="0.00032 -0.02422 -0.0314" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.003.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="l_foot_mesh">
<origin xyz="0.00032 -0.02422 -0.0314" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.003.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="l_lower">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1.0"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="l_leg_lower">
<origin xyz="0 -0.01638 -0.14422" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.001.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="l_leg_lower">
<origin xyz="0 -0.01638 -0.14422" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.001.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="l_upper">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.2"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="l_leg_upper">
<origin xyz="0 0.04702 -0.13046" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.005.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="l_leg_upper">
<origin xyz="0 0.04702 -0.13046" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.005.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="l_yaw">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="2.0"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="l_hip">
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.007.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="l_hip">
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.007.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="r_ab_ad">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.8"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="r_yaw_motor">
<origin xyz="0 0 -0.03098" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.010.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="r_yaw_motor">
<origin xyz="0 0 -0.03098" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.010.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="r_foot">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="r_foot_mesh">
<origin xyz="0.00039 -0.02422 -0.0314" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.004.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="r_foot_mesh">
<origin xyz="0.00039 -0.02422 -0.0314" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.004.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="r_lower">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1.0"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="r_leg_lower">
<origin xyz="0 -0.01638 -0.14422" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.002.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="r_leg_lower">
<origin xyz="0 -0.01638 -0.14422" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.002.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="r_upper">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="0.2"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="r_leg_upper">
<origin xyz="0 0.04702 -0.13046" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.006.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="r_leg_upper">
<origin xyz="0 0.04702 -0.13046" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.006.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="r_yaw">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="2.0"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="r_hip">
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.013.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="r_hip">
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.013.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<link name="torso">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="5.0"/>
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
</inertial>
<visual name="torso_mesh">
<origin xyz="0 0.07151 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.stl" scale="0.1 0.1 0.1"/>
</geometry>
<material name="black"/>
</visual>
<collision name="torso_mesh">
<origin xyz="0 0.07151 0" rpy="0 0 0"/>
<geometry>
<mesh filename="meshes/V2Mockup.stl" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<joint name="l_ab_ad" type="revolute">
<origin xyz="0.15 0 0" rpy="0 0 0"/>
<parent link="torso"/>
<child link="l_ab_ad"/>
<axis xyz="0 -1.0 0"/>
<limit lower="-0.17453" upper="1.309" effort="0" velocity="0"/>
</joint>
<joint name="l_foot" type="revolute">
<origin xyz="0 -0.17 -0.47" rpy="0 0 0"/>
<parent link="l_lower"/>
<child link="l_foot"/>
<axis xyz="1.0 0 0"/>
<limit lower="-1.5708" upper="0.69813" effort="0" velocity="0"/>
</joint>
<joint name="l_lower" type="revolute">
<origin xyz="0 0.17 -0.47" rpy="0 0 0"/>
<parent link="l_upper"/>
<child link="l_lower"/>
<axis xyz="1.0 0 0"/>
<limit lower="-2.0944" upper="0.34907" effort="0" velocity="0"/>
</joint>
<joint name="l_upper" type="revolute">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="l_yaw"/>
<child link="l_upper"/>
<axis xyz="1.0 0 0"/>
<limit lower="-1.91986" upper="1.22173" effort="0" velocity="0"/>
</joint>
<joint name="l_yaw" type="revolute">
<origin xyz="0 0 -0.135" rpy="0 0 0"/>
<parent link="l_ab_ad"/>
<child link="l_yaw"/>
<axis xyz="0 0 1.0"/>
<limit lower="-0.7854" upper="0.7854" effort="0" velocity="0"/>
</joint>
<joint name="r_ab_ad" type="revolute">
<origin xyz="-0.15 0 0" rpy="0 0 0"/>
<parent link="torso"/>
<child link="r_ab_ad"/>
<axis xyz="0 -1.0 0"/>
<limit lower="-1.309" upper="0.17453" effort="0" velocity="0"/>
</joint>
<joint name="r_foot" type="revolute">
<origin xyz="0 -0.17 -0.47" rpy="0 0 0"/>
<parent link="r_lower"/>
<child link="r_foot"/>
<axis xyz="1.0 0 0"/>
<limit lower="-1.5708" upper="0.69813" effort="0" velocity="0"/>
</joint>
<joint name="r_lower" type="revolute">
<origin xyz="0 0.17 -0.47" rpy="0 0 0"/>
<parent link="r_upper"/>
<child link="r_lower"/>
<axis xyz="1.0 0 0"/>
<limit lower="-2.0944" upper="0.34907" effort="0" velocity="0"/>
</joint>
<joint name="r_upper" type="revolute">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="r_yaw"/>
<child link="r_upper"/>
<axis xyz="1.0 0 0"/>
<limit lower="-1.91986" upper="1.22173" effort="0" velocity="0"/>
</joint>
<joint name="r_yaw" type="revolute">
<origin xyz="0 0 -0.135" rpy="0 0 0"/>
<parent link="r_ab_ad"/>
<child link="r_yaw"/>
<axis xyz="0 0 1.0"/>
<limit lower="-0.7854" upper="0.7854" effort="0" velocity="0"/>
</joint>
</robot>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
+198
View File
@@ -0,0 +1,198 @@
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<asset>
<contributor>
<author>Blender User</author>
<authoring_tool>Blender 2.79.0 commit date:2017-09-11, commit time:10:43, hash:5bd8ac9abfa</authoring_tool>
</contributor>
<created>2017-10-16T17:44:03</created>
<modified>2017-10-16T17:44:03</modified>
<unit name="meter" meter="1"/>
<up_axis>Z_UP</up_axis>
</asset>
<library_cameras>
<camera id="Camera-camera" name="Camera">
<optics>
<technique_common>
<perspective>
<xfov sid="xfov">49.13434</xfov>
<aspect_ratio>1.777778</aspect_ratio>
<znear sid="znear">0.1</znear>
<zfar sid="zfar">100</zfar>
</perspective>
</technique_common>
</optics>
<extra>
<technique profile="blender">
<shiftx sid="shiftx" type="float">0</shiftx>
<shifty sid="shifty" type="float">0</shifty>
<YF_dofdist sid="YF_dofdist" type="float">0</YF_dofdist>
</technique>
</extra>
</camera>
</library_cameras>
<library_lights>
<light id="Lamp-light" name="Lamp">
<technique_common>
<point>
<color sid="color">1 1 1</color>
<constant_attenuation>1</constant_attenuation>
<linear_attenuation>0</linear_attenuation>
<quadratic_attenuation>0.00111109</quadratic_attenuation>
</point>
</technique_common>
<extra>
<technique profile="blender">
<type sid="type" type="int">0</type>
<flag sid="flag" type="int">0</flag>
<mode sid="mode" type="int">8192</mode>
<gamma sid="blender_gamma" type="float">1</gamma>
<red sid="red" type="float">1</red>
<green sid="green" type="float">1</green>
<blue sid="blue" type="float">1</blue>
<shadow_r sid="blender_shadow_r" type="float">0</shadow_r>
<shadow_g sid="blender_shadow_g" type="float">0</shadow_g>
<shadow_b sid="blender_shadow_b" type="float">0</shadow_b>
<energy sid="blender_energy" type="float">1</energy>
<dist sid="blender_dist" type="float">29.99998</dist>
<spotsize sid="spotsize" type="float">75</spotsize>
<spotblend sid="spotblend" type="float">0.15</spotblend>
<halo_intensity sid="blnder_halo_intensity" type="float">1</halo_intensity>
<att1 sid="att1" type="float">0</att1>
<att2 sid="att2" type="float">1</att2>
<falloff_type sid="falloff_type" type="int">2</falloff_type>
<clipsta sid="clipsta" type="float">1.000799</clipsta>
<clipend sid="clipend" type="float">30.002</clipend>
<bias sid="bias" type="float">1</bias>
<soft sid="soft" type="float">3</soft>
<compressthresh sid="compressthresh" type="float">0.04999995</compressthresh>
<bufsize sid="bufsize" type="int">2880</bufsize>
<samp sid="samp" type="int">3</samp>
<buffers sid="buffers" type="int">1</buffers>
<filtertype sid="filtertype" type="int">0</filtertype>
<bufflag sid="bufflag" type="int">0</bufflag>
<buftype sid="buftype" type="int">2</buftype>
<ray_samp sid="ray_samp" type="int">1</ray_samp>
<ray_sampy sid="ray_sampy" type="int">1</ray_sampy>
<ray_sampz sid="ray_sampz" type="int">1</ray_sampz>
<ray_samp_type sid="ray_samp_type" type="int">0</ray_samp_type>
<area_shape sid="area_shape" type="int">1</area_shape>
<area_size sid="area_size" type="float">0.1</area_size>
<area_sizey sid="area_sizey" type="float">0.1</area_sizey>
<area_sizez sid="area_sizez" type="float">1</area_sizez>
<adapt_thresh sid="adapt_thresh" type="float">0.000999987</adapt_thresh>
<ray_samp_method sid="ray_samp_method" type="int">1</ray_samp_method>
<shadhalostep sid="shadhalostep" type="int">0</shadhalostep>
<sun_effect_type sid="sun_effect_type" type="int">0</sun_effect_type>
<skyblendtype sid="skyblendtype" type="int">1</skyblendtype>
<horizon_brightness sid="horizon_brightness" type="float">1</horizon_brightness>
<spread sid="spread" type="float">1</spread>
<sun_brightness sid="sun_brightness" type="float">1</sun_brightness>
<sun_size sid="sun_size" type="float">1</sun_size>
<backscattered_light sid="backscattered_light" type="float">1</backscattered_light>
<sun_intensity sid="sun_intensity" type="float">1</sun_intensity>
<atm_turbidity sid="atm_turbidity" type="float">2</atm_turbidity>
<atm_extinction_factor sid="atm_extinction_factor" type="float">1</atm_extinction_factor>
<atm_distance_factor sid="atm_distance_factor" type="float">1</atm_distance_factor>
<skyblendfac sid="skyblendfac" type="float">1</skyblendfac>
<sky_exposure sid="sky_exposure" type="float">1</sky_exposure>
<sky_colorspace sid="sky_colorspace" type="int">0</sky_colorspace>
</technique>
</extra>
</light>
</library_lights>
<library_images/>
<library_effects>
<effect id="Charcoal-effect">
<profile_COMMON>
<technique sid="common">
<phong>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<ambient>
<color sid="ambient">0 0 0 1</color>
</ambient>
<diffuse>
<color sid="diffuse">0.1372549 0.1372549 0.1372549 1</color>
</diffuse>
<specular>
<color sid="specular">0.25 0.25 0.25 1</color>
</specular>
<shininess>
<float sid="shininess">50</float>
</shininess>
<index_of_refraction>
<float sid="index_of_refraction">1</float>
</index_of_refraction>
</phong>
</technique>
</profile_COMMON>
</effect>
</library_effects>
<library_materials>
<material id="Charcoal-material" name="Charcoal">
<instance_effect url="#Charcoal-effect"/>
</material>
</library_materials>
<library_geometries>
<geometry id="ID30-mesh" name="ID30">
<mesh>
<source id="ID30-mesh-positions">
<float_array id="ID30-mesh-positions-array" count="264">-1.968504 -0.1457771 3.618741 -1.968504 0.1457771 3.618741 -3.937008 0 3.618741 0 -0.1968485 3.618741 0 0.1968485 3.618741 0.3937008 -0.1699604 3.618741 0.3937008 0.1699604 3.618741 0.5905512 -0.1299661 3.618741 0.5905512 0.1299661 3.618741 0.6889764 -0.09514117 3.618741 0.6889764 0.09514117 3.618741 0.7634889 0.04757052 3.618741 0.7634889 -0.04757052 3.618741 0.7874016 0 3.618741 0.7874016 0 3.618741 0.7634889 -0.04757052 3.618741 0.7634889 0.04757052 3.618741 0.6889764 -0.09514117 3.618741 0.6889764 0.09514117 3.618741 0.5905512 0.1299661 3.618741 0.5905512 -0.1299661 3.618741 0.3937008 0.1699604 3.618741 0.3937008 -0.1699604 3.618741 0 0.1968485 3.618741 0 -0.1968485 3.618741 -1.968504 0.1457771 3.618741 -1.968504 -0.1457771 3.618741 -3.937008 0 3.618741 -3.937008 0 3.618741 -3.937008 0 0 -1.968504 -0.1457771 3.618741 -1.968504 -0.1457771 3.618741 -3.937008 0 0 -3.937008 0 3.618741 0 -0.1968485 3.618741 -1.968504 -0.2479612 0 -1.968504 -0.2479612 0 0 -0.1968485 3.618741 0 -0.3348318 0 0.3937008 -0.1699604 3.618741 0.3937008 -0.1699604 3.618741 0 -0.3348318 0 0.3937008 -0.2890961 0 0.5905512 -0.1299661 3.618741 0.5905512 -0.1299661 3.618741 0.3937008 -0.2890961 0 0.6889764 -0.09514117 3.618741 0.5905512 -0.2210673 0 0.5905512 -0.2210673 0 0.6889764 -0.09514117 3.618741 0.7634889 -0.04757052 3.618741 0.7634889 -0.08091574 0 0.7634889 -0.08091574 0 0.7634889 -0.04757052 3.618741 0.7874016 0 3.618741 0.7874016 0 0 0.7874016 0 0 0.7874016 0 3.618741 0.7634889 0.08091574 0 0.7634889 0.04757052 3.618741 0.7634889 0.04757052 3.618741 0.7634889 0.08091574 0 0.6889764 0.1618316 0 0.6889764 0.09514117 3.618741 0.6889764 0.09514117 3.618741 0.6889764 0.1618316 0 0.5905512 0.1299661 3.618741 0.5905512 0.1299661 3.618741 0.3937008 0.1699604 3.618741 0.5905512 0.2210673 0 0.5905512 0.2210673 0 0.3937008 0.1699604 3.618741 0.3937008 0.2890961 0 0 0.1968485 3.618741 0 0.1968485 3.618741 0.3937008 0.2890961 0 0 0.3348318 0 -1.968504 0.1457771 3.618741 -1.968504 0.1457771 3.618741 0 0.3348318 0 -1.968504 0.2479612 0 -3.937008 0 3.618741 -3.937008 0 3.618741 -1.968504 0.2479612 0 -3.937008 0 0 -3.937008 0 0 0.6889764 -0.1618316 0 0.6889764 -0.1618316 0</float_array>
<technique_common>
<accessor source="#ID30-mesh-positions-array" count="88" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="ID30-mesh-normals">
<float_array id="ID30-mesh-normals-array" count="216">0 0 1 -2.59636e-7 0 1 5.76823e-7 0 1 -3.56308e-6 0 1 2.32977e-6 0 1 1.16489e-6 0 1 -6.3651e-6 0 1 0 0 -1 6.3651e-6 0 -1 -4.65955e-6 0 -1 3.56308e-6 0 -1 4.15417e-7 0 -1 -0.07382559 -0.9972712 0 -0.1087397 -0.9938868 0.01910495 -0.05810898 -0.9981378 0.01855576 0.05810898 0.9981378 -0.01855576 0.1087397 0.9938868 -0.01910495 0.07382559 0.9972712 0 0.01825046 -0.9992311 0.03470039 -0.08160746 -0.9961668 0.03149545 0.08160746 0.9961668 -0.03149545 -0.01825046 0.9992311 -0.03470039 0.03402829 -0.9987851 0.03564578 0.1356282 -0.9901413 0.03500574 -0.1356282 0.9901413 -0.03500574 -0.03402829 0.9987851 -0.03564578 0.2194618 -0.9752029 0.0285657 0.2694833 -0.9626019 0.02786386 -0.2694833 0.9626019 -0.02786386 -0.2194618 0.9752029 -0.0285657 0.4431983 -0.8962848 0.01577836 0.4210693 -0.9068083 0.01998984 -0.4210693 0.9068083 -0.01998984 -0.4431983 0.8962848 -0.01577836 0.7440177 -0.6681479 0.004028439 0.8683262 -0.4959335 0.007721245 -0.8683262 0.4959335 -0.007721245 -0.7440177 0.6681479 -0.004028439 0.9999967 -0.001312315 0.002258419 0.9999988 -8.24024e-4 0.001342833 -0.9999988 8.24024e-4 -0.001342833 -0.9999967 0.001312315 -0.002258419 0.8689233 0.4949362 0.003235042 0.7447676 0.6672481 0.01007139 -0.7447676 -0.6672481 -0.01007139 -0.8689233 -0.4949362 -0.003235042 0.6281806 0.7779393 0.01413047 0.4391386 0.8982672 0.0165413 -0.4391386 -0.8982672 -0.0165413 -0.6281806 -0.7779393 -0.01413047 0.2691455 0.9628688 0.02108848 -0.2691455 -0.9628688 -0.02108848 0.1364213 0.9902293 0.02890175 0.4205566 0.9068822 0.02639919 -0.4205566 -0.9068822 -0.02639919 -0.1364213 -0.9902293 -0.02890175 0.2201024 0.9748659 0.03451687 0.02276724 0.9991052 0.03564631 -0.02276724 -0.9991052 -0.03564631 -0.2201024 -0.9748659 -0.03451687 0.03854596 0.9986552 0.03466999 -0.05276817 0.9981091 0.03152662 0.05276817 -0.9981091 -0.03152662 -0.03854596 -0.9986552 -0.03466999 -0.07638919 0.9969049 0.01858609 -0.09015309 0.9957436 0.01916593 0.09015309 -0.9957436 -0.01916593 0.07638919 -0.9969049 -0.01858609 -0.1249737 0.9921601 0 0.1249737 -0.9921601 0 0.6311451 -0.7755333 0.01428312 -0.6311451 0.7755333 -0.01428312</float_array>
<technique_common>
<accessor source="#ID30-mesh-normals-array" count="72" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="ID30-mesh-vertices">
<input semantic="POSITION" source="#ID30-mesh-positions"/>
</vertices>
<triangles material="Charcoal-material" count="80">
<input semantic="VERTEX" source="#ID30-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#ID30-mesh-normals" offset="1"/>
<p>0 0 1 0 2 0 1 1 0 1 3 1 1 0 3 0 4 0 4 2 3 2 5 2 4 0 5 0 6 0 6 3 5 3 7 3 6 4 7 4 8 4 8 5 7 5 9 5 8 6 9 6 10 6 10 0 9 0 11 0 11 0 9 0 12 0 11 0 12 0 13 0 14 7 15 7 16 7 15 7 17 7 16 7 16 7 17 7 18 7 18 8 17 8 19 8 17 7 20 7 19 7 19 9 20 9 21 9 20 10 22 10 21 10 21 7 22 7 23 7 22 7 24 7 23 7 23 7 24 7 25 7 24 11 26 11 25 11 27 7 25 7 26 7 28 12 29 13 30 14 31 15 32 16 33 17 34 18 30 14 35 19 36 20 31 15 37 21 34 18 38 22 39 23 40 24 41 25 37 21 39 23 42 26 43 27 44 28 45 29 40 24 46 30 43 27 47 31 48 32 44 28 49 33 50 34 46 30 51 35 52 36 49 33 53 37 54 38 50 34 55 39 56 40 53 37 57 41 58 42 59 43 54 38 57 41 60 44 61 45 59 43 62 46 63 47 64 48 65 49 60 44 63 47 62 46 66 50 67 51 65 49 64 48 68 52 66 50 69 53 70 54 67 51 71 55 68 52 72 56 73 57 74 58 75 59 71 55 73 57 76 60 77 61 78 62 79 63 74 58 77 61 80 64 81 65 82 66 83 67 78 62 81 65 80 64 84 68 85 69 83 67 82 66 30 14 29 13 35 19 36 20 32 16 31 15 34 18 35 19 38 22 41 25 36 20 37 21 39 23 38 22 42 26 45 29 41 25 40 24 43 27 42 26 47 31 48 32 45 29 44 28 46 30 47 31 86 70 87 71 48 32 49 33 51 35 46 30 86 70 87 71 49 33 52 36 55 39 50 34 51 35 52 36 53 37 56 40 58 42 54 38 55 39 56 40 57 41 61 45 62 46 59 43 58 42 61 45 60 44 65 49 66 50 62 46 69 53 70 54 65 49 67 51 68 52 69 53 72 56 75 59 70 54 71 55 73 57 72 56 76 60 79 63 75 59 74 58 77 61 76 60 80 64 83 67 79 63 78 62</p>
</triangles>
</mesh>
</geometry>
</library_geometries>
<library_controllers/>
<library_visual_scenes>
<visual_scene id="Scene" name="Scene">
<node id="Camera" name="Camera" type="NODE">
<matrix sid="transform">0.6859207 -0.3240135 0.6515582 7.481132 0.7276763 0.3054208 -0.6141704 -6.50764 0 0.8953956 0.4452714 5.343665 0 0 0 1</matrix>
<instance_camera url="#Camera-camera"/>
</node>
<node id="Lamp" name="Lamp" type="NODE">
<matrix sid="transform">-0.2908646 -0.7711008 0.5663932 4.076245 0.9551712 -0.1998834 0.2183912 1.005454 -0.05518906 0.6045247 0.7946723 5.903862 0 0 0 1</matrix>
<instance_light url="#Lamp-light"/>
</node>
<node id="Fin_001" name="Fin_001" type="NODE">
<matrix sid="transform">0.0254 0 0 0 0 0.0254 0 0 0 0 0.0254 0 0 0 0 1</matrix>
<instance_geometry url="#ID30-mesh" name="Fin_001">
<bind_material>
<technique_common>
<instance_material symbol="Charcoal-material" target="#Charcoal-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
</visual_scene>
</library_visual_scenes>
<scene>
<instance_visual_scene url="#Scene"/>
</scene>
</COLLADA>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+406
View File
@@ -0,0 +1,406 @@
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
<asset>
<contributor>
<author>Blender User</author>
<authoring_tool>Blender 2.76.0 commit date:2015-11-03, commit time:10:56, hash:f337fea</authoring_tool>
</contributor>
<created>2016-02-29T12:24:33</created>
<modified>2016-02-29T12:24:33</modified>
<unit name="meter" meter="1"/>
<up_axis>Z_UP</up_axis>
</asset>
<library_cameras>
<camera id="Camera-camera" name="Camera">
<optics>
<technique_common>
<perspective>
<xfov sid="xfov">49.13434</xfov>
<aspect_ratio>1.777778</aspect_ratio>
<znear sid="znear">0.1</znear>
<zfar sid="zfar">100</zfar>
</perspective>
</technique_common>
</optics>
<extra>
<technique profile="blender">
<YF_dofdist>0</YF_dofdist>
<shiftx>0</shiftx>
<shifty>0</shifty>
</technique>
</extra>
</camera>
</library_cameras>
<library_lights>
<light id="Lamp-light" name="Lamp">
<technique_common>
<point>
<color sid="color">1 1 1</color>
<constant_attenuation>1</constant_attenuation>
<linear_attenuation>0</linear_attenuation>
<quadratic_attenuation>0.00111109</quadratic_attenuation>
</point>
</technique_common>
<extra>
<technique profile="blender">
<adapt_thresh>0.000999987</adapt_thresh>
<area_shape>1</area_shape>
<area_size>0.1</area_size>
<area_sizey>0.1</area_sizey>
<area_sizez>1</area_sizez>
<atm_distance_factor>1</atm_distance_factor>
<atm_extinction_factor>1</atm_extinction_factor>
<atm_turbidity>2</atm_turbidity>
<att1>0</att1>
<att2>1</att2>
<backscattered_light>1</backscattered_light>
<bias>1</bias>
<blue>1</blue>
<buffers>1</buffers>
<bufflag>0</bufflag>
<bufsize>2880</bufsize>
<buftype>2</buftype>
<clipend>30.002</clipend>
<clipsta>1.000799</clipsta>
<compressthresh>0.04999995</compressthresh>
<dist sid="blender_dist">29.99998</dist>
<energy sid="blender_energy">1</energy>
<falloff_type>2</falloff_type>
<filtertype>0</filtertype>
<flag>0</flag>
<gamma sid="blender_gamma">1</gamma>
<green>1</green>
<halo_intensity sid="blnder_halo_intensity">1</halo_intensity>
<horizon_brightness>1</horizon_brightness>
<mode>8192</mode>
<ray_samp>1</ray_samp>
<ray_samp_method>1</ray_samp_method>
<ray_samp_type>0</ray_samp_type>
<ray_sampy>1</ray_sampy>
<ray_sampz>1</ray_sampz>
<red>1</red>
<samp>3</samp>
<shadhalostep>0</shadhalostep>
<shadow_b sid="blender_shadow_b">0</shadow_b>
<shadow_g sid="blender_shadow_g">0</shadow_g>
<shadow_r sid="blender_shadow_r">0</shadow_r>
<sky_colorspace>0</sky_colorspace>
<sky_exposure>1</sky_exposure>
<skyblendfac>1</skyblendfac>
<skyblendtype>1</skyblendtype>
<soft>3</soft>
<spotblend>0.15</spotblend>
<spotsize>75</spotsize>
<spread>1</spread>
<sun_brightness>1</sun_brightness>
<sun_effect_type>0</sun_effect_type>
<sun_intensity>1</sun_intensity>
<sun_size>1</sun_size>
<type>0</type>
</technique>
</extra>
</light>
</library_lights>
<library_images/>
<library_effects>
<effect id="silver-effect">
<profile_COMMON>
<technique sid="common">
<phong>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<ambient>
<color sid="ambient">0 0 0 1</color>
</ambient>
<diffuse>
<color sid="diffuse">0.64 0.64 0.64 1</color>
</diffuse>
<specular>
<color sid="specular">0.5 0.5 0.5 1</color>
</specular>
<shininess>
<float sid="shininess">50</float>
</shininess>
<transparency>
<float sid="transparency">0.46875</float>
</transparency>
<index_of_refraction>
<float sid="index_of_refraction">1</float>
</index_of_refraction>
</phong>
</technique>
</profile_COMMON>
</effect>
<effect id="black-effect">
<profile_COMMON>
<technique sid="common">
<phong>
<emission>
<color sid="emission">0 0 0 1</color>
</emission>
<ambient>
<color sid="ambient">0 0 0 1</color>
</ambient>
<diffuse>
<color sid="diffuse">0 0 0 1</color>
</diffuse>
<specular>
<color sid="specular">0.5 0.5 0.5 1</color>
</specular>
<shininess>
<float sid="shininess">50</float>
</shininess>
<index_of_refraction>
<float sid="index_of_refraction">1</float>
</index_of_refraction>
</phong>
</technique>
</profile_COMMON>
</effect>
</library_effects>
<library_materials>
<material id="silver-material" name="silver">
<instance_effect url="#silver-effect"/>
</material>
<material id="black-material" name="black">
<instance_effect url="#black-effect"/>
</material>
</library_materials>
<library_geometries>
<geometry id="Cylinder_005-mesh" name="Cylinder.005">
<mesh>
<source id="Cylinder_005-mesh-positions">
<float_array id="Cylinder_005-mesh-positions-array" count="192">0 0.2 -0.15 0 0.2 0.15 0.03901803 0.196157 -0.15 0.03901803 0.196157 0.15 0.07653665 0.1847759 -0.15 0.07653665 0.1847759 0.15 0.111114 0.1662939 -0.15 0.111114 0.1662939 0.15 0.1414213 0.1414213 -0.15 0.1414213 0.1414213 0.15 0.1662939 0.111114 -0.15 0.1662939 0.111114 0.15 0.1847759 0.07653665 -0.15 0.1847759 0.07653665 0.15 0.196157 0.03901803 -0.15 0.196157 0.03901803 0.15 0.2 0 -0.15 0.2 0 0.15 0.196157 -0.03901803 -0.15 0.196157 -0.03901803 0.15 0.1847759 -0.07653665 -0.15 0.1847759 -0.07653665 0.15 0.1662939 -0.111114 -0.15 0.1662939 -0.111114 0.15 0.1414213 -0.1414213 -0.15 0.1414213 -0.1414213 0.15 0.111114 -0.1662939 -0.15 0.111114 -0.1662939 0.15 0.07653665 -0.1847759 -0.15 0.07653665 -0.1847759 0.15 0.03901797 -0.196157 -0.15 0.03901797 -0.196157 0.15 0 -0.2 -0.15 0 -0.2 0.15 -0.03901809 -0.196157 -0.15 -0.03901809 -0.196157 0.15 -0.07653677 -0.1847758 -0.15 -0.07653677 -0.1847758 0.15 -0.1111141 -0.1662938 -0.15 -0.1111141 -0.1662938 0.15 -0.1414214 -0.1414213 -0.15 -0.1414214 -0.1414213 0.15 -0.166294 -0.1111139 -0.15 -0.166294 -0.1111139 0.15 -0.184776 -0.07653653 -0.15 -0.184776 -0.07653653 0.15 -0.196157 -0.03901785 -0.15 -0.196157 -0.03901785 0.15 -0.2 1.9312e-7 -0.15 -0.2 1.9312e-7 0.15 -0.196157 0.03901827 -0.15 -0.196157 0.03901827 0.15 -0.1847758 0.07653689 -0.15 -0.1847758 0.07653689 0.15 -0.1662937 0.1111142 -0.15 -0.1662937 0.1111142 0.15 -0.1414211 0.1414215 -0.15 -0.1414211 0.1414215 0.15 -0.1111138 0.166294 -0.15 -0.1111138 0.166294 0.15 -0.07653641 0.184776 -0.15 -0.07653641 0.184776 0.15 -0.03901773 0.1961571 -0.15 -0.03901773 0.1961571 0.15</float_array>
<technique_common>
<accessor source="#Cylinder_005-mesh-positions-array" count="64" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cylinder_005-mesh-normals">
<float_array id="Cylinder_005-mesh-normals-array" count="264">0.09801727 0.9951848 0 0.2902846 0.9569404 0 0.4713969 0.8819212 0 0.634393 0.7730107 0 0.7730106 0.6343932 0 0.8819212 0.4713968 0 0.9569404 0.2902849 0 0.9951848 0.09801691 0 0.9951847 -0.09801757 0 0.9569404 -0.2902849 0 0.8819212 -0.4713969 0 0.7730106 -0.6343932 0 0.6343932 -0.7730105 0 0.4713968 -0.8819212 0 0.2902842 -0.9569405 0 0.09801685 -0.9951848 0 -0.09801763 -0.9951847 0 -0.290285 -0.9569404 0 -0.4713973 -0.8819209 0 -0.6343935 -0.7730104 0 -0.7730111 -0.6343925 0 -0.8819215 -0.4713964 0 -0.9569407 -0.2902836 0 -0.9951849 -0.0980162 0 -0.9951848 0.09801751 0 -0.95694 0.2902861 0 -0.8819208 0.4713977 0 -0.7730095 0.6343945 0 -0.6343922 0.7730115 0 -0.4713954 0.881922 0 0 0 1 -0.0980165 0.9951848 0 -0.2902831 0.9569408 0 0 0 -1 0.2902846 0.9569404 0 0.8819215 0.4713963 0 0.9569405 0.2902844 0 0.9951847 0.09801757 0 0.9951849 -0.09801632 0 0.9569405 -0.2902844 0 0.8819218 -0.471396 0 0.2902842 -0.9569405 0 0.09801685 -0.9951848 0 -0.2902849 -0.9569403 0 -0.4713972 -0.8819211 0 -0.6343938 -0.7730101 0 -0.7730108 -0.6343929 0 -0.8819217 -0.4713959 0 -0.9569409 -0.290283 0 -0.9951848 -0.09801685 0 -0.9951847 0.0980181 0 -0.7730098 0.6343941 0 -0.6343924 0.7730112 0 -0.4713953 0.881922 0 3.88196e-7 0 1 -2.62158e-7 0 1 1.06916e-6 0 1 0 0 1 -3.10555e-6 0 1 2.09724e-6 0 1 -3.88195e-7 0 1 2.62155e-7 0 1 -2.09724e-6 0 1 5.34582e-7 0 1 -1.33646e-7 0 1 1.06917e-6 0 1 -2.24842e-7 0 1 -4.49682e-7 0 1 2.24841e-7 0 1 -4.49682e-7 0 1 0 0 1 0 0 -1 -1.55278e-6 0 -1 -7.76388e-7 0 -1 3.10557e-6 0 -1 -3.10555e-6 0 -1 -4.65833e-6 0 -1 2.09724e-6 0 -1 1.06916e-6 0 -1 2.13833e-6 0 -1 3.9964e-7 0 -1 3.9964e-7 0 -1 -1.59856e-6 0 -1 -1.33645e-7 0 -1 -2.24842e-7 0 -1 -1.86265e-7 0 -1 0 0 -1 1.64636e-7 0 -1</float_array>
<technique_common>
<accessor source="#Cylinder_005-mesh-normals-array" count="88" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cylinder_005-mesh-vertices">
<input semantic="POSITION" source="#Cylinder_005-mesh-positions"/>
</vertices>
<polylist material="silver-material" count="124">
<input semantic="VERTEX" source="#Cylinder_005-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cylinder_005-mesh-normals" offset="1"/>
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
<p>1 0 3 0 2 0 3 1 5 1 4 1 5 2 7 2 6 2 7 3 9 3 8 3 9 4 11 4 10 4 11 5 13 5 12 5 13 6 15 6 14 6 15 7 17 7 16 7 17 8 19 8 18 8 19 9 21 9 20 9 21 10 23 10 22 10 23 11 25 11 24 11 25 12 27 12 26 12 27 13 29 13 28 13 29 14 31 14 30 14 31 15 33 15 32 15 33 16 35 16 34 16 35 17 37 17 36 17 37 18 39 18 38 18 39 19 41 19 40 19 41 20 43 20 42 20 43 21 45 21 44 21 45 22 47 22 46 22 47 23 49 23 48 23 49 24 51 24 50 24 51 25 53 25 52 25 53 26 55 26 54 26 55 27 57 27 56 27 57 28 59 28 58 28 59 29 61 29 60 29 37 30 21 30 53 30 63 31 1 31 0 31 61 32 63 32 62 32 30 33 46 33 62 33 0 0 1 0 2 0 2 34 3 34 4 34 4 2 5 2 6 2 6 3 7 3 8 3 8 4 9 4 10 4 10 35 11 35 12 35 12 36 13 36 14 36 14 37 15 37 16 37 16 38 17 38 18 38 18 39 19 39 20 39 20 40 21 40 22 40 22 11 23 11 24 11 24 12 25 12 26 12 26 13 27 13 28 13 28 41 29 41 30 41 30 42 31 42 32 42 32 16 33 16 34 16 34 43 35 43 36 43 36 44 37 44 38 44 38 45 39 45 40 45 40 46 41 46 42 46 42 47 43 47 44 47 44 48 45 48 46 48 46 49 47 49 48 49 48 50 49 50 50 50 50 25 51 25 52 25 52 26 53 26 54 26 54 51 55 51 56 51 56 52 57 52 58 52 58 53 59 53 60 53 5 54 3 54 1 54 1 55 63 55 5 55 61 56 59 56 53 56 57 57 55 57 53 57 53 58 51 58 49 58 49 57 47 57 53 57 45 57 43 57 41 57 41 59 39 59 45 59 37 60 35 60 33 60 33 61 31 61 37 61 29 57 27 57 21 57 25 57 23 57 21 57 21 57 19 57 17 57 17 57 15 57 21 57 13 57 11 57 9 57 9 57 7 57 13 57 5 57 63 57 61 57 59 62 57 62 53 62 53 63 47 63 45 63 45 57 39 57 37 57 37 64 31 64 29 64 27 57 25 57 21 57 21 57 15 57 13 57 13 65 7 65 5 65 5 66 61 66 53 66 53 67 45 67 37 67 37 68 29 68 21 68 21 69 13 69 5 69 5 70 53 70 21 70 62 31 63 31 0 31 60 32 61 32 62 32 62 71 0 71 2 71 2 71 4 71 6 71 6 71 8 71 10 71 10 71 12 71 6 71 14 71 16 71 18 71 18 71 20 71 14 71 22 72 24 72 26 72 26 73 28 73 30 73 30 71 32 71 34 71 34 71 36 71 38 71 38 74 40 74 42 74 42 75 44 75 46 75 46 71 48 71 50 71 50 71 52 71 46 71 54 76 56 76 58 76 58 77 60 77 54 77 62 71 2 71 6 71 6 78 12 78 14 78 14 79 20 79 22 79 22 80 26 80 30 80 30 81 34 81 38 81 38 82 42 82 46 82 46 71 52 71 54 71 54 83 60 83 62 83 62 84 6 84 14 84 14 85 22 85 62 85 30 71 38 71 46 71 46 86 54 86 62 86 62 87 22 87 30 87</p>
</polylist>
</mesh>
</geometry>
<geometry id="Cylinder_001-mesh" name="Cylinder.001">
<mesh>
<source id="Cylinder_001-mesh-positions">
<float_array id="Cylinder_001-mesh-positions-array" count="192">0 0.18 -0.775 0 0.18 0.775 0.03511625 0.1765413 -0.775 0.03511625 0.1765413 0.775 0.068883 0.1662983 -0.775 0.068883 0.1662983 0.775 0.1000026 0.1496645 -0.775 0.1000026 0.1496645 0.775 0.1272792 0.1272792 -0.775 0.1272792 0.1272792 0.775 0.1496645 0.1000026 -0.775 0.1496645 0.1000026 0.775 0.1662983 0.068883 -0.775 0.1662983 0.068883 0.775 0.1765413 0.03511625 -0.775 0.1765413 0.03511625 0.775 0.18 0 -0.775 0.18 0 0.775 0.1765413 -0.03511619 -0.775 0.1765413 -0.03511619 0.775 0.1662983 -0.068883 -0.775 0.1662983 -0.068883 0.775 0.1496645 -0.1000026 -0.775 0.1496645 -0.1000026 0.775 0.1272792 -0.1272792 -0.775 0.1272792 -0.1272792 0.775 0.1000026 -0.1496645 -0.775 0.1000026 -0.1496645 0.775 0.068883 -0.1662983 -0.775 0.068883 -0.1662983 0.775 0.03511619 -0.1765413 -0.775 0.03511619 -0.1765413 0.775 0 -0.18 -0.775 0 -0.18 0.775 -0.03511631 -0.1765413 -0.775 -0.03511631 -0.1765413 0.775 -0.06888306 -0.1662983 -0.775 -0.06888306 -0.1662983 0.775 -0.1000027 -0.1496645 -0.775 -0.1000027 -0.1496645 0.775 -0.1272793 -0.1272791 -0.775 -0.1272793 -0.1272791 0.775 -0.1496646 -0.1000025 -0.775 -0.1496646 -0.1000025 0.775 -0.1662983 -0.06888288 -0.775 -0.1662983 -0.06888288 0.775 -0.1765413 -0.03511607 -0.775 -0.1765413 -0.03511607 0.775 -0.18 1.73808e-7 -0.775 -0.18 1.73808e-7 0.775 -0.1765413 0.03511643 -0.775 -0.1765413 0.03511643 0.775 -0.1662982 0.06888318 -0.775 -0.1662982 0.06888318 0.775 -0.1496644 0.1000028 -0.775 -0.1496644 0.1000028 0.775 -0.1272791 0.1272794 -0.775 -0.1272791 0.1272794 0.775 -0.1000024 0.1496647 -0.775 -0.1000024 0.1496647 0.775 -0.06888276 0.1662984 -0.775 -0.06888276 0.1662984 0.775 -0.03511595 0.1765414 -0.775 -0.03511595 0.1765414 0.775</float_array>
<technique_common>
<accessor source="#Cylinder_001-mesh-positions-array" count="64" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cylinder_001-mesh-normals">
<float_array id="Cylinder_001-mesh-normals-array" count="273">0.09801709 0.9951848 0 0.2902849 0.9569404 0 0.4713966 0.8819214 0 0.6343933 0.7730105 0 0.7730104 0.6343933 0 0.8819214 0.4713965 0 0.9569403 0.2902849 0 0.9951847 0.09801703 0 0.9951847 -0.0980181 0 0.9569403 -0.2902848 0 0.8819214 -0.4713967 0 0.7730102 -0.6343936 0 0.6343936 -0.7730103 0 0.4713967 -0.8819213 0 0.290284 -0.9569406 0 0.09801703 -0.9951848 0 -0.09801745 -0.9951848 0 -0.2902853 -0.9569402 0 -0.471397 -0.8819211 0 -0.6343938 -0.7730101 0 -0.7730107 -0.634393 0 -0.8819217 -0.471396 0 -0.9569407 -0.2902836 0 -0.9951848 -0.09801697 0 -0.9951846 0.09801918 0 -0.95694 0.2902858 0 -0.8819206 0.4713982 0 -0.7730095 0.6343944 0 -0.6343923 0.7730114 0 -0.4713953 0.881922 0 -4.59912e-7 0 1 -0.09801661 0.9951848 0 -0.2902831 0.9569408 0 0 0 -1 0.6343935 0.7730103 0 0.7730102 0.6343936 0 0.8819217 0.4713961 0 0.9951847 0.0980181 0 0.9951847 -0.09801703 0 0.9569406 -0.2902838 0 0.8819215 -0.4713962 0 0.7730104 -0.6343933 0 0.290284 -0.9569405 0 0.09801703 -0.9951848 0 -0.09801745 -0.9951847 0 -0.2902852 -0.9569402 0 -0.4713972 -0.881921 0 -0.6343936 -0.7730103 0 -0.773011 -0.6343927 0 -0.8819221 -0.4713952 0 -0.9569404 -0.2902846 0 -0.9951848 -0.0980159 0 -0.9951847 0.09801805 0 -0.8819212 0.4713969 0 -0.6343925 0.7730112 0 -0.4713955 0.881922 0 5.75107e-6 0 1 0 0 1 -1.5336e-5 0 1 3.06722e-5 0 1 1.53361e-5 0 1 5.75098e-6 0 1 -1.5336e-5 0 1 1.53361e-5 0 1 -1.05596e-5 0 1 1.53361e-5 0 1 7.66807e-6 0 1 -2.07134e-5 0 1 -2.63991e-6 0 1 -1.31996e-6 0 1 6.93011e-7 0 1 -1.97353e-6 0 1 9.19825e-7 0 1 -1.50022e-6 0 1 3.25207e-7 0 1 0 0 -1 2.5892e-6 0 -1 1.53361e-5 0 -1 -2.07135e-5 0 -1 -7.66801e-6 0 -1 1.53361e-5 0 -1 -1.53361e-5 0 -1 -3.06722e-5 0 -1 -5.27982e-6 0 -1 -7.91975e-6 0 -1 -5.17835e-6 0 -1 -2.63991e-6 0 -1 5.17835e-6 0 -1 2.77204e-6 0 -1 2.77204e-6 0 -1 0 0 -1</float_array>
<technique_common>
<accessor source="#Cylinder_001-mesh-normals-array" count="91" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cylinder_001-mesh-vertices">
<input semantic="POSITION" source="#Cylinder_001-mesh-positions"/>
</vertices>
<polylist material="silver-material" count="124">
<input semantic="VERTEX" source="#Cylinder_001-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cylinder_001-mesh-normals" offset="1"/>
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
<p>1 0 3 0 2 0 3 1 5 1 4 1 5 2 7 2 6 2 7 3 9 3 8 3 9 4 11 4 10 4 11 5 13 5 12 5 13 6 15 6 14 6 15 7 17 7 16 7 17 8 19 8 18 8 19 9 21 9 20 9 21 10 23 10 22 10 23 11 25 11 24 11 25 12 27 12 26 12 27 13 29 13 28 13 29 14 31 14 30 14 31 15 33 15 32 15 33 16 35 16 34 16 35 17 37 17 36 17 37 18 39 18 38 18 39 19 41 19 40 19 41 20 43 20 42 20 43 21 45 21 44 21 45 22 47 22 46 22 47 23 49 23 48 23 49 24 51 24 50 24 51 25 53 25 52 25 53 26 55 26 54 26 55 27 57 27 56 27 57 28 59 28 58 28 59 29 61 29 60 29 37 30 21 30 5 30 63 31 1 31 0 31 61 32 63 32 62 32 30 33 46 33 14 33 0 0 1 0 2 0 2 1 3 1 4 1 4 2 5 2 6 2 6 34 7 34 8 34 8 35 9 35 10 35 10 36 11 36 12 36 12 6 13 6 14 6 14 37 15 37 16 37 16 38 17 38 18 38 18 39 19 39 20 39 20 40 21 40 22 40 22 41 23 41 24 41 24 12 25 12 26 12 26 13 27 13 28 13 28 42 29 42 30 42 30 43 31 43 32 43 32 44 33 44 34 44 34 45 35 45 36 45 36 46 37 46 38 46 38 47 39 47 40 47 40 48 41 48 42 48 42 49 43 49 44 49 44 50 45 50 46 50 46 51 47 51 48 51 48 52 49 52 50 52 50 25 51 25 52 25 52 53 53 53 54 53 54 27 55 27 56 27 56 54 57 54 58 54 58 55 59 55 60 55 5 56 3 56 1 56 1 57 63 57 5 57 61 57 59 57 57 57 57 58 55 58 53 58 53 57 51 57 45 57 49 59 47 59 45 59 45 60 43 60 41 60 41 57 39 57 45 57 37 61 35 61 33 61 33 57 31 57 37 57 29 62 27 62 25 62 25 63 23 63 21 63 21 64 19 64 13 64 17 65 15 65 13 65 13 57 11 57 9 57 9 66 7 66 5 66 5 57 63 57 61 57 61 57 57 57 53 57 51 67 49 67 45 67 45 68 39 68 37 68 37 69 31 69 29 69 29 70 25 70 37 70 19 57 17 57 13 57 13 71 9 71 5 71 5 57 61 57 53 57 53 72 45 72 5 72 37 73 25 73 21 73 21 57 13 57 5 57 5 74 45 74 37 74 62 31 63 31 0 31 60 32 61 32 62 32 62 75 0 75 2 75 2 76 4 76 62 76 6 77 8 77 10 77 10 75 12 75 6 75 14 75 16 75 18 75 18 78 20 78 14 78 22 75 24 75 30 75 26 79 28 79 30 79 30 75 32 75 34 75 34 75 36 75 38 75 38 80 40 80 42 80 42 75 44 75 38 75 46 81 48 81 50 81 50 82 52 82 54 82 54 83 56 83 62 83 58 75 60 75 62 75 62 75 4 75 6 75 6 84 12 84 14 84 14 75 20 75 22 75 24 85 26 85 30 85 30 75 34 75 46 75 38 86 44 86 46 86 46 75 50 75 62 75 56 87 58 87 62 87 62 75 6 75 14 75 14 75 22 75 30 75 34 88 38 88 46 88 50 89 54 89 62 89 62 90 14 90 46 90</p>
</polylist>
</mesh>
</geometry>
<geometry id="Cylinder_002-mesh" name="Cylinder.002">
<mesh>
<source id="Cylinder_002-mesh-positions">
<float_array id="Cylinder_002-mesh-positions-array" count="192">0 0.07999998 -0.15 0 0.07999998 0.15 0.01560717 0.07846277 -0.15 0.01560717 0.07846277 0.15 0.03061467 0.07391035 -0.15 0.03061467 0.07391035 0.15 0.04444557 0.06651753 -0.15 0.04444557 0.06651753 0.15 0.0565685 0.0565685 -0.15 0.0565685 0.0565685 0.15 0.06651753 0.04444557 -0.15 0.06651753 0.04444557 0.15 0.07391035 0.03061467 -0.15 0.07391035 0.03061467 0.15 0.07846277 0.01560717 -0.15 0.07846277 0.01560717 0.15 0.07999998 0 -0.15 0.07999998 0 0.15 0.07846277 -0.01560717 -0.15 0.07846277 -0.01560717 0.15 0.07391035 -0.03061461 -0.15 0.07391035 -0.03061461 0.15 0.06651753 -0.04444557 -0.15 0.06651753 -0.04444557 0.15 0.0565685 -0.0565685 -0.15 0.0565685 -0.0565685 0.15 0.04444557 -0.06651753 -0.15 0.04444557 -0.06651753 0.15 0.03061461 -0.07391035 -0.15 0.03061461 -0.07391035 0.15 0.01560717 -0.07846277 -0.15 0.01560717 -0.07846277 0.15 0 -0.07999998 -0.15 0 -0.07999998 0.15 -0.01560723 -0.07846277 -0.15 -0.01560723 -0.07846277 0.15 -0.03061467 -0.07391029 -0.15 -0.03061467 -0.07391029 0.15 -0.04444563 -0.06651753 -0.15 -0.04444563 -0.06651753 0.15 -0.05656856 -0.0565685 -0.15 -0.05656856 -0.0565685 0.15 -0.06651759 -0.04444557 -0.15 -0.06651759 -0.04444557 0.15 -0.07391035 -0.03061461 -0.15 -0.07391035 -0.03061461 0.15 -0.07846283 -0.01560711 -0.15 -0.07846283 -0.01560711 0.15 -0.07999998 0 -0.15 -0.07999998 0 0.15 -0.07846277 0.01560729 -0.15 -0.07846277 0.01560729 0.15 -0.07391029 0.03061473 -0.15 -0.07391029 0.03061473 0.15 -0.06651747 0.04444569 -0.15 -0.06651747 0.04444569 0.15 -0.05656844 0.05656856 -0.15 -0.05656844 0.05656856 0.15 -0.04444551 0.06651759 -0.15 -0.04444551 0.06651759 0.15 -0.03061455 0.07391041 -0.15 -0.03061455 0.07391041 0.15 -0.01560705 0.07846283 -0.15 -0.01560705 0.07846283 0.15</float_array>
<technique_common>
<accessor source="#Cylinder_002-mesh-positions-array" count="64" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cylinder_002-mesh-normals">
<float_array id="Cylinder_002-mesh-normals-array" count="267">0.09801739 0.9951848 0 0.2902847 0.9569404 0 0.4713963 0.8819216 0 0.6343933 0.7730105 0 0.7730104 0.6343935 0 0.8819214 0.4713966 0 0.9569401 0.2902858 0 0.9951848 0.09801644 0 0.9951848 -0.09801721 0 0.9569402 -0.2902851 0 0.8819216 -0.4713962 0 0.7730108 -0.634393 0 0.6343933 -0.7730105 0 0.4713969 -0.8819213 0 0.2902842 -0.9569405 0 0.09801685 -0.9951848 0 -0.09801733 -0.9951848 0 -0.2902856 -0.9569401 0 -0.4713971 -0.8819211 0 -0.6343935 -0.7730103 0 -0.773011 -0.6343927 0 -0.8819217 -0.4713962 0 -0.9569407 -0.2902835 0 -0.9951848 -0.09801638 0 -0.9951847 0.09801799 0 -0.95694 0.2902858 0 -0.8819208 0.4713977 0 -0.7730091 0.6343949 0 -0.6343923 0.7730113 0 -0.4713953 0.8819221 0 0 0 1 -0.09801667 0.9951848 0 -0.2902828 0.956941 0 0 0 -1 0.2902848 0.9569404 0 0.4713965 0.8819214 0 0.6343935 0.7730103 0 0.7730108 0.634393 0 0.8819217 0.471396 0 0.9569405 0.2902843 0 0.9951847 0.09801799 0 0.9951848 -0.09801644 0 0.9569405 -0.2902844 0 0.8819213 -0.4713969 0 0.7730104 -0.6343935 0 0.6343931 -0.7730106 0 0.09801685 -0.9951848 0 -0.2902855 -0.9569402 0 -0.6343937 -0.7730103 0 -0.881922 -0.4713956 0 -0.9569405 -0.2902842 0 -0.9951847 0.09801876 0 -0.9569402 0.2902851 0 -0.77301 0.634394 0 -0.6343927 0.773011 0 -0.4713956 0.8819219 0 -1.21312e-6 0 1 -9.70489e-6 0 1 -4.85242e-6 0 1 -4.8524e-6 0 1 -1.2131e-6 0 1 8.19234e-7 0 1 -9.70487e-6 0 1 -6.55388e-6 0 1 4.85244e-6 0 1 4.85241e-6 0 1 1.24887e-6 0 1 3.27693e-6 0 1 2.3734e-7 0 1 3.51314e-7 0 1 -7.02629e-7 0 1 -0.2902829 0.9569409 0 -8.19245e-7 0 -1 4.85244e-6 0 -1 -6.55387e-6 0 -1 -9.70487e-6 0 -1 -1.67057e-6 0 -1 2.42618e-6 0 -1 8.35288e-7 0 -1 3.34114e-6 0 -1 1.67057e-6 0 -1 -1.87331e-6 0 -1 9.49358e-7 0 -1 1.63846e-6 0 -1 -3.51315e-7 0 -1 5.82077e-7 0 -1 3.51314e-7 0 -1 -8.77092e-7 0 -1 -2.05795e-7 0 -1</float_array>
<technique_common>
<accessor source="#Cylinder_002-mesh-normals-array" count="89" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cylinder_002-mesh-vertices">
<input semantic="POSITION" source="#Cylinder_002-mesh-positions"/>
</vertices>
<polylist material="black-material" count="124">
<input semantic="VERTEX" source="#Cylinder_002-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cylinder_002-mesh-normals" offset="1"/>
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
<p>1 0 3 0 2 0 3 1 5 1 4 1 5 2 7 2 6 2 7 3 9 3 8 3 9 4 11 4 10 4 11 5 13 5 12 5 13 6 15 6 14 6 15 7 17 7 16 7 17 8 19 8 18 8 19 9 21 9 20 9 21 10 23 10 22 10 23 11 25 11 24 11 25 12 27 12 26 12 27 13 29 13 28 13 29 14 31 14 30 14 31 15 33 15 32 15 33 16 35 16 34 16 35 17 37 17 36 17 37 18 39 18 38 18 39 19 41 19 40 19 41 20 43 20 42 20 43 21 45 21 44 21 45 22 47 22 46 22 47 23 49 23 48 23 49 24 51 24 50 24 51 25 53 25 52 25 53 26 55 26 54 26 55 27 57 27 56 27 57 28 59 28 58 28 59 29 61 29 60 29 37 30 21 30 5 30 63 31 1 31 0 31 61 32 63 32 62 32 30 33 46 33 62 33 0 0 1 0 2 0 2 34 3 34 4 34 4 35 5 35 6 35 6 36 7 36 8 36 8 37 9 37 10 37 10 38 11 38 12 38 12 39 13 39 14 39 14 40 15 40 16 40 16 41 17 41 18 41 18 42 19 42 20 42 20 43 21 43 22 43 22 44 23 44 24 44 24 45 25 45 26 45 26 13 27 13 28 13 28 14 29 14 30 14 30 46 31 46 32 46 32 16 33 16 34 16 34 47 35 47 36 47 36 18 37 18 38 18 38 48 39 48 40 48 40 20 41 20 42 20 42 49 43 49 44 49 44 50 45 50 46 50 46 23 47 23 48 23 48 51 49 51 50 51 50 52 51 52 52 52 52 26 53 26 54 26 54 53 55 53 56 53 56 54 57 54 58 54 58 55 59 55 60 55 5 56 3 56 1 56 1 30 63 30 5 30 61 30 59 30 57 30 57 30 55 30 53 30 53 30 51 30 45 30 49 57 47 57 45 57 45 58 43 58 41 58 41 59 39 59 37 59 37 60 35 60 33 60 33 61 31 61 37 61 29 30 27 30 21 30 25 62 23 62 21 62 21 30 19 30 17 30 17 63 15 63 21 63 13 64 11 64 9 64 9 65 7 65 5 65 5 30 63 30 61 30 61 30 57 30 5 30 51 30 49 30 45 30 45 66 41 66 37 66 37 30 31 30 29 30 27 67 25 67 21 67 21 30 15 30 13 30 13 30 9 30 5 30 5 68 57 68 53 68 53 30 45 30 37 30 37 69 29 69 21 69 21 70 13 70 5 70 5 30 53 30 37 30 62 31 63 31 0 31 60 71 61 71 62 71 62 33 0 33 2 33 2 72 4 72 62 72 6 73 8 73 10 73 10 33 12 33 6 33 14 33 16 33 18 33 18 74 20 74 14 74 22 73 24 73 26 73 26 73 28 73 30 73 30 33 32 33 34 33 34 33 36 33 30 33 38 33 40 33 42 33 42 75 44 75 46 75 46 33 48 33 50 33 50 33 52 33 54 33 54 76 56 76 62 76 58 77 60 77 62 77 62 78 4 78 6 78 6 79 12 79 14 79 14 80 20 80 22 80 22 81 26 81 30 81 30 33 36 33 38 33 38 33 42 33 46 33 46 82 50 82 62 82 56 83 58 83 62 83 62 84 6 84 14 84 14 85 22 85 62 85 30 86 38 86 46 86 50 87 54 87 62 87 62 88 22 88 30 88</p>
</polylist>
</mesh>
</geometry>
<geometry id="Cylinder_007-mesh" name="Cylinder.007">
<mesh>
<source id="Cylinder_007-mesh-positions">
<float_array id="Cylinder_007-mesh-positions-array" count="192">0 0.2 -0.1 0 0.2 0.1 0.03901803 0.196157 -0.1 0.03901803 0.196157 0.1 0.07653665 0.1847759 -0.1 0.07653665 0.1847759 0.1 0.111114 0.1662939 -0.1 0.111114 0.1662939 0.1 0.1414213 0.1414213 -0.1 0.1414213 0.1414213 0.1 0.1662939 0.111114 -0.1 0.1662939 0.111114 0.1 0.1847759 0.07653665 -0.1 0.1847759 0.07653665 0.1 0.196157 0.03901803 -0.1 0.196157 0.03901803 0.1 0.2 0 -0.1 0.2 0 0.1 0.196157 -0.03901803 -0.1 0.196157 -0.03901803 0.1 0.1847759 -0.07653665 -0.1 0.1847759 -0.07653665 0.1 0.1662939 -0.111114 -0.1 0.1662939 -0.111114 0.1 0.1414213 -0.1414213 -0.1 0.1414213 -0.1414213 0.1 0.111114 -0.1662939 -0.1 0.111114 -0.1662939 0.1 0.07653665 -0.1847759 -0.1 0.07653665 -0.1847759 0.1 0.03901797 -0.196157 -0.1 0.03901797 -0.196157 0.1 0 -0.2 -0.1 0 -0.2 0.1 -0.03901809 -0.196157 -0.1 -0.03901809 -0.196157 0.1 -0.07653677 -0.1847758 -0.1 -0.07653677 -0.1847758 0.1 -0.1111141 -0.1662938 -0.1 -0.1111141 -0.1662938 0.1 -0.1414214 -0.1414213 -0.1 -0.1414214 -0.1414213 0.1 -0.166294 -0.1111139 -0.1 -0.166294 -0.1111139 0.1 -0.184776 -0.07653653 -0.1 -0.184776 -0.07653653 0.1 -0.196157 -0.03901785 -0.1 -0.196157 -0.03901785 0.1 -0.2 1.9312e-7 -0.1 -0.2 1.9312e-7 0.1 -0.196157 0.03901827 -0.1 -0.196157 0.03901827 0.1 -0.1847758 0.07653689 -0.1 -0.1847758 0.07653689 0.1 -0.1662937 0.1111142 -0.1 -0.1662937 0.1111142 0.1 -0.1414211 0.1414215 -0.1 -0.1414211 0.1414215 0.1 -0.1111138 0.166294 -0.1 -0.1111138 0.166294 0.1 -0.07653641 0.184776 -0.1 -0.07653641 0.184776 0.1 -0.03901773 0.1961571 -0.1 -0.03901773 0.1961571 0.1</float_array>
<technique_common>
<accessor source="#Cylinder_007-mesh-positions-array" count="64" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cylinder_007-mesh-normals">
<float_array id="Cylinder_007-mesh-normals-array" count="246">0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713969 0.8819212 0 0.634393 0.7730107 0 0.7730104 0.6343935 0 0.8819213 0.4713968 0 0.9569402 0.2902852 0 0.9951847 0.09801787 0 0.9951848 -0.09801691 0 0.9569405 -0.2902844 0 0.8819214 -0.4713965 0 0.7730105 -0.6343932 0 0.6343932 -0.7730105 0 0.4713969 -0.8819213 0 0.2902842 -0.9569405 0 0.09801685 -0.9951848 0 -0.09801763 -0.9951848 0 -0.290285 -0.9569403 0 -0.4713971 -0.8819211 0 -0.6343935 -0.7730103 0 -0.773011 -0.6343926 0 -0.8819215 -0.4713964 0 -0.9569408 -0.2902833 0 -0.9951848 -0.09801685 0 -0.9951847 0.09801781 0 -0.95694 0.2902861 0 -0.8819209 0.4713975 0 -0.7730097 0.6343942 0 -0.634392 0.7730115 0 -0.4713956 0.881922 0 0 0 1 -0.0980165 0.9951848 0 -0.290283 0.9569409 0 0 0 -1 0.2902846 0.9569404 0 0.4713968 0.8819214 0 0.6343932 0.7730105 0 0.7730105 0.6343932 0 0.8819217 0.4713961 0 0.9569405 0.2902844 0 0.9951848 0.09801691 0 0.9569402 -0.2902852 0 0.7730104 -0.6343935 0 0.2902842 -0.9569405 0 -0.09801763 -0.9951848 0 -0.290285 -0.9569403 0 -0.4713972 -0.8819211 0 -0.6343939 -0.77301 0 -0.7730109 -0.634393 0 -0.8819219 -0.4713957 0 -0.9951847 0.09801876 0 -0.6343925 0.7730111 0 -0.4713953 0.8819221 0 1.94098e-7 0 1 0 0 1 1.55278e-6 0 1 1.55278e-6 0 1 5.82293e-7 0 1 -1.06916e-6 0 1 2.09724e-6 0 1 1.55278e-6 0 1 -2.67291e-7 0 1 -8.01872e-7 0 1 1.04862e-6 0 1 -5.34582e-7 0 1 0 0 1 1.94101e-7 0 -1 7.76388e-7 0 -1 0 0 -1 2.09724e-6 0 -1 1.94096e-7 0 -1 1.55278e-6 0 -1 1.55278e-6 0 -1 -1.55278e-6 0 -1 -1.99821e-7 0 -1 5.34582e-7 0 -1 5.34582e-7 0 -1 1.9982e-7 0 -1 -7.99279e-7 0 -1 2.6729e-7 0 -1 0 0 -1 -2.24841e-7 0 -1</float_array>
<technique_common>
<accessor source="#Cylinder_007-mesh-normals-array" count="82" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cylinder_007-mesh-vertices">
<input semantic="POSITION" source="#Cylinder_007-mesh-positions"/>
</vertices>
<polylist material="silver-material" count="124">
<input semantic="VERTEX" source="#Cylinder_007-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cylinder_007-mesh-normals" offset="1"/>
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
<p>1 0 3 0 2 0 3 1 5 1 4 1 5 2 7 2 6 2 7 3 9 3 8 3 9 4 11 4 10 4 11 5 13 5 12 5 13 6 15 6 14 6 15 7 17 7 16 7 17 8 19 8 18 8 19 9 21 9 20 9 21 10 23 10 22 10 23 11 25 11 24 11 25 12 27 12 26 12 27 13 29 13 28 13 29 14 31 14 30 14 31 15 33 15 32 15 33 16 35 16 34 16 35 17 37 17 36 17 37 18 39 18 38 18 39 19 41 19 40 19 41 20 43 20 42 20 43 21 45 21 44 21 45 22 47 22 46 22 47 23 49 23 48 23 49 24 51 24 50 24 51 25 53 25 52 25 53 26 55 26 54 26 55 27 57 27 56 27 57 28 59 28 58 28 59 29 61 29 60 29 37 30 21 30 53 30 63 31 1 31 0 31 61 32 63 32 62 32 30 33 46 33 62 33 0 0 1 0 2 0 2 34 3 34 4 34 4 35 5 35 6 35 6 36 7 36 8 36 8 37 9 37 10 37 10 38 11 38 12 38 12 39 13 39 14 39 14 40 15 40 16 40 16 8 17 8 18 8 18 41 19 41 20 41 20 10 21 10 22 10 22 42 23 42 24 42 24 12 25 12 26 12 26 13 27 13 28 13 28 43 29 43 30 43 30 15 31 15 32 15 32 44 33 44 34 44 34 45 35 45 36 45 36 46 37 46 38 46 38 47 39 47 40 47 40 48 41 48 42 48 42 49 43 49 44 49 44 22 45 22 46 22 46 23 47 23 48 23 48 50 49 50 50 50 50 25 51 25 52 25 52 26 53 26 54 26 54 27 55 27 56 27 56 51 57 51 58 51 58 52 59 52 60 52 5 53 3 53 1 53 1 54 63 54 5 54 61 54 59 54 53 54 57 54 55 54 53 54 53 55 51 55 49 55 49 54 47 54 53 54 45 56 43 56 41 56 41 54 39 54 45 54 37 57 35 57 33 57 33 54 31 54 37 54 29 58 27 58 21 58 25 54 23 54 21 54 21 54 19 54 17 54 17 59 15 59 21 59 13 60 11 60 9 60 9 54 7 54 13 54 5 54 63 54 61 54 59 54 57 54 53 54 53 61 47 61 45 61 45 62 39 62 37 62 37 54 31 54 29 54 27 63 25 63 21 63 21 64 15 64 13 64 13 54 7 54 5 54 5 54 61 54 53 54 53 54 45 54 37 54 37 54 29 54 21 54 21 65 13 65 5 65 5 54 53 54 21 54 62 31 63 31 0 31 60 32 61 32 62 32 62 66 0 66 2 66 2 67 4 67 6 67 6 68 8 68 10 68 10 68 12 68 6 68 14 68 16 68 18 68 18 69 20 69 14 69 22 68 24 68 26 68 26 67 28 67 30 67 30 70 32 70 34 70 34 68 36 68 38 68 38 71 40 71 42 71 42 68 44 68 46 68 46 72 48 72 50 72 50 68 52 68 46 68 54 73 56 73 58 73 58 68 60 68 54 68 62 74 2 74 6 74 6 75 12 75 14 75 14 76 20 76 22 76 22 77 26 77 30 77 30 68 34 68 38 68 38 78 42 78 46 78 46 68 52 68 54 68 54 79 60 79 62 79 62 80 6 80 14 80 14 68 22 68 62 68 30 68 38 68 46 68 46 81 54 81 62 81 62 68 22 68 30 68</p>
</polylist>
</mesh>
</geometry>
<geometry id="Cylinder_006-mesh" name="Cylinder.006">
<mesh>
<source id="Cylinder_006-mesh-positions">
<float_array id="Cylinder_006-mesh-positions-array" count="192">0 0.2 -0.1 0 0.2 0.1 0.03901803 0.196157 -0.1 0.03901803 0.196157 0.1 0.07653665 0.1847759 -0.1 0.07653665 0.1847759 0.1 0.111114 0.1662939 -0.1 0.111114 0.1662939 0.1 0.1414213 0.1414213 -0.1 0.1414213 0.1414213 0.1 0.1662939 0.111114 -0.1 0.1662939 0.111114 0.1 0.1847759 0.07653665 -0.1 0.1847759 0.07653665 0.1 0.196157 0.03901803 -0.1 0.196157 0.03901803 0.1 0.2 0 -0.1 0.2 0 0.1 0.196157 -0.03901803 -0.1 0.196157 -0.03901803 0.1 0.1847759 -0.07653665 -0.1 0.1847759 -0.07653665 0.1 0.1662939 -0.111114 -0.1 0.1662939 -0.111114 0.1 0.1414213 -0.1414213 -0.1 0.1414213 -0.1414213 0.1 0.111114 -0.1662939 -0.1 0.111114 -0.1662939 0.1 0.07653665 -0.1847759 -0.1 0.07653665 -0.1847759 0.1 0.03901797 -0.196157 -0.1 0.03901797 -0.196157 0.1 0 -0.2 -0.1 0 -0.2 0.1 -0.03901809 -0.196157 -0.1 -0.03901809 -0.196157 0.1 -0.07653677 -0.1847758 -0.1 -0.07653677 -0.1847758 0.1 -0.1111141 -0.1662938 -0.1 -0.1111141 -0.1662938 0.1 -0.1414214 -0.1414213 -0.1 -0.1414214 -0.1414213 0.1 -0.166294 -0.1111139 -0.1 -0.166294 -0.1111139 0.1 -0.184776 -0.07653653 -0.1 -0.184776 -0.07653653 0.1 -0.196157 -0.03901785 -0.1 -0.196157 -0.03901785 0.1 -0.2 1.9312e-7 -0.1 -0.2 1.9312e-7 0.1 -0.196157 0.03901827 -0.1 -0.196157 0.03901827 0.1 -0.1847758 0.07653689 -0.1 -0.1847758 0.07653689 0.1 -0.1662937 0.1111142 -0.1 -0.1662937 0.1111142 0.1 -0.1414211 0.1414215 -0.1 -0.1414211 0.1414215 0.1 -0.1111138 0.166294 -0.1 -0.1111138 0.166294 0.1 -0.07653641 0.184776 -0.1 -0.07653641 0.184776 0.1 -0.03901773 0.1961571 -0.1 -0.03901773 0.1961571 0.1</float_array>
<technique_common>
<accessor source="#Cylinder_006-mesh-positions-array" count="64" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Cylinder_006-mesh-normals">
<float_array id="Cylinder_006-mesh-normals-array" count="246">0.09801727 0.9951847 0 0.2902846 0.9569404 0 0.4713969 0.8819212 0 0.634393 0.7730107 0 0.7730104 0.6343935 0 0.8819213 0.4713968 0 0.9569402 0.2902852 0 0.9951847 0.09801787 0 0.9951848 -0.09801691 0 0.9569405 -0.2902844 0 0.8819214 -0.4713965 0 0.7730105 -0.6343932 0 0.6343932 -0.7730105 0 0.4713969 -0.8819213 0 0.2902842 -0.9569405 0 0.09801685 -0.9951848 0 -0.09801763 -0.9951848 0 -0.290285 -0.9569403 0 -0.4713971 -0.8819211 0 -0.6343935 -0.7730103 0 -0.773011 -0.6343926 0 -0.8819215 -0.4713964 0 -0.9569408 -0.2902833 0 -0.9951848 -0.09801685 0 -0.9951847 0.09801781 0 -0.95694 0.2902861 0 -0.8819209 0.4713975 0 -0.7730097 0.6343942 0 -0.634392 0.7730115 0 -0.4713956 0.881922 0 0 0 1 -0.0980165 0.9951848 0 -0.290283 0.9569409 0 0 0 -1 0.2902846 0.9569404 0 0.4713968 0.8819214 0 0.6343932 0.7730105 0 0.7730105 0.6343932 0 0.8819217 0.4713961 0 0.9569405 0.2902844 0 0.9951848 0.09801691 0 0.9569402 -0.2902852 0 0.7730104 -0.6343935 0 0.2902842 -0.9569405 0 -0.09801763 -0.9951848 0 -0.290285 -0.9569403 0 -0.4713972 -0.8819211 0 -0.6343939 -0.77301 0 -0.7730109 -0.634393 0 -0.8819219 -0.4713957 0 -0.9951847 0.09801876 0 -0.6343925 0.7730111 0 -0.4713953 0.8819221 0 1.94098e-7 0 1 0 0 1 1.55278e-6 0 1 1.55278e-6 0 1 5.82293e-7 0 1 -1.06916e-6 0 1 2.09724e-6 0 1 1.55278e-6 0 1 -2.67291e-7 0 1 -8.01872e-7 0 1 1.04862e-6 0 1 -5.34582e-7 0 1 0 0 1 1.94101e-7 0 -1 7.76388e-7 0 -1 0 0 -1 2.09724e-6 0 -1 1.94096e-7 0 -1 1.55278e-6 0 -1 1.55278e-6 0 -1 -1.55278e-6 0 -1 -1.99821e-7 0 -1 5.34582e-7 0 -1 5.34582e-7 0 -1 1.9982e-7 0 -1 -7.99279e-7 0 -1 2.6729e-7 0 -1 0 0 -1 -2.24841e-7 0 -1</float_array>
<technique_common>
<accessor source="#Cylinder_006-mesh-normals-array" count="82" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Cylinder_006-mesh-vertices">
<input semantic="POSITION" source="#Cylinder_006-mesh-positions"/>
</vertices>
<polylist material="black-material" count="124">
<input semantic="VERTEX" source="#Cylinder_006-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#Cylinder_006-mesh-normals" offset="1"/>
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
<p>1 0 3 0 2 0 3 1 5 1 4 1 5 2 7 2 6 2 7 3 9 3 8 3 9 4 11 4 10 4 11 5 13 5 12 5 13 6 15 6 14 6 15 7 17 7 16 7 17 8 19 8 18 8 19 9 21 9 20 9 21 10 23 10 22 10 23 11 25 11 24 11 25 12 27 12 26 12 27 13 29 13 28 13 29 14 31 14 30 14 31 15 33 15 32 15 33 16 35 16 34 16 35 17 37 17 36 17 37 18 39 18 38 18 39 19 41 19 40 19 41 20 43 20 42 20 43 21 45 21 44 21 45 22 47 22 46 22 47 23 49 23 48 23 49 24 51 24 50 24 51 25 53 25 52 25 53 26 55 26 54 26 55 27 57 27 56 27 57 28 59 28 58 28 59 29 61 29 60 29 37 30 21 30 53 30 63 31 1 31 0 31 61 32 63 32 62 32 30 33 46 33 62 33 0 0 1 0 2 0 2 34 3 34 4 34 4 35 5 35 6 35 6 36 7 36 8 36 8 37 9 37 10 37 10 38 11 38 12 38 12 39 13 39 14 39 14 40 15 40 16 40 16 8 17 8 18 8 18 41 19 41 20 41 20 10 21 10 22 10 22 42 23 42 24 42 24 12 25 12 26 12 26 13 27 13 28 13 28 43 29 43 30 43 30 15 31 15 32 15 32 44 33 44 34 44 34 45 35 45 36 45 36 46 37 46 38 46 38 47 39 47 40 47 40 48 41 48 42 48 42 49 43 49 44 49 44 22 45 22 46 22 46 23 47 23 48 23 48 50 49 50 50 50 50 25 51 25 52 25 52 26 53 26 54 26 54 27 55 27 56 27 56 51 57 51 58 51 58 52 59 52 60 52 5 53 3 53 1 53 1 54 63 54 5 54 61 54 59 54 53 54 57 54 55 54 53 54 53 55 51 55 49 55 49 54 47 54 53 54 45 56 43 56 41 56 41 54 39 54 45 54 37 57 35 57 33 57 33 54 31 54 37 54 29 58 27 58 21 58 25 54 23 54 21 54 21 54 19 54 17 54 17 59 15 59 21 59 13 60 11 60 9 60 9 54 7 54 13 54 5 54 63 54 61 54 59 54 57 54 53 54 53 61 47 61 45 61 45 62 39 62 37 62 37 54 31 54 29 54 27 63 25 63 21 63 21 64 15 64 13 64 13 54 7 54 5 54 5 54 61 54 53 54 53 54 45 54 37 54 37 54 29 54 21 54 21 65 13 65 5 65 5 54 53 54 21 54 62 31 63 31 0 31 60 32 61 32 62 32 62 66 0 66 2 66 2 67 4 67 6 67 6 68 8 68 10 68 10 68 12 68 6 68 14 68 16 68 18 68 18 69 20 69 14 69 22 68 24 68 26 68 26 67 28 67 30 67 30 70 32 70 34 70 34 68 36 68 38 68 38 71 40 71 42 71 42 68 44 68 46 68 46 72 48 72 50 72 50 68 52 68 46 68 54 73 56 73 58 73 58 68 60 68 54 68 62 74 2 74 6 74 6 75 12 75 14 75 14 76 20 76 22 76 22 77 26 77 30 77 30 68 34 68 38 68 38 78 42 78 46 78 46 68 52 68 54 68 54 79 60 79 62 79 62 80 6 80 14 80 14 68 22 68 62 68 30 68 38 68 46 68 46 81 54 81 62 81 62 68 22 68 30 68</p>
</polylist>
</mesh>
</geometry>
</library_geometries>
<library_controllers/>
<library_visual_scenes>
<visual_scene id="Scene" name="Scene">
<node id="Camera" name="Camera" type="NODE">
<matrix sid="transform">0.6858805 -0.3173701 0.6548619 7.481132 0.7276338 0.3124686 -0.6106656 -6.50764 -0.01081678 0.8953432 0.4452454 5.343665 0 0 0 1</matrix>
<instance_camera url="#Camera-camera"/>
</node>
<node id="Lamp" name="Lamp" type="NODE">
<matrix sid="transform">-0.2908646 -0.7711008 0.5663932 4.076245 0.9551712 -0.1998834 0.2183912 1.005454 -0.05518906 0.6045247 0.7946723 5.903862 0 0 0 1</matrix>
<instance_light url="#Lamp-light"/>
</node>
<node id="scale" name="scale" type="NODE">
<matrix sid="transform">0.1 0 0 0 0 0.1 0 0 0 0 0.1 0 0 0 0 1</matrix>
<node id="Cylinder" name="Cylinder" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 -0.475 0 0 0 1</matrix>
<instance_geometry url="#Cylinder_005-mesh" name="Cylinder">
<bind_material>
<technique_common>
<instance_material symbol="silver-material" target="#silver-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
<node id="Cylinder_001" name="Cylinder_001" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 0.9419355 0.15 0 0 0 1</matrix>
<instance_geometry url="#Cylinder_001-mesh" name="Cylinder_001">
<bind_material>
<technique_common>
<instance_material symbol="silver-material" target="#silver-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
<node id="Cylinder_002" name="Cylinder_002" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 -0.775 0 0 0 1</matrix>
<instance_geometry url="#Cylinder_002-mesh" name="Cylinder_002">
<bind_material>
<technique_common>
<instance_material symbol="black-material" target="#black-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
<node id="Cylinder_005" name="Cylinder_005" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0.625 0 0 0 1</matrix>
<instance_geometry url="#Cylinder_007-mesh" name="Cylinder_005">
<bind_material>
<technique_common>
<instance_material symbol="silver-material" target="#silver-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
<node id="Cylinder_004" name="Cylinder_004" type="NODE">
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0.825 0 0 0 1</matrix>
<instance_geometry url="#Cylinder_006-mesh" name="Cylinder_004">
<bind_material>
<technique_common>
<instance_material symbol="black-material" target="#black-material"/>
</technique_common>
</bind_material>
</instance_geometry>
</node>
</node>
</visual_scene>
</library_visual_scenes>
<scene>
<instance_visual_scene url="#Scene"/>
</scene>
</COLLADA>
+8
View File
@@ -0,0 +1,8 @@
MIT License
Copyright (c) 2019, Fan Fei
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the ""Software""), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,104 @@
[
{
"id": 0,
"name": "flapper_sc_nominal",
"urdf_file": "flappy/urdf/fwmav/flapper_sc_nominal.urdf",
"frequency": 34,
"wing_length": 0.07,
"mean_chord": 0.021212121212121,
"r33": 0.205833311654341,
"r22": 0.284203623407408,
"r11": 0.450820740740741,
"r00": 0.999407407407407,
"z_cp2": 0.246352600140835,
"z_cp1": 0.415846717980795,
"z_cp0": 1.028078968449933,
"z_rd": 1.174547978303502,
"left_shoulder_width": 13.95E-3,
"right_shoulder_width": 13.95E-3,
"stroke_plane_offset": 18.9913E-3,
"left_spring_stiffness": 0.013384289,
"right_spring_stiffness": 0.013384289,
"left_stroke_lower": -1.63,
"left_stroke_upper": 1.63,
"left_rotate_lower": -0.7854,
"left_rotate_upper": 0.7854,
"right_stroke_lower": -1.63,
"right_stroke_upper": 1.63,
"right_rotate_lower": -0.7854,
"right_rotate_upper": 0.7854,
"left_stroke_mid": 0.0,
"right_stroke_mid": 0.0,
"left_motor_properties":
{
"resistance": 12.4,
"torque_constant": 1.75e-3,
"gear_ratio": 10,
"mechanical_efficiency": 0.9,
"friction_coefficient": 2e-5,
"damping_coefficient": 9.74e-9,
"inertia": 7.03e-10
},
"right_motor_properties":
{
"resistance": 12.4,
"torque_constant": 1.75e-3,
"gear_ratio": 10,
"mechanical_efficiency": 0.9,
"friction_coefficient": 2e-5,
"damping_coefficient": 9.74e-9,
"inertia": 7.03e-10
}
},
{
"id": 1,
"name": "flapper_sc_trim",
"urdf_file": "flappy/urdf/fwmav/flapper_sc_nominal.urdf",
"frequency": 34,
"wing_length": 0.07,
"mean_chord": 0.021212121212121,
"r33": 0.205833311654341,
"r22": 0.284203623407408,
"r11": 0.450820740740741,
"r00": 0.999407407407407,
"z_cp2": 0.246352600140835,
"z_cp1": 0.415846717980795,
"z_cp0": 1.028078968449933,
"z_rd": 1.174547978303502,
"left_shoulder_width": 13.95E-3,
"right_shoulder_width": 13.95E-3,
"stroke_plane_offset": 18.9913E-3,
"left_spring_stiffness": 0.0133599752,
"right_spring_stiffness": 0.0133000000,
"left_stroke_lower": -1.63,
"left_stroke_upper": 1.63,
"left_rotate_lower": -0.844856704,
"left_rotate_upper": 0.765164977,
"right_stroke_lower": -1.63,
"right_stroke_upper": 1.63,
"right_rotate_lower": -0.854799666,
"right_rotate_upper": 0.814000120,
"left_stroke_mid": 0.0403463879,
"right_stroke_mid": 0.0319281979,
"left_motor_properties":
{
"resistance": 14.780065776,
"torque_constant": 1.75e-3,
"gear_ratio": 10,
"mechanical_efficiency": 0.9,
"friction_coefficient": 2e-5,
"damping_coefficient": 9.74e-9,
"inertia": 7.03e-10
},
"right_motor_properties":
{
"resistance": 13.763265084,
"torque_constant": 1.75e-3,
"gear_ratio": 10,
"mechanical_efficiency": 0.9,
"friction_coefficient": 2e-5,
"damping_coefficient": 9.74e-9,
"inertia": 7.03e-10
}
}
]
@@ -0,0 +1,9 @@
{
"f_sim" : 1e4,
"f_driver" : 1e3,
"f_sensor" : 500,
"f_control" : 500,
"f_imu" : 1000,
"f_vicon" : 200,
"f_visual" : 24
}
+186
View File
@@ -0,0 +1,186 @@
<?xml version="1.0" ?>
<!--********************** FWMAV Simulation *************************
# Version 0.3
# Fan Fei Feb 2019
# Direct motor driven flapping wing MAV simulation
********************************************************************-->
<robot name="flapper_sc">
<material name = "flapper/black">
<color rgba = "0 0 0 1"/>
</material>
<material name = "flapper/blue">
<color rgba = "0.0 0.0 1.0 1"/>
</material>
<material name = "flapper/red">
<color rgba = "1.0 0.0 0.0 1"/>
</material>
<!--link name = "world"/>
<joint name = "torso_to_world" type="floating">
<parent link = "world"/>
<child link = "torso"/>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
</joint-->
<link name = "torso">
<inertial>
<origin xyz = "0.1797E-3 0.0008E-3 -1.3998E-3" rpy = "0 0 0"/>
<mass value = "10.9067E-3"/>
<inertia
ixx = "4238.1285E-9"
iyy = "3970.1646E-9"
izz = "2440.9505E-9"
ixy = "-76.8896E-9"
iyz = "0.3011E-9"
ixz = "16.5500E-9"/>
</inertial>
<visual>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/torso_small_base.STL"/>
</geometry>
<material name = "flapper/black"/>
</visual>
<collision>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/torso_small_base.STL"/>
</geometry>
</collision>
</link>
<link name = "left_wing">
<inertial>
<origin xyz = "0.0024E-3 37.3242E-3 -9.8917E-3" rpy = "0 0 0"/>
<mass value = "0.0626E-3"/>
<inertia
ixx = "21.4402E-9"
iyy = "2.2204E-9"
izz = "19.2209E-9"
ixy = "-0.0000E-9"
iyz = "0.1968E-9"
ixz = "-0.0001E-9"/>
</inertial>
<visual>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/Wing_Camber_70mm_C35mm_no_trailing_L.STL"/>
</geometry>
<material name = "flapper/blue"/>
</visual>
<collision>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/Wing_Camber_70mm_C35mm_no_trailing_L.STL"/>
</geometry>
</collision>
</link>
<link name = "right_wing">
<inertial>
<origin xyz = "-0.0024E-3 -37.3242E-3 -9.8917E-3" rpy = "0 0 0"/>
<mass value = "0.0626E-3"/>
<inertia
ixx = "21.4402E-9"
iyy = "2.2204E-9"
izz = "19.2209E-9"
ixy = "-0.0000E-9"
iyz = "-0.1968E-9"
ixz = "0.0001E-9"/>
</inertial>
<visual>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/right_wing.STL"/>
</geometry>
<material name = "flapper/red"/>
</visual>
<collision>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/right_wing.STL"/>
</geometry>
</collision>
</link>
<link name="left_leading_edge">
<inertial>
<origin xyz = "-0.2837E-3 3.3023E-3 -6.3984E-3" rpy = "0 0 0"/>
<mass value = "0.7081E-3"/>
<inertia
ixx = "132.8411E-9"
iyy = "47.7258E-9"
izz = "90.6904E-9"
ixy = "-0.0416E-9"
iyz = "12.5149E-9"
ixz = "-0.4990E-9"/>
</inertial>
<visual>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/left_LE.STL"/>
</geometry>
<material name = "flapper/blue"/>
</visual>
</link>
<link name="right_leading_edge">
<inertial>
<origin xyz = "-0.2837E-3 -3.3023E-3 -6.3984E-3" rpy = "0 0 0"/>
<mass value = "0.7081E-3"/>
<inertia
ixx = "132.8411E-9"
iyy = "47.7258E-9"
izz = "90.6904E-9"
ixy = "0.0416E-9"
iyz = "-12.5149E-9"
ixz = "-0.4990E-9"/>
</inertial>
<visual>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<geometry>
<mesh filename = "meshes/right_LE.STL"/>
</geometry>
<material name = "flapper/red"/>
</visual>
</link>
<joint name = "left_stroke" type = "revolute">
<parent link = "torso"/>
<child link = "left_leading_edge"/>
<origin xyz = "0 13.95E-3 18.9913E-3" rpy = "0 0 0"/>
<axis xyz = "0 0 1"/>
<dynamics friction = "1E-9" damping = "8E-9"/>
<limit lower = "-1.63" upper = "1.63" effort = "0.02" velocity = "400"/>
</joint>
<joint name = "left_rotate" type = "revolute">
<parent link = "left_leading_edge"/>
<child link = "left_wing"/>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<axis xyz = "0 1 0"/>
<dynamics friction = "1E-8" damping = "1E-9"/>
<limit lower = "-0.7854" upper = "0.7854" effort = "0.02" velocity = "2000"/>
</joint>
<joint name = "right_stroke" type = "revolute">
<parent link = "torso"/>
<child link = "right_leading_edge"/>
<origin xyz = "0 -13.95E-3 18.9913E-3" rpy = "0 0 0"/>
<axis xyz = "0 0 -1"/>
<dynamics friction = "1E-9" damping = "8E-9"/>
<limit lower = "-1.63" upper = "1.63" effort = "0.02" velocity = "400"/>
</joint>
<joint name = "right_rotate" type = "revolute">
<parent link = "right_leading_edge"/>
<child link = "right_wing"/>
<origin xyz = "0 0 0" rpy = "0 0 0"/>
<axis xyz = "0 1 0"/>
<dynamics friction = "1E-8" damping = "1E-9"/>
<limit lower = "-0.7854" upper = "0.7854" effort = "0.02" velocity = "2000"/>
</joint>
</robot>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+176
View File
@@ -0,0 +1,176 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+303
View File
@@ -0,0 +1,303 @@
<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- | This document was autogenerated by xacro from techpod.xacro | -->
<!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
<!-- =================================================================================== -->
<!--
Copyright 2016 Pavel Vechersky, ASL, ETH Zurich, Switzerland
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<robot name="techpod" xmlns:xacro="http://ros.org/wiki/xacro">
<material name="black">
<color rgba="0.2 0.2 0.2 1"/>
</material>
<material name="white">
<color rgba="0.9 0.9 0.9 1"/>
</material>
<material name="dark_gray">
<color rgba="0.3 0.3 0.3 1"/>
</material>
<material name="gray">
<color rgba="0.5 0.5 0.5 1"/>
</material>
<material name="light_gray">
<color rgba="0.7 0.7 0.7 1"/>
</material>
<material name="pure_red">
<color rgba="1.0 0.0 0.0 1"/>
</material>
<material name="red">
<color rgba="0.8 0.1 0.1 1"/>
</material>
<material name="pure_green">
<color rgba="0.0 1.0 0.0 1"/>
</material>
<material name="pure_blue">
<color rgba="0.0 0.0 1.0 1"/>
</material>
<material name="blue">
<color rgba="0.0 0.2 0.8 1"/>
</material>
<!-- [kg] -->
<link name="ns/base_link">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="1e-6"/>
<inertia ixx="1e-12" ixy="0.0" ixz="0.0" iyy="1e-12" iyz="0.0" izz="1e-12"/>
</inertial>
</link> <!-- in pybullet, the inertia need to be specified even for dummy links, otherwise it will put an identity inertia and a mass of 1 by default -->
<joint name="ns/base_joint" type="fixed">
<origin rpy="0 0 0" xyz="0 0 0"/>
<parent link="ns/base_link"/>
<child link="ns/base_link_inertia"/>
</joint>
<link name="ns/base_link_inertia">
<inertial>
<mass value="2.05"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<inertia ixx="0.16632" ixy="0.0" ixz="0.0755" iyy="0.3899" iyz="0.0" izz="0.5243"/>
</inertial>
<visual>
<material name="white"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_body.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="1.088 2.591 0.303"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/base_link">
<material>Gazebo/Gray</material>
</gazebo>
<!-- Attach fw_dynamics to the base_link -->
<gazebo>
<plugin filename="librotors_gazebo_fw_dynamics_plugin.so" name="fw_dynamics_plugin">
<robotNamespace>ns</robotNamespace>
<linkName>ns/base_link</linkName>
<aeroParamsYAML>aero_params</aeroParamsYAML>
<vehicleParamsYAML>vehicle_params</vehicleParamsYAML>
<isInputJoystick>true</isInputJoystick>
</plugin>
</gazebo>
<joint name="ns/aileron_left_joint" type="revolute">
<origin rpy="0 0 0" xyz="0.1095 0.99245 0.115"/>
<axis xyz="0 -1 0"/>
<parent link="ns/base_link"/>
<child link="ns/aileron_left"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/aileron_left">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.0010164162601" ixy="0.0" ixz="0.0" iyy="2.481665674e-05" iyz="0.0" izz="0.0010384162513"/>
</inertial>
<visual>
<material name="red"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_aileron_left.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_aileron_left.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/aileron_left">
<material>Gazebo/Red</material>
</gazebo>
<joint name="ns/aileron_right_joint" type="revolute">
<origin rpy="0 0 0" xyz="0.1095 -0.99245 0.115"/>
<axis xyz="0 1 0"/>
<parent link="ns/base_link"/>
<child link="ns/aileron_right"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/aileron_right">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.0010164162601" ixy="0.0" ixz="0.0" iyy="2.481665674e-05" iyz="0.0" izz="0.0010384162513"/>
</inertial>
<visual>
<material name="blue"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_aileron_right.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_aileron_right.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/aileron_right">
<material>Gazebo/Red</material>
</gazebo>
<joint name="ns/elevator_joint" type="revolute">
<origin rpy="0 0 0" xyz="-0.555 0 0.26"/>
<axis xyz="0 -1 0"/>
<parent link="ns/base_link"/>
<child link="ns/elevator"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/elevator">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.00174160763669" ixy="0.0" ixz="0.0" iyy="2.287499085e-05" iyz="0.0" izz="0.0017620826285"/>
</inertial>
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_elevator.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_elevator.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/elevator">
<material>Gazebo/Blue</material>
</gazebo>
<joint name="ns/flap_left_joint" type="revolute">
<origin rpy="0 0 0" xyz="0.101 0.382 0.1185"/>
<axis xyz="0 -1 0"/>
<parent link="ns/base_link"/>
<child link="ns/flap_left"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/flap_left">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.00175780763021" ixy="0.0" ixz="0.0" iyy="5.026664656e-05" iyz="0.0" izz="0.00180380761181"/>
</inertial>
<visual>
<material name="red"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_flap_left.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_flap_left.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/flap_left">
<material>Gazebo/Yellow</material>
</gazebo>
<joint name="ns/flap_right_joint" type="revolute">
<origin rpy="0 0 0" xyz="0.101 -0.382 0.1185"/>
<axis xyz="0 1 0"/>
<parent link="ns/base_link"/>
<child link="ns/flap_right"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/flap_right">
<inertial>
<origin rpy="0 0 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.00175780763021" ixy="0.0" ixz="0.0" iyy="5.026664656e-05" iyz="0.0" izz="0.00180380761181"/>
</inertial>
<visual>
<material name="blue"/>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_flap_right.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_flap_right.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/flap_right">
<material>Gazebo/Yellow</material>
</gazebo>
<joint name="ns/rudder_joint" type="revolute">
<origin rpy="0 -0.25 0" xyz="-0.428 0 0"/>
<axis xyz="0 0 1"/>
<parent link="ns/base_link"/>
<child link="ns/rudder"/>
<limit effort="0" lower="0" upper="0" velocity="0"/>
</joint>
<link name="ns/rudder">
<inertial>
<origin rpy="0 0.25 0" xyz="0 0 0"/>
<mass value="0.1"/>
<inertia ixx="0.00048670813865" ixy="0.0" ixz="0.0" iyy="0.00062268308426" iyz="0.0" izz="0.00014137494345"/>
</inertial>
<visual>
<origin rpy="0 0.25 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_rudder.dae" scale="1 1 1"/>
</geometry>
</visual>
<collision>
<origin rpy="0 0.25 0" xyz="0 0 0"/>
<geometry>
<mesh filename="meshes/techpod/techpod_rudder.dae" scale="1 1 1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/rudder">
<material>Gazebo/Orange</material>
</gazebo>
<joint name="ns/propeller_{suffix}_joint" type="continuous">
<origin rpy="0 -1.57079632679 0" xyz="-0.025 0 0.15"/>
<axis xyz="0 0 1"/>
<parent link="ns/base_link"/>
<child link="ns/propeller_"/>
</joint>
<link name="ns/propeller_">
<inertial>
<mass value="0.1"/>
<inertia ixx="0.0025007489997" ixy="0.0" ixz="0.0" iyy="0.0025007489997" iyz="0.0" izz="0.005"/>
</inertial>
<visual>
<geometry>
<mesh filename="meshes/propeller_cw.dae" scale="0.1 0.1 0.1"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="meshes/propeller_cw.dae" scale="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<gazebo reference="ns/propeller_">
<material>Gazebo/Gray</material>
</gazebo>
</robot>
+3 -2
View File
@@ -1389,7 +1389,8 @@ class Bullet(Simulator):
position = self.get_link_state(body_id, link_id)[0]
else: # local frame
position = (0., 0., 0.)
self.sim.applyExternalForce(body_id, link_id, force, position, frame)
self.sim.applyExternalForce(objectUniqueId=body_id, linkIndex=link_id, forceObj=force, posObj=position,
flags=frame)
def apply_external_torque(self, body_id, link_id=-1, torque=(0., 0., 0.), frame=Simulator.LINK_FRAME):
"""
@@ -1405,7 +1406,7 @@ class Bullet(Simulator):
frame (int): Specify the coordinate system of force/position: either `pybullet.WORLD_FRAME` (=2) for
Cartesian world coordinates or `pybullet.LINK_FRAME` (=1) for local link coordinates.
"""
self.sim.applyExternalTorque(body_id, link_id, torque)
self.sim.applyExternalTorque(objectUniqueId=body_id, linkIndex=link_id, torqueObj=torque, flags=frame)
###################
# transformations #