simple_model.py
Go to the documentation of this file.
1 #
2 # Copyright (c) 2016-2023 CNRS INRIA
3 #
4 
5 import pinocchio as pin
6 from math import pi
7 from pinocchio.utils import np, rotate
8 
9 DENSITY = 1
10 
11 
12 def placement(x=0, y=0, z=0, rx=0, ry=0, rz=0):
13  m = pin.SE3.Identity()
14  m.translation = np.array([x, y, z])
15  m.rotation *= rotate("x", rx)
16  m.rotation *= rotate("y", ry)
17  m.rotation *= rotate("z", rz)
18  return m
19 
20 
21 def color(body_number=1):
22  return [int(i) for i in "%03d" % int(bin(body_number % 8)[2:])] + [1]
23 
24 
25 class ModelWrapper(object):
26  def __init__(self, name=None, display=False):
27  self.visuals = [
28  ("universe", pin.SE3.Identity(), pin.SE3.Identity().translation)
29  ]
30  self.name = self.__class__.__name__ if name is None else name
31  self.model = pin.Model()
32  self.display = display
33  self.add_joints()
34 
35  def add_joints(self):
36  for joint in self.joints:
37  self.add_joint(**joint)
38 
39  def add_joint(
40  self,
41  joint_name,
42  joint_model=None,
43  joint_placement=None,
44  lever=None,
45  shape="box",
46  dimensions=1,
47  mass=None,
48  body_color=1,
49  parent=0,
50  ):
51  if joint_model is None:
52  joint_model = pin.JointModelFreeFlyer()
53  elif isinstance(joint_model, str):
54  joint_model = pin.__dict__["JointModel" + joint_model]()
55  if joint_placement is None:
56  joint_placement = pin.SE3.Identity()
57  elif isinstance(joint_placement, dict):
58  joint_placement = placement(**joint_placement)
59  if lever is None:
60  lever = pin.SE3.Identity()
61  elif isinstance(lever, dict):
62  lever = placement(**lever)
63  joint_name, body_name = (
64  "world/%s_%s_%s" % (self.name, joint_name, i) for i in ("joint", "body")
65  )
66  body_inertia = pin.Inertia.Random()
67  if shape == "box":
68  w, h, d = (
69  (float(i) for i in dimensions)
70  if isinstance(dimensions, tuple)
71  else [float(dimensions)] * 3
72  )
73  if mass is None:
74  mass = w * h * d * DENSITY
75  body_inertia = pin.Inertia.FromBox(mass, w, h, d)
76  if self.display:
77  self.display.viewer.gui.addBox(body_name, w, h, d, color(body_color))
78  elif shape == "cylinder":
79  r, h = dimensions
80  if mass is None:
81  mass = pi * r**2 * h * DENSITY
82  body_inertia = pin.Inertia.FromCylinder(mass, r, h)
83  if self.display:
84  self.display.viewer.gui.addCylinder(body_name, r, h, color(body_color))
85  elif shape == "sphere":
86  w, h, d = (
87  (float(i) for i in dimensions)
88  if isinstance(dimensions, tuple)
89  else [float(dimensions)] * 3
90  )
91  if mass is None:
92  mass = 4.0 / 3.0 * pi * w * h * d * DENSITY
93  body_inertia = pin.Inertia.FromEllipsoid(mass, w, h, d)
94  if self.display:
95  self.display.viewer.gui.addSphere(
96  body_name, dimensions, color(body_color)
97  )
98  body_inertia.lever = lever.translation
99  joint_id = self.model.addJoint(parent, joint_model, joint_placement, joint_name)
100  self.model.appendBodyToJoint(joint_id, body_inertia, pin.SE3.Identity())
101  self.model.addJointFrame(joint_id, -1)
102  self.model.addBodyFrame(body_name, joint_id, pin.SE3.Identity(), -1)
103  self.visuals.append((body_name, joint_placement, lever))
104  self.data = self.model.createData()
105  if self.display:
106  self.place()
107 
108  def place(self):
109  for i, (name, placement, lever) in enumerate(self.visuals):
110  if i == 0:
111  continue
112  self.display.place(name, self.data.oMi[i] * placement * lever)
113  self.display.viewer.gui.refresh()
114 
115 
116 class RobotDisplay(object):
117  def __init__(self, window_name="pinocchio"):
118  from gepetto import corbaserver
119 
120  self.viewer = corbaserver.Client()
121  try:
122  window_id = self.viewer.gui.getWindowID(window_name)
123  except:
124  window_id = self.viewer.gui.createWindow(window_name)
125  self.viewer.gui.createSceneWithFloor("world")
126  self.viewer.gui.addSceneToWindow("world", window_id)
127  self.viewer.gui.setLightingMode("world", "OFF")
128  self.viewer.gui.setVisibility("world/floor", "OFF")
129  self.viewer.gui.refresh()
130 
131  def place(self, obj_name, m):
132  self.viewer.gui.applyConfiguration(obj_name, pin.se3ToXYZQUATtuple(m))
133 
134 
136  joints = [
137  {
138  "joint_name": "pelvis",
139  "dimensions": (0.1, 0.2, 0.1),
140  "mass": 0.5,
141  },
142  {
143  "joint_name": "left_leg",
144  "joint_model": "RY",
145  "joint_placement": {"y": -0.15},
146  "lever": {"z": -0.45},
147  "shape": "cylinder",
148  "dimensions": (0.1, 0.9),
149  "mass": 20,
150  "body_color": 2,
151  "parent": 1,
152  },
153  {
154  "joint_name": "right_leg",
155  "joint_model": "RY",
156  "joint_placement": {"y": 0.15},
157  "lever": {"z": -0.45},
158  "shape": "cylinder",
159  "dimensions": (0.1, 0.9),
160  "mass": 20,
161  "body_color": 3,
162  "parent": 1,
163  },
164  ]
165 
166 
167 walker = SimplestWalker()
168 model = walker.model
simple_model.RobotDisplay.place
def place(self, obj_name, m)
Definition: simple_model.py:131
simple_model.RobotDisplay.__init__
def __init__(self, window_name="pinocchio")
Definition: simple_model.py:117
simple_model.RobotDisplay
Definition: simple_model.py:116
simple_model.ModelWrapper
Definition: simple_model.py:25
simple_model.ModelWrapper.name
name
Definition: simple_model.py:30
pinocchio.utils
Definition: bindings/python/pinocchio/utils.py:1
simple_model.placement
def placement(x=0, y=0, z=0, rx=0, ry=0, rz=0)
Definition: simple_model.py:12
pinocchio::createData
ConstraintDataTpl< Scalar, Options, ConstraintCollectionTpl > createData(const ConstraintModelTpl< Scalar, Options, ConstraintCollectionTpl > &cmodel)
Definition: constraint-model-visitor.hpp:248
simple_model.ModelWrapper.data
data
Definition: simple_model.py:93
simple_model.ModelWrapper.add_joint
def add_joint(self, joint_name, joint_model=None, joint_placement=None, lever=None, shape="box", dimensions=1, mass=None, body_color=1, parent=0)
Definition: simple_model.py:39
simple_model.ModelWrapper.place
def place(self)
Definition: simple_model.py:108
simple_model.RobotDisplay.viewer
viewer
Definition: simple_model.py:120
simple_model.ModelWrapper.display
display
Definition: simple_model.py:32
simple_model.ModelWrapper.add_joints
def add_joints(self)
Definition: simple_model.py:35
simple_model.SimplestWalker
Definition: simple_model.py:135
simple_model.ModelWrapper.__init__
def __init__(self, name=None, display=False)
Definition: simple_model.py:26
boost::fusion::append
result_of::push_front< V const, T >::type append(T const &t, V const &v)
Append the element T at the front of boost fusion vector V.
Definition: fusion.hpp:32
simple_model.color
def color(body_number=1)
Definition: simple_model.py:21
simple_model.ModelWrapper.model
model
Definition: simple_model.py:31
simple_model.ModelWrapper.visuals
visuals
Definition: simple_model.py:27


pinocchio
Author(s):
autogenerated on Tue Jun 25 2024 02:42:40