pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
frame.hpp
1//
2// Copyright (c) 2016-2022 CNRS INRIA
3//
4
5#ifndef __pinocchio_python_multibody_frame_hpp__
6#define __pinocchio_python_multibody_frame_hpp__
7
8#include "pinocchio/multibody/fwd.hpp"
9#include "pinocchio/multibody/frame.hpp"
10
11#include "pinocchio/bindings/python/utils/deprecation.hpp"
12#include "pinocchio/bindings/python/utils/cast.hpp"
13#include "pinocchio/bindings/python/utils/copyable.hpp"
14#include "pinocchio/bindings/python/utils/printable.hpp"
15#include "pinocchio/bindings/python/utils/registration.hpp"
16
17namespace pinocchio
18{
19 namespace python
20 {
21 namespace bp = boost::python;
22
23 template<typename Frame>
24 struct FramePythonVisitor : public boost::python::def_visitor<FramePythonVisitor<Frame>>
25 {
26 typedef typename Frame::SE3 SE3;
27 typedef typename Frame::Inertia Inertia;
28
29 template<class PyClass>
30 void visit(PyClass & cl) const
31 {
32 cl.def(bp::init<>(bp::arg("self"), "Default constructor"))
33 .def(bp::init<const Frame &>(bp::args("self", "other"), "Copy constructor"))
34 .def(bp::init<
35 const std::string &, const JointIndex, const SE3 &, FrameType,
36 bp::optional<const Inertia &>>(
37 (bp::arg("name"), bp::arg("parent_joint"), bp::arg("placement"), bp::arg("type"),
38 bp::arg("inertia")),
39 "Initialize from a given name, type, parent frame index and placement wrt parent joint "
40 "and an spatial inertia object."))
41 .def(bp::init<
42 const std::string &, const JointIndex, const FrameIndex, const SE3 &, FrameType,
43 bp::optional<const Inertia &>>(
44 (bp::arg("name"), bp::arg("parent_joint"), bp::args("parent_frame"),
45 bp::arg("placement"), bp::arg("type"), bp::arg("inertia")),
46 "Initialize from a given name, type, parent joint index, parent frame index and "
47 "placement wrt parent joint and an spatial inertia object."))
48 .def(bp::init<const Frame &>((bp::arg("self"), bp::arg("clone")), "Copy constructor"))
49
50 .def_readwrite("name", &Frame::name, "name of the frame")
51 .def_readwrite("parentJoint", &Frame::parentJoint, "Index of the parent joint")
52 .def_readwrite("parentFrame", &Frame::parentFrame, "Index of the parent frame")
53 .add_property(
54 "parent",
55 bp::make_function(
56 +[](const Frame & self) { return self.parentJoint; },
57 deprecated_member<>("Deprecated member. Use Frame.parentJoint instead.")),
58 bp::make_function(
59 +[](Frame & self, const JointIndex index) { self.parentJoint = index; },
60 deprecated_member<>("Deprecated member. Use Frame.parentJoint instead.")),
61 "See parentJoint property.")
62 .add_property(
63 "previousFrame",
64 bp::make_function(
65 +[](const Frame & self) { return self.parentFrame; },
66 deprecated_member<>("Deprecated member. Use Frame.parentFrame instead.")),
67 bp::make_function(
68 +[](Frame & self, const FrameIndex index) { self.parentFrame = index; },
69 deprecated_member<>("Deprecated member. Use Frame.parentFrame instead.")),
70 "See parentFrame property.")
71 .def_readwrite(
72 "placement", &Frame::placement, "placement in the parent joint local frame")
73 .def_readwrite("type", &Frame::type, "type of the frame")
74 .def_readwrite("inertia", &Frame::inertia, "Inertia information attached to the frame.")
75
76#ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS
77 .def(bp::self == bp::self)
78 .def(bp::self != bp::self)
79#endif
80 ;
81 }
82
83 static void expose()
84 {
85 if (!register_symbolic_link_to_registered_type<FrameType>())
86 {
87 bp::enum_<FrameType>("FrameType")
88 .value("OP_FRAME", OP_FRAME)
89 .value("JOINT", JOINT)
90 .value("FIXED_JOINT", FIXED_JOINT)
91 .value("BODY", BODY)
92 .value("SENSOR", SENSOR)
93 .export_values();
94 }
95
96 bp::class_<Frame>(
97 "Frame",
98 "A Plucker coordinate frame related to a parent joint inside a kinematic tree.\n",
99 bp::no_init)
100 .def(FramePythonVisitor())
101 .def(CastVisitor<Frame>())
102 .def(ExposeConstructorByCastVisitor<Frame, ::pinocchio::Frame>())
103 .def(CopyableVisitor<Frame>())
104 .def(PrintableVisitor<Frame>())
105 .def_pickle(Pickle());
106 }
107
108 private:
109 struct Pickle : bp::pickle_suite
110 {
111 static bp::tuple getinitargs(const Frame &)
112 {
113 return bp::make_tuple();
114 }
115
116 static bp::tuple getstate(const Frame & f)
117 {
118 return bp::make_tuple(
119 f.name, f.parentJoint, f.parentFrame, f.placement, (int)f.type, f.inertia);
120 }
121
122 static void setstate(Frame & f, bp::tuple tup)
123 {
124 f.name = bp::extract<std::string>(tup[0]);
125 f.parentJoint = bp::extract<JointIndex>(tup[1]);
126 f.parentFrame = bp::extract<JointIndex>(tup[2]);
127 f.placement = bp::extract<SE3 &>(tup[3]);
128 f.type = (FrameType)(int)bp::extract<int>(tup[4]);
129 if (bp::len(tup) > 5)
130 f.inertia = bp::extract<Inertia &>(tup[5]);
131 }
132
133 static bool getstate_manages_dict()
134 {
135 return true;
136 }
137 };
138 };
139
140 } // namespace python
141} // namespace pinocchio
142
143#endif // ifndef __pinocchio_python_multibody_frame_hpp__
Main pinocchio namespace.
Definition treeview.dox:11
FrameType
Enum on the possible types of frames.
Definition frame.hpp:32
@ BODY
body frame: attached to the collision, inertial or visual properties of a link
Definition frame.hpp:36
@ SENSOR
sensor frame: defined in a sensor element
Definition frame.hpp:38
@ OP_FRAME
operational frame: user-defined frames that are defined at runtime
Definition frame.hpp:33
@ JOINT
joint frame: attached to the child body of a joint (a.k.a. child frame)
Definition frame.hpp:34
@ FIXED_JOINT
fixed joint frame: joint frame but for a fixed joint
Definition frame.hpp:35