mirror of
https://github.com/wassname/pyrobolearn.git
synced 2026-09-09 11:31:38 +08:00
add ecaa9, techpod, flappy, blackbird
This commit is contained in:
@@ -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.
|
||||
"""
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
|
||||
Executable
+159
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Executable
+255
@@ -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)
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
+1185
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
|
After Width: | Height: | Size: 3.5 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 3.8 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 7.7 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
+407
File diff suppressed because one or more lines are too long
+1849
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
+198
@@ -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>
|
||||
+293
File diff suppressed because one or more lines are too long
+403
File diff suppressed because one or more lines are too long
+406
@@ -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>
|
||||
@@ -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
|
||||
}
|
||||
@@ -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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Executable
+176
@@ -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
@@ -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>
|
||||
|
||||
@@ -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 #
|
||||
|
||||
Reference in New Issue
Block a user