diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/AgentInterface_8cpp.html b/AgentInterface_8cpp.html new file mode 100644 index 00000000..764b02cf --- /dev/null +++ b/AgentInterface_8cpp.html @@ -0,0 +1,141 @@ + + + + + + + +vulp: vulp/spine/AgentInterface.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
AgentInterface.cpp File Reference
+
+
+
#include "vulp/spine/AgentInterface.h"
+#include <spdlog/spdlog.h>
+#include <unistd.h>
+
+Include dependency graph for AgentInterface.cpp:
+
+
+ + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+ + + + +

+Functions

void vulp.spine::allocate_file (int file_descriptor, int bytes)
 Allocate file with some error handling. More...
 
+
+
+ + + + diff --git a/AgentInterface_8cpp.js b/AgentInterface_8cpp.js new file mode 100644 index 00000000..df4e437e --- /dev/null +++ b/AgentInterface_8cpp.js @@ -0,0 +1,4 @@ +var AgentInterface_8cpp = +[ + [ "allocate_file", "AgentInterface_8cpp.html#a8f9f5a5899f507ebe75f4a033e9c1a8f", null ] +]; \ No newline at end of file diff --git a/AgentInterface_8cpp__incl.map b/AgentInterface_8cpp__incl.map new file mode 100644 index 00000000..5d94104a --- /dev/null +++ b/AgentInterface_8cpp__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/AgentInterface_8cpp__incl.md5 b/AgentInterface_8cpp__incl.md5 new file mode 100644 index 00000000..ade8b39b --- /dev/null +++ b/AgentInterface_8cpp__incl.md5 @@ -0,0 +1 @@ +06aee269639c8d6a7e3fab1548d628a9 \ No newline at end of file diff --git a/AgentInterface_8cpp__incl.png b/AgentInterface_8cpp__incl.png new file mode 100644 index 00000000..d2a94a9d Binary files /dev/null and b/AgentInterface_8cpp__incl.png differ diff --git a/AgentInterface_8cpp_source.html b/AgentInterface_8cpp_source.html new file mode 100644 index 00000000..337aa01d --- /dev/null +++ b/AgentInterface_8cpp_source.html @@ -0,0 +1,206 @@ + + + + + + + +vulp: vulp/spine/AgentInterface.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
AgentInterface.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 #include <spdlog/spdlog.h>
+
7 #include <unistd.h>
+
8 
+
9 namespace vulp::spine {
+
10 
+
16 void allocate_file(int file_descriptor, int bytes) {
+
17  struct ::stat file_stats;
+
18 
+
19  if (::ftruncate(file_descriptor, bytes) < 0) {
+
20  throw std::runtime_error("Error truncating file, errno is " +
+
21  std::to_string(errno));
+
22  }
+
23 
+
24  ::fstat(file_descriptor, &file_stats);
+
25  if (file_stats.st_size < bytes) {
+
26  throw std::runtime_error(
+
27  "Error allocating " + std::to_string(bytes) +
+
28  " bytes in shared memory. Errno is : " + std::to_string(errno));
+
29  }
+
30 }
+
31 
+
32 AgentInterface::AgentInterface(const std::string& name, size_t size)
+
33  : name_(name), size_(size) {
+
34  // Allocate shared memory
+
35  // About umask: see https://stackoverflow.com/a/11909753
+
36  mode_t existing_umask = ::umask(0);
+
37  int file_descriptor =
+
38  ::shm_open(name.c_str(), O_RDWR | O_CREAT | O_EXCL, 0666);
+
39  ::umask(existing_umask);
+
40  if (file_descriptor < 0) {
+
41  if (errno == EINVAL) {
+
42  spdlog::error("Cannot open shared memory \"{}\": file name is invalid.",
+
43  name);
+
44  } else if (errno == EEXIST) {
+
45  spdlog::error(
+
46  "Cannot open shared memory \"{}\": file already exists. Is a spine "
+
47  "already running?",
+
48  name);
+
49  spdlog::info(
+
50  "If not other spine is running but a previous spine did not exit "
+
51  "properly, you can run ``sudo rm /dev/shm{}`` to clean this error.",
+
52  name);
+
53  } else {
+
54  spdlog::error("Cannot open shared memory file: errno is {}", errno);
+
55  }
+
56  throw std::runtime_error("Error opening file");
+
57  }
+
58  allocate_file(file_descriptor, size);
+
59 
+
60  // Map shared memory
+
61  mmap_ = ::mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED,
+
62  file_descriptor, 0);
+
63  if (mmap_ == MAP_FAILED) {
+
64  throw std::runtime_error("Error mapping file");
+
65  }
+
66  if (::close(file_descriptor) < 0) {
+
67  throw std::runtime_error("Error closing file descriptor");
+
68  }
+
69 
+
70  // Initialize internal pointers
+
71  mmap_request_ = static_cast<uint32_t*>(mmap_);
+
72  mmap_size_ = static_cast<uint32_t*>(mmap_request_ + 1);
+
73  mmap_data_ = reinterpret_cast<char*>(mmap_size_ + 1);
+
74 }
+
75 
+ +
77  if (::munmap(mmap_, size_) < 0) {
+
78  spdlog::error("Failed to unmap memory; errno is {}", errno);
+
79  }
+
80  if (::shm_unlink(name_.c_str()) < 0) {
+
81  spdlog::error("Failed to unlink shared memory; errno is {}", errno);
+
82  }
+
83 }
+
84 
+ +
86  *mmap_request_ = static_cast<uint32_t>(request);
+
87 }
+
88 
+
89 void AgentInterface::write(char* data, size_t size) {
+
90  if (size_ <= size + 2 * sizeof(uint32_t)) {
+
91  spdlog::error(
+
92  "Trying to write {} bytes to agent interface buffer of size {} bytes",
+
93  size, size_);
+
94  throw std::runtime_error("Agent interface buffer overflow");
+
95  }
+
96  *mmap_size_ = size;
+
97  std::memcpy(mmap_data_, data, size);
+
98 }
+
99 
+
100 } // namespace vulp::spine
+ +
void set_request(Request request)
Set current request in shared memory.
+
void write(char *data, size_t size)
Write data to the data buffer in shared memory.
+
uint32_t size() const
Get size of current data buffer.
+
~AgentInterface()
Unmap memory and unlink shared memory object.
+
AgentInterface(const std::string &name, size_t size)
Open interface to the agent at a given shared-memory file.
+
const char * data() const
Get pointer to data buffer.
+
Request request() const
Get current request from shared memory.
+
Flag set by the agent to request an operation from the spine.
Definition: request.py:10
+
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
void allocate_file(int file_descriptor, int bytes)
Allocate file with some error handling.
+
+
+ + + + diff --git a/AgentInterface_8h.html b/AgentInterface_8h.html new file mode 100644 index 00000000..d44cda76 --- /dev/null +++ b/AgentInterface_8h.html @@ -0,0 +1,156 @@ + + + + + + + +vulp: vulp/spine/AgentInterface.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
AgentInterface.h File Reference
+
+
+
#include <fcntl.h>
+#include <spdlog/spdlog.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <cstring>
+#include <string>
+#include "vulp/spine/Request.h"
+
+Include dependency graph for AgentInterface.h:
+
+
+ + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp.spine::AgentInterface
 Memory map to shared memory. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+
+
+ + + + diff --git a/AgentInterface_8h__dep__incl.map b/AgentInterface_8h__dep__incl.map new file mode 100644 index 00000000..d1e22547 --- /dev/null +++ b/AgentInterface_8h__dep__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/AgentInterface_8h__dep__incl.md5 b/AgentInterface_8h__dep__incl.md5 new file mode 100644 index 00000000..7c58c9e5 --- /dev/null +++ b/AgentInterface_8h__dep__incl.md5 @@ -0,0 +1 @@ +b835aabb69cc0ae974807ac11ed148d6 \ No newline at end of file diff --git a/AgentInterface_8h__dep__incl.png b/AgentInterface_8h__dep__incl.png new file mode 100644 index 00000000..ffa18cbb Binary files /dev/null and b/AgentInterface_8h__dep__incl.png differ diff --git a/AgentInterface_8h__incl.map b/AgentInterface_8h__incl.map new file mode 100644 index 00000000..8a3901d4 --- /dev/null +++ b/AgentInterface_8h__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/AgentInterface_8h__incl.md5 b/AgentInterface_8h__incl.md5 new file mode 100644 index 00000000..a708cbc8 --- /dev/null +++ b/AgentInterface_8h__incl.md5 @@ -0,0 +1 @@ +2d2c6361f7c71e0c97434aeef663a93a \ No newline at end of file diff --git a/AgentInterface_8h__incl.png b/AgentInterface_8h__incl.png new file mode 100644 index 00000000..02837221 Binary files /dev/null and b/AgentInterface_8h__incl.png differ diff --git a/AgentInterface_8h_source.html b/AgentInterface_8h_source.html new file mode 100644 index 00000000..e20daba0 --- /dev/null +++ b/AgentInterface_8h_source.html @@ -0,0 +1,159 @@ + + + + + + + +vulp: vulp/spine/AgentInterface.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
AgentInterface.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <fcntl.h>
+
7 #include <spdlog/spdlog.h>
+
8 #include <sys/mman.h>
+
9 #include <sys/stat.h>
+
10 
+
11 #include <cstring>
+
12 #include <string>
+
13 
+
14 #include "vulp/spine/Request.h"
+
15 
+
25 namespace vulp::spine {
+
26 
+ +
33  public:
+
41  AgentInterface(const std::string& name, size_t size);
+
42 
+ +
45 
+ +
51 
+
57  void write(char* data, size_t size);
+
58 
+
60  Request request() const { return static_cast<Request>(*mmap_request_); }
+
61 
+
63  uint32_t size() const { return *mmap_size_; }
+
64 
+
66  const char* data() const { return mmap_data_; }
+
67 
+
68  private:
+
70  std::string name_;
+
71 
+
73  size_t size_;
+
74 
+
76  void* mmap_;
+
77 
+
79  uint32_t* mmap_request_;
+
80 
+
82  uint32_t* mmap_size_;
+
83 
+
85  char* mmap_data_;
+
86 };
+
87 
+
88 } // namespace vulp::spine
+ +
Memory map to shared memory.
+
void set_request(Request request)
Set current request in shared memory.
+
void write(char *data, size_t size)
Write data to the data buffer in shared memory.
+
uint32_t size() const
Get size of current data buffer.
+
~AgentInterface()
Unmap memory and unlink shared memory object.
+
AgentInterface(const std::string &name, size_t size)
Open interface to the agent at a given shared-memory file.
+
const char * data() const
Get pointer to data buffer.
+
Request request() const
Get current request from shared memory.
+
Flag set by the agent to request an operation from the spine.
Definition: request.py:10
+
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
+
+ + + + diff --git a/BulletContactData_8h.html b/BulletContactData_8h.html new file mode 100644 index 00000000..38926ea7 --- /dev/null +++ b/BulletContactData_8h.html @@ -0,0 +1,140 @@ + + + + + + + +vulp: vulp/actuation/BulletContactData.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
BulletContactData.h File Reference
+
+
+
#include <string>
+
+Include dependency graph for BulletContactData.h:
+
+
+ + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  vulp::actuation::BulletContactData
 Contact information for a single link. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/BulletContactData_8h__dep__incl.map b/BulletContactData_8h__dep__incl.map new file mode 100644 index 00000000..82b27d9d --- /dev/null +++ b/BulletContactData_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/BulletContactData_8h__dep__incl.md5 b/BulletContactData_8h__dep__incl.md5 new file mode 100644 index 00000000..39641815 --- /dev/null +++ b/BulletContactData_8h__dep__incl.md5 @@ -0,0 +1 @@ +43c736c46fdc5fe6399513166c4fe362 \ No newline at end of file diff --git a/BulletContactData_8h__dep__incl.png b/BulletContactData_8h__dep__incl.png new file mode 100644 index 00000000..6a0949c9 Binary files /dev/null and b/BulletContactData_8h__dep__incl.png differ diff --git a/BulletContactData_8h__incl.map b/BulletContactData_8h__incl.map new file mode 100644 index 00000000..82d52a91 --- /dev/null +++ b/BulletContactData_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/BulletContactData_8h__incl.md5 b/BulletContactData_8h__incl.md5 new file mode 100644 index 00000000..56c1c236 --- /dev/null +++ b/BulletContactData_8h__incl.md5 @@ -0,0 +1 @@ +66fff4a9caa784c90bac0abb07234629 \ No newline at end of file diff --git a/BulletContactData_8h__incl.png b/BulletContactData_8h__incl.png new file mode 100644 index 00000000..10f8ef73 Binary files /dev/null and b/BulletContactData_8h__incl.png differ diff --git a/BulletContactData_8h_source.html b/BulletContactData_8h_source.html new file mode 100644 index 00000000..1821b8c5 --- /dev/null +++ b/BulletContactData_8h_source.html @@ -0,0 +1,117 @@ + + + + + + + +vulp: vulp/actuation/BulletContactData.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
BulletContactData.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2024 Inria
+
3 
+
4 #pragma once
+
5 
+
6 #include <string>
+
7 
+
8 namespace vulp::actuation {
+
9 
+ + +
18 };
+
19 
+
20 } // namespace vulp::actuation
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
Contact information for a single link.
+
int num_contact_points
Number of contact points detected on link.
+
+
+ + + + diff --git a/BulletImuData_8h.html b/BulletImuData_8h.html new file mode 100644 index 00000000..12705b7f --- /dev/null +++ b/BulletImuData_8h.html @@ -0,0 +1,146 @@ + + + + + + + +vulp: vulp/actuation/BulletImuData.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
BulletImuData.h File Reference
+
+
+
#include <string>
+#include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+#include "vulp/actuation/ImuData.h"
+
+Include dependency graph for BulletImuData.h:
+
+
+ + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + +

+Classes

struct  vulp::actuation::BulletImuData
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/BulletImuData_8h__dep__incl.map b/BulletImuData_8h__dep__incl.map new file mode 100644 index 00000000..e74bafc0 --- /dev/null +++ b/BulletImuData_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/BulletImuData_8h__dep__incl.md5 b/BulletImuData_8h__dep__incl.md5 new file mode 100644 index 00000000..a15bbca7 --- /dev/null +++ b/BulletImuData_8h__dep__incl.md5 @@ -0,0 +1 @@ +45282166a56cdde2a39c59045744b3d3 \ No newline at end of file diff --git a/BulletImuData_8h__dep__incl.png b/BulletImuData_8h__dep__incl.png new file mode 100644 index 00000000..3c761b8c Binary files /dev/null and b/BulletImuData_8h__dep__incl.png differ diff --git a/BulletImuData_8h__incl.map b/BulletImuData_8h__incl.map new file mode 100644 index 00000000..2ee0e8ac --- /dev/null +++ b/BulletImuData_8h__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/BulletImuData_8h__incl.md5 b/BulletImuData_8h__incl.md5 new file mode 100644 index 00000000..daa1d096 --- /dev/null +++ b/BulletImuData_8h__incl.md5 @@ -0,0 +1 @@ +f4dbb9ae5f3686eb6996f30ecf2ffa98 \ No newline at end of file diff --git a/BulletImuData_8h__incl.png b/BulletImuData_8h__incl.png new file mode 100644 index 00000000..cba65ca7 Binary files /dev/null and b/BulletImuData_8h__incl.png differ diff --git a/BulletImuData_8h_source.html b/BulletImuData_8h_source.html new file mode 100644 index 00000000..29a29fdb --- /dev/null +++ b/BulletImuData_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +vulp: vulp/actuation/BulletImuData.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
BulletImuData.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <string>
+
7 
+
8 #include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+ +
10 
+
11 namespace vulp::actuation {
+
12 
+
13 struct BulletImuData : public ImuData {
+
15  Eigen::Vector3d linear_velocity_imu_in_world = Eigen::Vector3d::Zero();
+
16 };
+
17 
+
18 } // namespace vulp::actuation
+ +
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+ +
Eigen::Vector3d linear_velocity_imu_in_world
Spatial linear velocity in [m] / [s]², used to compute the acceleration.
Definition: BulletImuData.h:15
+
Data filtered from an onboard IMU such as the pi3hat's.
Definition: ImuData.h:12
+
+
+ + + + diff --git a/BulletInterface_8cpp.html b/BulletInterface_8cpp.html new file mode 100644 index 00000000..cfc48e8f --- /dev/null +++ b/BulletInterface_8cpp.html @@ -0,0 +1,159 @@ + + + + + + + +vulp: vulp/actuation/BulletInterface.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
BulletInterface.cpp File Reference
+
+
+
#include "vulp/actuation/BulletInterface.h"
+#include <algorithm>
+#include <memory>
+#include <string>
+#include "tools/cpp/runfiles/runfiles.h"
+#include "vulp/actuation/bullet_utils.h"
+
+Include dependency graph for BulletInterface.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+ + + +

+Functions

std::string vulp::actuation::find_plane_urdf (const std::string argv0)
 
+
+
+ + + + diff --git a/BulletInterface_8cpp.js b/BulletInterface_8cpp.js new file mode 100644 index 00000000..98971b99 --- /dev/null +++ b/BulletInterface_8cpp.js @@ -0,0 +1,4 @@ +var BulletInterface_8cpp = +[ + [ "find_plane_urdf", "BulletInterface_8cpp.html#aabb66d6b3cd81c772937088266af0829", null ] +]; \ No newline at end of file diff --git a/BulletInterface_8cpp__incl.map b/BulletInterface_8cpp__incl.map new file mode 100644 index 00000000..4456d94d --- /dev/null +++ b/BulletInterface_8cpp__incl.map @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletInterface_8cpp__incl.md5 b/BulletInterface_8cpp__incl.md5 new file mode 100644 index 00000000..0d640bff --- /dev/null +++ b/BulletInterface_8cpp__incl.md5 @@ -0,0 +1 @@ +8d003ad61d8c400918ac206120990a97 \ No newline at end of file diff --git a/BulletInterface_8cpp__incl.png b/BulletInterface_8cpp__incl.png new file mode 100644 index 00000000..9ea63be5 Binary files /dev/null and b/BulletInterface_8cpp__incl.png differ diff --git a/BulletInterface_8cpp_source.html b/BulletInterface_8cpp_source.html new file mode 100644 index 00000000..fc300543 --- /dev/null +++ b/BulletInterface_8cpp_source.html @@ -0,0 +1,517 @@ + + + + + + + +vulp: vulp/actuation/BulletInterface.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
BulletInterface.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 #include <algorithm>
+
7 #include <memory>
+
8 #include <string>
+
9 
+
10 #include "tools/cpp/runfiles/runfiles.h"
+ +
12 
+
13 using bazel::tools::cpp::runfiles::Runfiles;
+
14 
+
15 namespace vulp::actuation {
+
16 
+
17 std::string find_plane_urdf(const std::string argv0) {
+
18  std::string error;
+
19  std::unique_ptr<Runfiles> runfiles(Runfiles::Create(argv0, &error));
+
20  if (runfiles == nullptr) {
+
21  throw std::runtime_error(
+
22  "Could not retrieve the package path to plane.urdf: " + error);
+
23  }
+
24  return runfiles->Rlocation("vulp/vulp/actuation/bullet/plane/plane.urdf");
+
25 }
+
26 
+ +
28  const Parameters& params)
+
29  : Interface(layout), params_(params) {
+
30  // Start simulator
+
31  auto flag = (params.gui ? eCONNECT_GUI : eCONNECT_DIRECT);
+
32  bool is_connected = bullet_.connect(flag);
+
33  if (!is_connected) {
+
34  throw std::runtime_error("Could not connect to the Bullet GUI");
+
35  }
+
36 
+
37  // Setup simulation scene
+
38  bullet_.configureDebugVisualizer(COV_ENABLE_GUI, 0);
+
39  bullet_.configureDebugVisualizer(COV_ENABLE_RENDERING, 0);
+
40  bullet_.configureDebugVisualizer(COV_ENABLE_SHADOWS, 0);
+
41  if (params.gravity) {
+
42  bullet_.setGravity(btVector3(0, 0, -9.81));
+
43  }
+
44  bullet_.setRealTimeSimulation(false); // making sure
+
45 
+
46  // Load robot model
+
47  robot_ = bullet_.loadURDF(params.robot_urdf_path);
+
48  imu_link_index_ = get_link_index("imu");
+
49  if (imu_link_index_ < 0) {
+
50  throw std::runtime_error("Robot does not have a link named \"imu\"");
+
51  }
+
52 
+
53  // Read servo layout
+
54  for (const auto& id_joint : servo_joint_map()) {
+
55  const auto& servo_id = id_joint.first;
+
56  const std::string& joint_name = id_joint.second;
+
57  moteus::ServoReply reply;
+
58  reply.id = servo_id;
+
59  reply.result.temperature = 20.0; // ['C], simulation room temperature
+
60  reply.result.voltage = 18.0; // [V], nominal voltage of a RYOBI battery
+
61  joint_index_map_.try_emplace(joint_name, -1);
+
62  servo_reply_.try_emplace(joint_name, reply);
+
63  }
+
64 
+
65  // Map servo layout to Bullet
+
66  b3JointInfo joint_info;
+
67  const int nb_joints = bullet_.getNumJoints(robot_);
+
68  for (int joint_index = 0; joint_index < nb_joints; ++joint_index) {
+
69  bullet_.getJointInfo(robot_, joint_index, &joint_info);
+
70  std::string joint_name = joint_info.m_jointName;
+
71  if (joint_index_map_.find(joint_name) != joint_index_map_.end()) {
+
72  joint_index_map_[joint_name] = joint_index;
+
73 
+ +
75  props.maximum_torque = joint_info.m_jointMaxForce;
+
76  joint_properties_.try_emplace(joint_name, props);
+
77  }
+
78  }
+
79 
+
80  // Load plane URDF
+
81  if (params.floor) {
+
82  if (bullet_.loadURDF(find_plane_urdf(params.argv0)) < 0) {
+
83  throw std::runtime_error("Could not load the plane URDF!");
+
84  }
+
85  } else {
+
86  spdlog::info("Not loading the plane URDF");
+
87  if (params.gravity) {
+
88  spdlog::warn(
+
89  "No ground plane was loaded, but gravity is enabled. The robot will "
+
90  "fall!");
+
91  }
+
92  }
+
93 
+
94  // Load environment URDFs
+
95  for (const auto& urdf_path : params.env_urdf_paths) {
+
96  spdlog::info("Loading environment URDF: ", urdf_path);
+
97  if (bullet_.loadURDF(urdf_path) < 0) {
+
98  throw std::runtime_error("Could not load the environment URDF: " +
+
99  urdf_path);
+
100  }
+
101  }
+
102 
+
103  // Start visualizer and configure simulation
+
104  bullet_.configureDebugVisualizer(COV_ENABLE_RENDERING, 1);
+
105  reset(Dictionary{});
+
106 }
+
107 
+
108 BulletInterface::~BulletInterface() { bullet_.disconnect(); }
+
109 
+
110 void BulletInterface::reset(const Dictionary& config) {
+
111  params_.configure(config);
+
112  bullet_.setTimeStep(params_.dt);
+ + + + + + + +
120 }
+
121 
+ +
123  const Eigen::Vector3d& position_base_in_world,
+
124  const Eigen::Quaterniond& orientation_base_in_world,
+
125  const Eigen::Vector3d& linear_velocity_base_to_world_in_world,
+
126  const Eigen::Vector3d& angular_velocity_base_in_base) {
+
127  bullet_.resetBasePositionAndOrientation(
+
128  robot_, bullet_from_eigen(position_base_in_world),
+
129  bullet_from_eigen(orientation_base_in_world));
+
130 
+
131  const auto& rotation_base_to_world =
+
132  orientation_base_in_world; // transforms are coordinates
+
133  const Eigen::Vector3d angular_velocity_base_in_world =
+
134  rotation_base_to_world * angular_velocity_base_in_base;
+
135  bullet_.resetBaseVelocity(
+ +
137  bullet_from_eigen(angular_velocity_base_in_world));
+
138 }
+
139 
+ +
141  for (const auto& link_name : params_.monitor_contacts) {
+
142  contact_data_.try_emplace(link_name, BulletContactData());
+
143  }
+
144 }
+
145 
+ +
147  const int nb_joints = bullet_.getNumJoints(robot_);
+
148  for (int joint_index = 0; joint_index < nb_joints; ++joint_index) {
+
149  bullet_.resetJointState(robot_, joint_index, 0.0);
+
150  }
+
151 }
+
152 
+ +
154  b3JointInfo joint_info;
+
155  const int nb_joints = bullet_.getNumJoints(robot_);
+
156  for (int joint_index = 0; joint_index < nb_joints; ++joint_index) {
+
157  bullet_.getJointInfo(robot_, joint_index, &joint_info);
+
158  std::string joint_name = joint_info.m_jointName;
+
159  if (joint_index_map_.find(joint_name) != joint_index_map_.end()) {
+
160  const auto friction_it = params_.joint_friction.find(joint_name);
+
161  if (friction_it != params_.joint_friction.end()) {
+
162  joint_properties_[joint_name].friction = friction_it->second;
+
163  } else {
+
164  joint_properties_[joint_name].friction = 0.0;
+
165  }
+
166  }
+
167  }
+
168 }
+
169 
+
170 void BulletInterface::observe(Dictionary& observation) const {
+
171  // Eigen quaternions are serialized as [w, x, y, z]
+
172  // See include/palimpsest/mpack/eigen.h in palimpsest
+
173  observation("imu")("orientation") = imu_data_.orientation_imu_in_ars;
+
174  observation("imu")("angular_velocity") =
+
175  imu_data_.angular_velocity_imu_in_imu;
+
176  observation("imu")("linear_acceleration") =
+ +
178 
+
179  Dictionary& monitor = observation("bullet");
+
180  for (const auto& link_name : params_.monitor_contacts) {
+
181  monitor("contact")(link_name)("num_contact_points") =
+
182  contact_data_.at(link_name).num_contact_points;
+
183  }
+
184 }
+
185 
+ +
187  const moteus::Data& data,
+
188  std::function<void(const moteus::Output&)> callback) {
+
189  assert(data.commands.size() == data.replies.size());
+
190  assert(!std::isnan(params_.dt));
+
191  if (!bullet_.isConnected()) {
+
192  throw std::runtime_error("simulator is not running any more");
+
193  }
+
194 
+
195  read_joint_sensors();
+
196  read_imu_data(imu_data_, bullet_, robot_, imu_link_index_, params_.dt);
+
197  read_contacts();
+
198  send_commands(data);
+
199  bullet_.stepSimulation();
+
200 
+
201  if (params_.follower_camera) {
+
202  translate_camera_to_robot();
+
203  }
+
204 
+
205  moteus::Output output;
+
206  for (size_t i = 0; i < data.replies.size(); ++i) {
+
207  const auto servo_id = data.commands[i].id;
+
208  const std::string& joint_name = servo_layout().joint_name(servo_id);
+
209  data.replies[i].id = servo_id;
+
210  data.replies[i].result = servo_reply_[joint_name].result;
+
211  output.query_result_size = i + 1;
+
212  }
+
213  callback(output);
+
214 }
+
215 
+
216 void BulletInterface::read_contacts() {
+
217  b3ContactInformation contact_info;
+
218  b3RobotSimulatorGetContactPointsArgs contact_args;
+
219  for (const auto& link_name : params_.monitor_contacts) {
+
220  contact_args.m_bodyUniqueIdA = robot_;
+
221  contact_args.m_linkIndexA = get_link_index(link_name);
+
222  bullet_.getContactPoints(contact_args, &contact_info);
+
223  contact_data_[link_name].num_contact_points =
+
224  contact_info.m_numContactPoints;
+
225  }
+
226 }
+
227 
+
228 void BulletInterface::read_joint_sensors() {
+
229  b3JointSensorState sensor_state;
+
230  for (const auto& name_index : joint_index_map_) {
+
231  const auto& joint_name = name_index.first;
+
232  const auto joint_index = name_index.second;
+
233  bullet_.getJointState(robot_, joint_index, &sensor_state);
+
234  auto& result = servo_reply_[joint_name].result;
+
235  result.position = sensor_state.m_jointPosition / (2.0 * M_PI);
+
236  result.velocity = sensor_state.m_jointVelocity / (2.0 * M_PI);
+
237  result.torque = sensor_state.m_jointMotorTorque;
+
238  }
+
239 }
+
240 
+
241 void BulletInterface::send_commands(const moteus::Data& data) {
+
242  b3RobotSimulatorJointMotorArgs motor_args(CONTROL_MODE_VELOCITY);
+
243 
+
244  for (const auto& command : data.commands) {
+
245  const auto servo_id = command.id;
+
246  const std::string& joint_name = servo_layout().joint_name(servo_id);
+
247  const int joint_index = joint_index_map_[joint_name];
+
248 
+
249  const auto previous_mode = servo_reply_[joint_name].result.mode;
+
250  if (previous_mode == moteus::Mode::kStopped &&
+
251  command.mode != moteus::Mode::kStopped) {
+
252  // disable velocity controllers to enable torque control
+
253  motor_args.m_controlMode = CONTROL_MODE_VELOCITY;
+
254  motor_args.m_maxTorqueValue = 0.; // [N m]
+
255  bullet_.setJointMotorControl(robot_, joint_index, motor_args);
+
256  }
+
257  servo_reply_[joint_name].result.mode = command.mode;
+
258 
+
259  if (command.mode == moteus::Mode::kStopped) {
+
260  motor_args.m_controlMode = CONTROL_MODE_VELOCITY;
+
261  motor_args.m_maxTorqueValue = 100.; // [N m]
+
262  motor_args.m_targetVelocity = 0.; // [rad] / [s]
+
263  bullet_.setJointMotorControl(robot_, joint_index, motor_args);
+
264  continue;
+
265  }
+
266 
+
267  if (command.mode != moteus::Mode::kPosition) {
+
268  throw std::runtime_error(
+
269  "Bullet interface does not support command mode " +
+
270  std::to_string(static_cast<unsigned>(command.mode)));
+
271  }
+
272 
+
273  const double target_position = command.position.position * (2.0 * M_PI);
+
274  const double target_velocity = command.position.velocity * (2.0 * M_PI);
+
275  const double feedforward_torque = command.position.feedforward_torque;
+
276  const double kp_scale = command.position.kp_scale;
+
277  const double kd_scale = command.position.kd_scale;
+
278  const double maximum_torque = command.position.maximum_torque;
+
279  const double joint_torque = compute_joint_torque(
+
280  joint_name, feedforward_torque, target_position, target_velocity,
+
281  kp_scale, kd_scale, maximum_torque);
+
282  motor_args.m_controlMode = CONTROL_MODE_TORQUE;
+
283  motor_args.m_maxTorqueValue = joint_torque;
+
284  servo_reply_[joint_name].result.torque = joint_torque;
+
285  bullet_.setJointMotorControl(robot_, joint_index, motor_args);
+
286  }
+
287 }
+
288 
+ +
290  const std::string& joint_name, const double feedforward_torque,
+
291  const double target_position, const double target_velocity,
+
292  const double kp_scale, const double kd_scale, const double maximum_torque) {
+
293  assert(!std::isnan(target_velocity));
+
294  const BulletJointProperties& joint_props = joint_properties_[joint_name];
+
295  const auto& measurements = servo_reply_[joint_name].result;
+
296  const double measured_position = measurements.position * (2.0 * M_PI);
+
297  const double measured_velocity = measurements.velocity * (2.0 * M_PI);
+
298  const double kp = kp_scale * params_.torque_control_kp;
+
299  const double kd = kd_scale * params_.torque_control_kd;
+
300  const double tau_max = std::min(maximum_torque, joint_props.maximum_torque);
+
301  double torque = feedforward_torque;
+
302  torque += kd * (target_velocity - measured_velocity);
+
303  if (!std::isnan(target_position)) {
+
304  torque += kp * (target_position - measured_position);
+
305  }
+
306  constexpr double kMaxStictionVelocity = 1e-3; // rad/s
+
307  if (std::abs(measured_velocity) > kMaxStictionVelocity) {
+
308  torque += joint_props.friction * ((measured_velocity > 0.0) ? -1.0 : +1.0);
+
309  }
+
310  torque = std::max(std::min(torque, tau_max), -tau_max);
+
311  return torque;
+
312 }
+
313 
+
314 Eigen::Matrix4d BulletInterface::transform_base_to_world() const noexcept {
+
315  btVector3 position_base_in_world;
+
316  btQuaternion orientation_base_in_world;
+
317  bullet_.getBasePositionAndOrientation(robot_, position_base_in_world,
+
318  orientation_base_in_world);
+
319  auto quat = eigen_from_bullet(orientation_base_in_world);
+
320  Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
+
321  T.block<3, 3>(0, 0) = quat.normalized().toRotationMatrix();
+
322  T.block<3, 1>(0, 3) = eigen_from_bullet(position_base_in_world);
+
323  return T;
+
324 }
+
325 
+ +
327  const noexcept {
+ +
329  btVector3 _; // anonymous, we only get the linear velocity
+
330  bullet_.getBaseVelocity(robot_, linear_velocity_base_to_world_in_world, _);
+ +
332 }
+
333 
+ +
335  const noexcept {
+
336  btVector3 angular_velocity_base_to_world_in_world;
+
337  btVector3 _; // anonymous, we only get the angular velocity
+
338  bullet_.getBaseVelocity(robot_, _, angular_velocity_base_to_world_in_world);
+
339  Eigen::Matrix4d T = transform_base_to_world();
+
340  Eigen::Matrix3d rotation_base_to_world = T.block<3, 3>(0, 0);
+
341  return rotation_base_to_world.transpose() *
+
342  eigen_from_bullet(angular_velocity_base_to_world_in_world);
+
343 }
+
344 
+
345 void BulletInterface::translate_camera_to_robot() {
+
346  b3OpenGLVisualizerCameraInfo camera_info;
+
347  btVector3 position_base_in_world;
+
348  btQuaternion orientation_base_in_world;
+
349  bullet_.getBasePositionAndOrientation(robot_, position_base_in_world,
+
350  orientation_base_in_world);
+
351  bullet_.getDebugVisualizerCamera(&camera_info);
+
352  bullet_.resetDebugVisualizerCamera(camera_info.m_dist, camera_info.m_pitch,
+
353  camera_info.m_yaw, position_base_in_world);
+
354 }
+
355 
+
356 int BulletInterface::get_link_index(const std::string& link_name) {
+
357  if (link_index_.find(link_name) != link_index_.end()) {
+
358  return link_index_[link_name];
+
359  }
+
360  int link_index = find_link_index(bullet_, robot_, link_name);
+
361  link_index_[link_name] = link_index;
+
362  return link_index;
+
363 }
+
364 
+
365 } // namespace vulp::actuation
+ + +
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Spin a new communication cycle.
+
void reset(const Dictionary &config) override
Reset interface.
+
Eigen::Vector3d angular_velocity_base_in_base() const noexcept
Get the groundtruth floating base angular velocity.
+
void reset_joint_angles()
Reset joint angles to zero.
+
void reset_joint_properties()
Reset joint properties to defaults.
+
~BulletInterface()
Disconnect interface.
+
void reset_contact_data()
Reset contact data.
+
double compute_joint_torque(const std::string &joint_name, const double feedforward_torque, const double target_position, const double target_velocity, const double kp_scale, const double kd_scale, const double maximum_torque)
Reproduce the moteus position controller in Bullet.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
Eigen::Matrix4d transform_base_to_world() const noexcept
Get the groundtruth floating base transform.
+
Eigen::Vector3d linear_velocity_base_to_world_in_world() const noexcept
Get the groundtruth floating base linear velocity.
+
BulletInterface(const ServoLayout &layout, const Parameters &params)
Initialize interface.
+
void reset_base_state(const Eigen::Vector3d &position_base_in_world, const Eigen::Quaterniond &orientation_base_in_world, const Eigen::Vector3d &linear_velocity_base_to_world_in_world, const Eigen::Vector3d &angular_velocity_base_in_base)
Reset the pose and velocity of the floating base in the world frame.
+
Base class for actuation interfaces.
Definition: Interface.h:24
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
const ServoLayout & servo_layout() const noexcept
Get servo layout.
Definition: Interface.h:74
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Map from servo ID to joint name.
Definition: Interface.h:82
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
const std::string & joint_name(const int servo_id) const
Get the name of the joint a servo actuates.
Definition: ServoLayout.h:44
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
void read_imu_data(BulletImuData &imu_data, b3RobotSimulatorClientAPI &bullet, int robot, const int imu_link_index, double dt)
Compute IMU readings from the IMU link state.
Definition: bullet_utils.h:84
+
Eigen::Quaterniond eigen_from_bullet(const btQuaternion &quat)
Convert a Bullet quaternion to an Eigen one.
Definition: bullet_utils.h:41
+
std::string find_plane_urdf(const std::string argv0)
+
btQuaternion bullet_from_eigen(const Eigen::Quaterniond &quat)
Convert an Eigen quaternion to a Bullet one.
Definition: bullet_utils.h:21
+
int find_link_index(b3RobotSimulatorClientAPI &bullet, int robot, const std::string &link_name) noexcept
Find the index of a link.
Definition: bullet_utils.h:63
+
Contact information for a single link.
+ +
std::string robot_urdf_path
Path to the URDF model of the robot.
+
bool gravity
If true, set gravity to -9.81 m/s².
+
double dt
Simulation timestep in [s].
+
bool gui
If true, fire up the graphical user interface.
+
double torque_control_kd
Gain for joint velocity control feedback.
+
bool floor
If true, load a floor plane.
+
std::map< std::string, double > joint_friction
Joint friction parameters.
+
std::vector< std::string > monitor_contacts
Contacts to monitor and report along with observations.
+
Eigen::Vector3d linear_velocity_base_to_world_in_world
Linear velocity of the base in the world frame upon reset.
+
Eigen::Quaterniond orientation_base_in_world
Orientation of the base in the world frame upon reset.
+
Eigen::Vector3d angular_velocity_base_in_base
Body angular velocity of the base upon reset.
+
Eigen::Vector3d position_base_in_world
Position of the base in the world frame upon reset.
+
std::vector< std::string > env_urdf_paths
Paths to environment URDFs to load.
+
std::string argv0
Value of argv[0] used to locate runfiles (e.g.
+
void configure(const Dictionary &config)
Configure from dictionary.
+
double torque_control_kp
Gain for joint position control feedback.
+
bool follower_camera
Translate the camera to follow the robot.
+
Properties for robot joints in the Bullet simulation.
+
double maximum_torque
Maximum torque, in N.m.
+
double friction
Kinetic friction, in N.m.
+
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Definition: ImuData.h:20
+
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Definition: ImuData.h:39
+
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].
Definition: ImuData.h:30
+
+
+ + + + diff --git a/BulletInterface_8h.html b/BulletInterface_8h.html new file mode 100644 index 00000000..cd9d5b9c --- /dev/null +++ b/BulletInterface_8h.html @@ -0,0 +1,174 @@ + + + + + + + +vulp: vulp/actuation/BulletInterface.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
BulletInterface.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <spdlog/spdlog.h>
+#include <limits>
+#include <map>
+#include <string>
+#include <vector>
+#include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+#include "vulp/actuation/BulletContactData.h"
+#include "vulp/actuation/BulletImuData.h"
+#include "vulp/actuation/BulletJointProperties.h"
+#include "vulp/actuation/Interface.h"
+#include "vulp/actuation/moteus/Output.h"
+#include "vulp/actuation/moteus/ServoReply.h"
+
+Include dependency graph for BulletInterface.h:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  vulp::actuation::BulletInterface
 Actuation interface for the Bullet simulator. More...
 
struct  vulp::actuation::BulletInterface::Parameters
 Interface parameters. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/BulletInterface_8h__dep__incl.map b/BulletInterface_8h__dep__incl.map new file mode 100644 index 00000000..7e58272e --- /dev/null +++ b/BulletInterface_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/BulletInterface_8h__dep__incl.md5 b/BulletInterface_8h__dep__incl.md5 new file mode 100644 index 00000000..79f1fd42 --- /dev/null +++ b/BulletInterface_8h__dep__incl.md5 @@ -0,0 +1 @@ +a78db783f00a6adc57aafcd72b869046 \ No newline at end of file diff --git a/BulletInterface_8h__dep__incl.png b/BulletInterface_8h__dep__incl.png new file mode 100644 index 00000000..6ebecea1 Binary files /dev/null and b/BulletInterface_8h__dep__incl.png differ diff --git a/BulletInterface_8h__incl.map b/BulletInterface_8h__incl.map new file mode 100644 index 00000000..1a1b41e4 --- /dev/null +++ b/BulletInterface_8h__incl.map @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletInterface_8h__incl.md5 b/BulletInterface_8h__incl.md5 new file mode 100644 index 00000000..97fd5c05 --- /dev/null +++ b/BulletInterface_8h__incl.md5 @@ -0,0 +1 @@ +2cbe586099373e244df74bc02016f2bd \ No newline at end of file diff --git a/BulletInterface_8h__incl.png b/BulletInterface_8h__incl.png new file mode 100644 index 00000000..ae23144e Binary files /dev/null and b/BulletInterface_8h__incl.png differ diff --git a/BulletInterface_8h_source.html b/BulletInterface_8h_source.html new file mode 100644 index 00000000..471f6b72 --- /dev/null +++ b/BulletInterface_8h_source.html @@ -0,0 +1,341 @@ + + + + + + + +vulp: vulp/actuation/BulletInterface.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
BulletInterface.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 #include <spdlog/spdlog.h>
+
8 
+
9 #include <limits>
+
10 #include <map>
+
11 #include <string>
+
12 #include <vector>
+
13 
+
14 #include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+ + + + +
19 #include "vulp/actuation/moteus/Output.h"
+
20 #include "vulp/actuation/moteus/ServoReply.h"
+
21 
+
22 namespace vulp::actuation {
+
23 
+
25 class BulletInterface : public Interface {
+
26  public:
+
28  struct Parameters {
+
30  Parameters() = default;
+
31 
+
36  explicit Parameters(const Dictionary& config) { configure(config); }
+
37 
+
42  void configure(const Dictionary& config) {
+
43  if (!config.has("bullet")) {
+
44  spdlog::debug("No \"bullet\" runtime configuration");
+
45  return;
+
46  }
+
47  spdlog::info("Applying \"bullet\" runtime configuration...");
+
48 
+
49  const auto& bullet = config("bullet");
+
50  follower_camera = bullet.get<bool>("follower_camera", follower_camera);
+
51  gui = bullet.get<bool>("gui", gui);
+
52 
+
53  monitor_contacts.clear();
+
54  if (bullet.has("monitor")) {
+
55  const auto& monitor = bullet("monitor");
+
56  if (monitor.has("contacts")) {
+
57  for (const auto& body : monitor("contacts").keys()) {
+
58  spdlog::info("Adding body {} to contacts", body);
+
59  monitor_contacts.push_back(body);
+
60  }
+
61  }
+
62  }
+
63 
+
64  joint_friction.clear();
+
65  if (bullet.has("joint_properties")) {
+
66  for (const auto& joint : bullet("joint_properties").keys()) {
+
67  const auto& props = bullet("joint_properties")(joint);
+
68  if (props.has("friction")) {
+
69  joint_friction.try_emplace(joint, props.get<double>("friction"));
+
70  }
+
71  }
+
72  }
+
73 
+
74  if (bullet.has("reset")) {
+
75  const auto& reset = bullet("reset");
+
76  position_base_in_world = reset.get<Eigen::Vector3d>(
+
77  "position_base_in_world", Eigen::Vector3d::Zero());
+
78  orientation_base_in_world = reset.get<Eigen::Quaterniond>(
+
79  "orientation_base_in_world", Eigen::Quaterniond::Identity());
+
80  linear_velocity_base_to_world_in_world = reset.get<Eigen::Vector3d>(
+
81  "linear_velocity_base_to_world_in_world", Eigen::Vector3d::Zero());
+
82  angular_velocity_base_in_base = reset.get<Eigen::Vector3d>(
+
83  "angular_velocity_base_in_base", Eigen::Vector3d::Zero());
+
84  }
+
85 
+
86  if (bullet.has("torque_control")) {
+
87  torque_control_kd = bullet("torque_control")("kd");
+
88  torque_control_kp = bullet("torque_control")("kp");
+
89  }
+
90  }
+
91 
+
105  std::string argv0 = "";
+
106 
+
108  std::vector<std::string> monitor_contacts;
+
109 
+
111  double dt = std::numeric_limits<double>::quiet_NaN();
+
112 
+
114  bool follower_camera = false;
+
115 
+
117  bool gravity = true;
+
118 
+
120  bool floor = true;
+
121 
+
123  bool gui = false;
+
124 
+
135  std::string robot_urdf_path;
+
136 
+
138  std::vector<std::string> env_urdf_paths;
+
139 
+
141  double torque_control_kd = 1.0;
+
142 
+
144  double torque_control_kp = 20.0;
+
145 
+
147  Eigen::Vector3d position_base_in_world = Eigen::Vector3d::Zero();
+
148 
+
150  Eigen::Quaterniond orientation_base_in_world =
+
151  Eigen::Quaterniond::Identity();
+
152 
+ +
155  Eigen::Vector3d::Zero();
+
156 
+
158  Eigen::Vector3d angular_velocity_base_in_base = Eigen::Vector3d::Zero();
+
159 
+
161  std::map<std::string, double> joint_friction;
+
162  };
+
163 
+
171  BulletInterface(const ServoLayout& layout, const Parameters& params);
+
172 
+ +
175 
+
180  void reset(const Dictionary& config) override;
+
181 
+
191  void cycle(const moteus::Data& data,
+
192  std::function<void(const moteus::Output&)> callback) final;
+
193 
+
198  void observe(Dictionary& observation) const override;
+
199 
+
201  Eigen::Matrix4d transform_base_to_world() const noexcept;
+
202 
+
208  Eigen::Vector3d linear_velocity_base_to_world_in_world() const noexcept;
+
209 
+
215  Eigen::Vector3d angular_velocity_base_in_base() const noexcept;
+
216 
+
218  void reset_contact_data();
+
219 
+
221  void reset_joint_angles();
+
222 
+
224  void reset_joint_properties();
+
225 
+
236  void reset_base_state(
+
237  const Eigen::Vector3d& position_base_in_world,
+
238  const Eigen::Quaterniond& orientation_base_in_world,
+
239  const Eigen::Vector3d& linear_velocity_base_to_world_in_world,
+
240  const Eigen::Vector3d& angular_velocity_base_in_base);
+
241 
+
243  const std::map<std::string, BulletJointProperties>& joint_properties() {
+
244  return joint_properties_;
+
245  }
+
246 
+
248  const std::map<std::string, moteus::ServoReply>& servo_reply() {
+
249  return servo_reply_;
+
250  }
+
251 
+
264  double compute_joint_torque(const std::string& joint_name,
+
265  const double feedforward_torque,
+
266  const double target_position,
+
267  const double target_velocity,
+
268  const double kp_scale, const double kd_scale,
+
269  const double maximum_torque);
+
270 
+
271  private:
+
282  int get_link_index(const std::string& link_name);
+
283 
+
285  void read_contacts();
+
286 
+
288  void read_joint_sensors();
+
289 
+
294  void send_commands(const moteus::Data& data);
+
295 
+
297  void translate_camera_to_robot();
+
298 
+
299  private:
+
301  Parameters params_;
+
302 
+
304  std::map<std::string, int> joint_index_map_;
+
305 
+
307  std::map<std::string, moteus::ServoReply> servo_reply_;
+
308 
+
310  b3RobotSimulatorClientAPI bullet_;
+
311 
+
313  int robot_;
+
314 
+
316  std::map<std::string, BulletJointProperties> joint_properties_;
+
317 
+
319  int imu_link_index_;
+
320 
+
322  BulletImuData imu_data_;
+
323 
+
325  Eigen::Vector3d linear_velocity_imu_in_world_;
+
326 
+
328  std::map<std::string, int> link_index_;
+
329 
+
331  std::map<std::string, BulletContactData> contact_data_;
+
332 };
+
333 
+
334 } // namespace vulp::actuation
+ + + + +
Actuation interface for the Bullet simulator.
+
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Spin a new communication cycle.
+
void reset(const Dictionary &config) override
Reset interface.
+
const std::map< std::string, moteus::ServoReply > & servo_reply()
Internal map of servo replies (accessor used for testing)
+
Eigen::Vector3d angular_velocity_base_in_base() const noexcept
Get the groundtruth floating base angular velocity.
+
void reset_joint_angles()
Reset joint angles to zero.
+
void reset_joint_properties()
Reset joint properties to defaults.
+
~BulletInterface()
Disconnect interface.
+
void reset_contact_data()
Reset contact data.
+
double compute_joint_torque(const std::string &joint_name, const double feedforward_torque, const double target_position, const double target_velocity, const double kp_scale, const double kd_scale, const double maximum_torque)
Reproduce the moteus position controller in Bullet.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
Eigen::Matrix4d transform_base_to_world() const noexcept
Get the groundtruth floating base transform.
+
Eigen::Vector3d linear_velocity_base_to_world_in_world() const noexcept
Get the groundtruth floating base linear velocity.
+
BulletInterface(const ServoLayout &layout, const Parameters &params)
Initialize interface.
+
void reset_base_state(const Eigen::Vector3d &position_base_in_world, const Eigen::Quaterniond &orientation_base_in_world, const Eigen::Vector3d &linear_velocity_base_to_world_in_world, const Eigen::Vector3d &angular_velocity_base_in_base)
Reset the pose and velocity of the floating base in the world frame.
+
const std::map< std::string, BulletJointProperties > & joint_properties()
Joint properties (accessor used for testing)
+
Base class for actuation interfaces.
Definition: Interface.h:24
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+ + +
std::string robot_urdf_path
Path to the URDF model of the robot.
+
bool gravity
If true, set gravity to -9.81 m/s².
+
double dt
Simulation timestep in [s].
+
bool gui
If true, fire up the graphical user interface.
+
Parameters(const Dictionary &config)
Initialize from global configuration.
+
double torque_control_kd
Gain for joint velocity control feedback.
+
bool floor
If true, load a floor plane.
+
std::map< std::string, double > joint_friction
Joint friction parameters.
+
std::vector< std::string > monitor_contacts
Contacts to monitor and report along with observations.
+
Eigen::Vector3d linear_velocity_base_to_world_in_world
Linear velocity of the base in the world frame upon reset.
+
Parameters()=default
Keep default constructor.
+
Eigen::Quaterniond orientation_base_in_world
Orientation of the base in the world frame upon reset.
+
Eigen::Vector3d angular_velocity_base_in_base
Body angular velocity of the base upon reset.
+
Eigen::Vector3d position_base_in_world
Position of the base in the world frame upon reset.
+
std::vector< std::string > env_urdf_paths
Paths to environment URDFs to load.
+
std::string argv0
Value of argv[0] used to locate runfiles (e.g.
+
void configure(const Dictionary &config)
Configure from dictionary.
+
double torque_control_kp
Gain for joint position control feedback.
+
bool follower_camera
Translate the camera to follow the robot.
+
Properties for robot joints in the Bullet simulation.
+
+
+ + + + diff --git a/BulletJointProperties_8h.html b/BulletJointProperties_8h.html new file mode 100644 index 00000000..278eb239 --- /dev/null +++ b/BulletJointProperties_8h.html @@ -0,0 +1,142 @@ + + + + + + + +vulp: vulp/actuation/BulletJointProperties.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
BulletJointProperties.h File Reference
+
+
+
#include <string>
+#include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+
+Include dependency graph for BulletJointProperties.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  vulp::actuation::BulletJointProperties
 Properties for robot joints in the Bullet simulation. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/BulletJointProperties_8h__dep__incl.map b/BulletJointProperties_8h__dep__incl.map new file mode 100644 index 00000000..0cfe7f64 --- /dev/null +++ b/BulletJointProperties_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/BulletJointProperties_8h__dep__incl.md5 b/BulletJointProperties_8h__dep__incl.md5 new file mode 100644 index 00000000..b28bc7b7 --- /dev/null +++ b/BulletJointProperties_8h__dep__incl.md5 @@ -0,0 +1 @@ +1df9cf17e6ec3d419d6fac8e8fdb05ff \ No newline at end of file diff --git a/BulletJointProperties_8h__dep__incl.png b/BulletJointProperties_8h__dep__incl.png new file mode 100644 index 00000000..7af74c87 Binary files /dev/null and b/BulletJointProperties_8h__dep__incl.png differ diff --git a/BulletJointProperties_8h__incl.map b/BulletJointProperties_8h__incl.map new file mode 100644 index 00000000..5365fb5c --- /dev/null +++ b/BulletJointProperties_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/BulletJointProperties_8h__incl.md5 b/BulletJointProperties_8h__incl.md5 new file mode 100644 index 00000000..cd9bb188 --- /dev/null +++ b/BulletJointProperties_8h__incl.md5 @@ -0,0 +1 @@ +c3ed9373e72774b1f40f053d01cc095a \ No newline at end of file diff --git a/BulletJointProperties_8h__incl.png b/BulletJointProperties_8h__incl.png new file mode 100644 index 00000000..669b6003 Binary files /dev/null and b/BulletJointProperties_8h__incl.png differ diff --git a/BulletJointProperties_8h_source.html b/BulletJointProperties_8h_source.html new file mode 100644 index 00000000..1a94ac35 --- /dev/null +++ b/BulletJointProperties_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +vulp: vulp/actuation/BulletJointProperties.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
BulletJointProperties.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2023 Inria
+
3 
+
4 #pragma once
+
5 
+
6 #include <string>
+
7 
+
8 #include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+
9 
+
10 namespace vulp::actuation {
+
11 
+ +
15  double friction = 0.0;
+
16 
+
18  double maximum_torque = 0.0;
+
19 };
+
20 
+
21 } // namespace vulp::actuation
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
Properties for robot joints in the Bullet simulation.
+
double maximum_torque
Maximum torque, in N.m.
+
double friction
Kinetic friction, in N.m.
+
+
+ + + + diff --git a/Controller_8h.html b/Controller_8h.html new file mode 100644 index 00000000..5220a5fb --- /dev/null +++ b/Controller_8h.html @@ -0,0 +1,130 @@ + + + + + + + +vulp: vulp/control/Controller.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Controller.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+
+Include dependency graph for Controller.h:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::control::Controller
 Base class for controllers. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::control
 WIP: Process higher-level actions down to joint commands.
 
+
+
+ + + + diff --git a/Controller_8h__incl.map b/Controller_8h__incl.map new file mode 100644 index 00000000..f2bf5005 --- /dev/null +++ b/Controller_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Controller_8h__incl.md5 b/Controller_8h__incl.md5 new file mode 100644 index 00000000..e995d15f --- /dev/null +++ b/Controller_8h__incl.md5 @@ -0,0 +1 @@ +87237c08fda23952c1cb6b709c7e105b \ No newline at end of file diff --git a/Controller_8h__incl.png b/Controller_8h__incl.png new file mode 100644 index 00000000..e3bbcc35 Binary files /dev/null and b/Controller_8h__incl.png differ diff --git a/Controller_8h_source.html b/Controller_8h_source.html new file mode 100644 index 00000000..d6935582 --- /dev/null +++ b/Controller_8h_source.html @@ -0,0 +1,120 @@ + + + + + + + +vulp: vulp/control/Controller.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Controller.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 
+
9 namespace vulp::control {
+
10 
+
11 using palimpsest::Dictionary;
+
12 
+
14 class Controller {
+
15  public:
+
21  virtual void act(Dictionary& action, const Dictionary& observation) = 0;
+
22 };
+
23 
+
24 } // namespace vulp::control
+
Base class for controllers.
Definition: Controller.h:14
+
virtual void act(Dictionary &action, const Dictionary &observation)=0
Decide action.
+
WIP: Process higher-level actions down to joint commands.
Definition: Controller.h:9
+
+
+ + + + diff --git a/CpuTemperature_8cpp.html b/CpuTemperature_8cpp.html new file mode 100644 index 00000000..94b425b0 --- /dev/null +++ b/CpuTemperature_8cpp.html @@ -0,0 +1,128 @@ + + + + + + + +vulp: vulp/observation/sources/CpuTemperature.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
CpuTemperature.cpp File Reference
+
+
+
+Include dependency graph for CpuTemperature.cpp:
+
+
+ + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+
+
+ + + + diff --git a/CpuTemperature_8cpp__incl.map b/CpuTemperature_8cpp__incl.map new file mode 100644 index 00000000..43b4100c --- /dev/null +++ b/CpuTemperature_8cpp__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/CpuTemperature_8cpp__incl.md5 b/CpuTemperature_8cpp__incl.md5 new file mode 100644 index 00000000..c2e1b737 --- /dev/null +++ b/CpuTemperature_8cpp__incl.md5 @@ -0,0 +1 @@ +2cfb7b39a74e725a6a5db32ef59c3147 \ No newline at end of file diff --git a/CpuTemperature_8cpp__incl.png b/CpuTemperature_8cpp__incl.png new file mode 100644 index 00000000..1cb64271 Binary files /dev/null and b/CpuTemperature_8cpp__incl.png differ diff --git a/CpuTemperature_8cpp_source.html b/CpuTemperature_8cpp_source.html new file mode 100644 index 00000000..151b51e8 --- /dev/null +++ b/CpuTemperature_8cpp_source.html @@ -0,0 +1,163 @@ + + + + + + + +vulp: vulp/observation/sources/CpuTemperature.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
CpuTemperature.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+ +
7 
+
8 CpuTemperature::CpuTemperature(const char* temp_path) : has_warned_(false) {
+
9  fd_ = ::open(temp_path, O_RDONLY | O_NONBLOCK);
+
10  ::memset(buffer_, 0, sizeof(buffer_));
+
11 }
+
12 
+ +
14  if (fd_ >= 0) {
+
15  ::close(fd_);
+
16  }
+
17 }
+
18 
+
19 void CpuTemperature::write(Dictionary& observation) {
+
20  if (is_disabled_) {
+
21  return;
+
22  } else if (fd_ < 0) {
+
23  spdlog::warn("CPU temperature observation disabled: file not found");
+
24  is_disabled_ = true;
+
25  return;
+
26  }
+
27 
+
28  ssize_t size = ::pread(fd_, buffer_, kCpuTemperatureBufferSize, 0);
+
29  if (size <= 0) {
+
30  spdlog::warn("Read {} bytes from temperature file", size);
+
31  return;
+
32  }
+
33  const double temperature = std::stol(buffer_) / 1000.;
+
34  check_temperature_warning(temperature);
+
35  auto& output = observation(prefix());
+
36  output = temperature;
+
37 }
+
38 
+
39 void CpuTemperature::check_temperature_warning(
+
40  const double temperature) noexcept {
+
41  constexpr double kConcerningTemperature = 75.0;
+
42  if (temperature > kConcerningTemperature) {
+
43  if (!has_warned_) {
+
44  spdlog::warn("CPU temperature > {} °C, thermal throttling may occur",
+
45  kConcerningTemperature);
+
46  has_warned_ = true;
+
47  }
+
48  }
+
49 
+
50  constexpr double kHysteresisFactor = 0.95;
+
51  if (has_warned_ && temperature < kHysteresisFactor * kConcerningTemperature) {
+
52  has_warned_ = false;
+
53  }
+
54 }
+
55 
+
56 } // namespace vulp::observation::sources
+ +
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
+
CpuTemperature(const char *temp_path="/sys/class/thermal/thermal_zone0/temp")
Open file to query temperature from the kernel.
+
void write(Dictionary &observation) final
Write output to a dictionary.
+ + +
constexpr unsigned kCpuTemperatureBufferSize
Characters required to read the temperature in [mC] from the kernel.
+
+
+ + + + diff --git a/CpuTemperature_8h.html b/CpuTemperature_8h.html new file mode 100644 index 00000000..bfe26035 --- /dev/null +++ b/CpuTemperature_8h.html @@ -0,0 +1,151 @@ + + + + + + + +vulp: vulp/observation/sources/CpuTemperature.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
CpuTemperature.h File Reference
+
+
+
#include <string>
+#include "vulp/observation/Source.h"
+
+Include dependency graph for CpuTemperature.h:
+
+
+ + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::sources::CpuTemperature
 Source for CPU temperature readings. More...
 
+ + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+ + + + +

+Variables

constexpr unsigned vulp::observation::sources::kCpuTemperatureBufferSize = 12
 Characters required to read the temperature in [mC] from the kernel. More...
 
+
+
+ + + + diff --git a/CpuTemperature_8h.js b/CpuTemperature_8h.js new file mode 100644 index 00000000..fb7fe597 --- /dev/null +++ b/CpuTemperature_8h.js @@ -0,0 +1,5 @@ +var CpuTemperature_8h = +[ + [ "CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html", "classvulp_1_1observation_1_1sources_1_1CpuTemperature" ], + [ "kCpuTemperatureBufferSize", "CpuTemperature_8h.html#a010055692ae8692090553ae85b6f66bc", null ] +]; \ No newline at end of file diff --git a/CpuTemperature_8h__dep__incl.map b/CpuTemperature_8h__dep__incl.map new file mode 100644 index 00000000..620e0381 --- /dev/null +++ b/CpuTemperature_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/CpuTemperature_8h__dep__incl.md5 b/CpuTemperature_8h__dep__incl.md5 new file mode 100644 index 00000000..3ce50bd2 --- /dev/null +++ b/CpuTemperature_8h__dep__incl.md5 @@ -0,0 +1 @@ +6bb15aa3d4c4714e9c57048cd1540fb4 \ No newline at end of file diff --git a/CpuTemperature_8h__dep__incl.png b/CpuTemperature_8h__dep__incl.png new file mode 100644 index 00000000..29977afe Binary files /dev/null and b/CpuTemperature_8h__dep__incl.png differ diff --git a/CpuTemperature_8h__incl.map b/CpuTemperature_8h__incl.map new file mode 100644 index 00000000..bd9f230f --- /dev/null +++ b/CpuTemperature_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/CpuTemperature_8h__incl.md5 b/CpuTemperature_8h__incl.md5 new file mode 100644 index 00000000..b130500f --- /dev/null +++ b/CpuTemperature_8h__incl.md5 @@ -0,0 +1 @@ +b628cb89289ba612378388458219bf84 \ No newline at end of file diff --git a/CpuTemperature_8h__incl.png b/CpuTemperature_8h__incl.png new file mode 100644 index 00000000..6e76288c Binary files /dev/null and b/CpuTemperature_8h__incl.png differ diff --git a/CpuTemperature_8h_source.html b/CpuTemperature_8h_source.html new file mode 100644 index 00000000..edf19b4b --- /dev/null +++ b/CpuTemperature_8h_source.html @@ -0,0 +1,150 @@ + + + + + + + +vulp: vulp/observation/sources/CpuTemperature.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
CpuTemperature.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <string>
+
7 
+ +
9 
+ +
11 
+
13 constexpr unsigned kCpuTemperatureBufferSize = 12;
+
14 
+
19 class CpuTemperature : public Source {
+
20  public:
+ +
27  const char* temp_path = "/sys/class/thermal/thermal_zone0/temp");
+
28 
+
30  ~CpuTemperature() override;
+
31 
+
33  inline std::string prefix() const noexcept final { return "cpu_temperature"; }
+
34 
+
39  void write(Dictionary& observation) final;
+
40 
+
42  bool is_disabled() const { return is_disabled_; }
+
43 
+
44  private:
+
51  void check_temperature_warning(const double temperature) noexcept;
+
52 
+
53  private:
+
55  bool is_disabled_ = false;
+
56 
+
58  int fd_;
+
59 
+
61  char buffer_[kCpuTemperatureBufferSize];
+
62 
+
64  bool has_warned_;
+
65 };
+
66 
+
67 } // namespace vulp::observation::sources
+ +
Base class for sources.
Definition: Source.h:20
+
Source for CPU temperature readings.
+
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
+
CpuTemperature(const char *temp_path="/sys/class/thermal/thermal_zone0/temp")
Open file to query temperature from the kernel.
+
void write(Dictionary &observation) final
Write output to a dictionary.
+
bool is_disabled() const
Check if temperature observations are disabled.
+ + +
constexpr unsigned kCpuTemperatureBufferSize
Characters required to read the temperature in [mC] from the kernel.
+
+
+ + + + diff --git a/HistoryObserver_8h.html b/HistoryObserver_8h.html new file mode 100644 index 00000000..e862a8a2 --- /dev/null +++ b/HistoryObserver_8h.html @@ -0,0 +1,142 @@ + + + + + + + +vulp: vulp/observation/HistoryObserver.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
HistoryObserver.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <limits>
+#include <string>
+#include <unordered_map>
+#include <vector>
+#include "vulp/exceptions/TypeError.h"
+#include "vulp/observation/Observer.h"
+
+Include dependency graph for HistoryObserver.h:
+
+
+ + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::HistoryObserver< T >
 Report high-frequency history vectors to lower-frequency agents. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
+
+
+ + + + diff --git a/HistoryObserver_8h__incl.map b/HistoryObserver_8h__incl.map new file mode 100644 index 00000000..4440ea1f --- /dev/null +++ b/HistoryObserver_8h__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/HistoryObserver_8h__incl.md5 b/HistoryObserver_8h__incl.md5 new file mode 100644 index 00000000..202b4e57 --- /dev/null +++ b/HistoryObserver_8h__incl.md5 @@ -0,0 +1 @@ +37beef46dcaa54b72aec0bb7167b23c8 \ No newline at end of file diff --git a/HistoryObserver_8h__incl.png b/HistoryObserver_8h__incl.png new file mode 100644 index 00000000..454ce40c Binary files /dev/null and b/HistoryObserver_8h__incl.png differ diff --git a/HistoryObserver_8h_source.html b/HistoryObserver_8h_source.html new file mode 100644 index 00000000..2435e633 --- /dev/null +++ b/HistoryObserver_8h_source.html @@ -0,0 +1,193 @@ + + + + + + + +vulp: vulp/observation/HistoryObserver.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
HistoryObserver.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2024 Inria
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 
+
8 #include <limits>
+
9 #include <string>
+
10 #include <unordered_map>
+
11 #include <vector>
+
12 
+
13 #include "vulp/exceptions/TypeError.h"
+ +
15 
+
16 namespace vulp::observation {
+
17 
+
18 using palimpsest::Dictionary;
+
19 using vulp::exceptions::TypeError;
+ +
21 
+
27 template <typename T>
+
28 class HistoryObserver : public Observer {
+
29  public:
+
36  HistoryObserver(const std::vector<std::string>& keys, size_t size,
+
37  const T& default_value)
+
38  : keys_(keys), values_(size, default_value) {}
+
39 
+
41  inline std::string prefix() const noexcept final { return "history"; }
+
42 
+
47  void reset(const Dictionary& config) final {}
+
48 
+
53  void read(const Dictionary& observation) final {
+
54  return read_value(observation, 0);
+
55  }
+
56 
+
61  void write(Dictionary& observation) final {
+
62  auto& output = observation(prefix());
+
63  write_values(output, 0);
+
64  }
+
65 
+
66  private:
+
68  std::string concatenate_keys() {
+
69  std::string output;
+
70  for (const auto& key : keys_) {
+
71  output += "/" + key;
+
72  }
+
73  return output;
+
74  }
+
75 
+
81  void read_value(const Dictionary& dict, unsigned key_index) {
+
82  if (key_index < keys_.size()) {
+
83  const std::string& key = keys_.at(key_index);
+
84  return read_value(dict(key), key_index + 1);
+
85  }
+
86  if (!dict.is_value()) {
+
87  throw TypeError(
+
88  __FILE__, __LINE__,
+
89  "Observation at " + concatenate_keys() + " is not a value");
+
90  }
+
91  const T& new_value = dict.as<T>();
+
92  values_.pop_back();
+
93  values_.insert(values_.begin(), new_value);
+
94  }
+
95 
+
101  void write_values(Dictionary& dict, unsigned key_index) {
+
102  if (key_index < keys_.size()) {
+
103  const std::string& key = keys_.at(key_index);
+
104  return write_values(dict(key), key_index + 1);
+
105  }
+
106  if (dict.is_empty()) {
+
107  dict = values_;
+
108  } else {
+
109  dict.as<std::vector<T>>() = values_;
+
110  }
+
111  }
+
112 
+
113  private:
+
115  std::vector<std::string> keys_;
+
116 
+
118  std::vector<T> values_;
+
119 };
+
120 
+
121 } // namespace vulp::observation
+ +
Report high-frequency history vectors to lower-frequency agents.
+
HistoryObserver(const std::vector< std::string > &keys, size_t size, const T &default_value)
Initialize observer.
+
std::string prefix() const noexcept final
Prefix of outputs in the observation dictionary.
+
void reset(const Dictionary &config) final
Reset observer.
+
void read(const Dictionary &observation) final
Read inputs from other observations.
+
void write(Dictionary &observation) final
Write outputs, called if reading was successful.
+
Base class for observers.
Definition: Observer.h:15
+
State observation.
+
+
+ + + + diff --git a/ImuData_8h.html b/ImuData_8h.html new file mode 100644 index 00000000..931554cb --- /dev/null +++ b/ImuData_8h.html @@ -0,0 +1,152 @@ + + + + + + + +vulp: vulp/actuation/ImuData.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ImuData.h File Reference
+
+
+
#include <Eigen/Core>
+#include <Eigen/Geometry>
+
+Include dependency graph for ImuData.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

struct  vulp::actuation::ImuData
 Data filtered from an onboard IMU such as the pi3hat's. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/ImuData_8h__dep__incl.map b/ImuData_8h__dep__incl.map new file mode 100644 index 00000000..d71e0ad9 --- /dev/null +++ b/ImuData_8h__dep__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/ImuData_8h__dep__incl.md5 b/ImuData_8h__dep__incl.md5 new file mode 100644 index 00000000..35eb2000 --- /dev/null +++ b/ImuData_8h__dep__incl.md5 @@ -0,0 +1 @@ +75737ce40fdaef17e9e459d4269d5cec \ No newline at end of file diff --git a/ImuData_8h__dep__incl.png b/ImuData_8h__dep__incl.png new file mode 100644 index 00000000..dd9c62c2 Binary files /dev/null and b/ImuData_8h__dep__incl.png differ diff --git a/ImuData_8h__incl.map b/ImuData_8h__incl.map new file mode 100644 index 00000000..f361da2b --- /dev/null +++ b/ImuData_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/ImuData_8h__incl.md5 b/ImuData_8h__incl.md5 new file mode 100644 index 00000000..e9d674c0 --- /dev/null +++ b/ImuData_8h__incl.md5 @@ -0,0 +1 @@ +13e4ec4d53735b1cf35fa725b03fe8b2 \ No newline at end of file diff --git a/ImuData_8h__incl.png b/ImuData_8h__incl.png new file mode 100644 index 00000000..5d5fa027 Binary files /dev/null and b/ImuData_8h__incl.png differ diff --git a/ImuData_8h_source.html b/ImuData_8h_source.html new file mode 100644 index 00000000..4669f238 --- /dev/null +++ b/ImuData_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/actuation/ImuData.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ImuData.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <Eigen/Core>
+
7 #include <Eigen/Geometry>
+
8 
+
9 namespace vulp::actuation {
+
10 
+
12 struct ImuData {
+
20  Eigen::Quaterniond orientation_imu_in_ars = Eigen::Quaterniond::Identity();
+
21 
+
30  Eigen::Vector3d angular_velocity_imu_in_imu = Eigen::Vector3d::Zero();
+
31 
+
39  Eigen::Vector3d linear_acceleration_imu_in_imu = Eigen::Vector3d::Zero();
+
40 };
+
41 
+
42 } // namespace vulp::actuation
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
Data filtered from an onboard IMU such as the pi3hat's.
Definition: ImuData.h:12
+
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Definition: ImuData.h:20
+
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Definition: ImuData.h:39
+
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].
Definition: ImuData.h:30
+
+
+ + + + diff --git a/Interface_8cpp.html b/Interface_8cpp.html new file mode 100644 index 00000000..bae9b2aa --- /dev/null +++ b/Interface_8cpp.html @@ -0,0 +1,148 @@ + + + + + + + +vulp: vulp/actuation/Interface.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Interface.cpp File Reference
+
+
+
#include "vulp/actuation/Interface.h"
+#include <palimpsest/Dictionary.h>
+#include <limits>
+#include <map>
+#include <string>
+#include <vector>
+#include "vulp/actuation/default_action.h"
+#include "vulp/actuation/moteus/Mode.h"
+#include "vulp/actuation/moteus/ServoCommand.h"
+
+Include dependency graph for Interface.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/Interface_8cpp__incl.map b/Interface_8cpp__incl.map new file mode 100644 index 00000000..6f7fdd03 --- /dev/null +++ b/Interface_8cpp__incl.map @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Interface_8cpp__incl.md5 b/Interface_8cpp__incl.md5 new file mode 100644 index 00000000..3495253e --- /dev/null +++ b/Interface_8cpp__incl.md5 @@ -0,0 +1 @@ +11f829a40a39f268133d305348ba4a88 \ No newline at end of file diff --git a/Interface_8cpp__incl.png b/Interface_8cpp__incl.png new file mode 100644 index 00000000..91200b46 Binary files /dev/null and b/Interface_8cpp__incl.png differ diff --git a/Interface_8cpp_source.html b/Interface_8cpp_source.html new file mode 100644 index 00000000..abab4b6b --- /dev/null +++ b/Interface_8cpp_source.html @@ -0,0 +1,211 @@ + + + + + + + +vulp: vulp/actuation/Interface.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Interface.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 // Copyright 2023 Inria
+
4 /*
+
5  * This file incorporates work covered by the following copyright and
+
6  * permission notice:
+
7  *
+
8  * SPDX-License-Identifier: Apache-2.0
+
9  * Copyright 2020 Josh Pieper, jjp@pobox.com.
+
10  */
+
11 
+ +
13 
+
14 #include <palimpsest/Dictionary.h>
+
15 
+
16 #include <limits>
+
17 #include <map>
+
18 #include <string>
+
19 #include <vector>
+
20 
+ +
22 #include "vulp/actuation/moteus/Mode.h"
+
23 #include "vulp/actuation/moteus/ServoCommand.h"
+
24 
+
25 namespace vulp::actuation {
+
26 
+
27 void Interface::initialize_action(Dictionary& action) {
+
28  for (const auto& id_joint : servo_layout_.servo_joint_map()) {
+
29  const std::string& joint_name = id_joint.second;
+
30  auto& servo_action = action("servo")(joint_name);
+
31  servo_action("feedforward_torque") = default_action::kFeedforwardTorque;
+
32  servo_action("position") = std::numeric_limits<double>::quiet_NaN();
+
33  servo_action("velocity") = default_action::kVelocity;
+
34  servo_action("kp_scale") = default_action::kKpScale;
+
35  servo_action("kd_scale") = default_action::kKdScale;
+
36  servo_action("maximum_torque") = default_action::kMaximumTorque;
+
37  }
+
38 }
+
39 
+
40 void Interface::write_position_commands(const Dictionary& action) {
+
41  using Mode = actuation::moteus::Mode;
+
42  if (!action.has("servo")) {
+
43  spdlog::warn("No position command at key \"servo\" of action");
+
44  return;
+
45  }
+
46 
+
47  const auto& servo = action("servo");
+
48  const auto& servo_joint_map = servo_layout_.servo_joint_map();
+
49  for (auto& command : commands_) {
+
50  const int servo_id = command.id;
+
51  auto it = servo_joint_map.find(servo_id);
+
52  if (it == servo_joint_map.end()) {
+
53  spdlog::error("Unknown servo ID {} in CAN command", servo_id);
+
54  command.mode = Mode::kStopped;
+
55  continue;
+
56  }
+
57  const auto& joint = it->second;
+
58  if (!servo.has(joint)) {
+
59  spdlog::error("No action for joint {} (servo ID={})", joint, servo_id);
+
60  command.mode = Mode::kStopped;
+
61  continue;
+
62  }
+
63  const auto& servo_action = servo(joint);
+
64  if (!servo_action.has("position")) {
+
65  spdlog::error("No position command for joint {} (servo ID={})", joint,
+
66  servo_id);
+
67  command.mode = Mode::kStopped;
+
68  continue;
+
69  }
+
70 
+
71  const double feedforward_torque = servo_action.get<double>(
+
72  "feedforward_torque", default_action::kFeedforwardTorque);
+
73  const double position_rad = servo_action("position");
+
74  const double velocity_rad_s =
+
75  servo_action.get<double>("velocity", default_action::kVelocity);
+
76  const double kp_scale =
+
77  servo_action.get<double>("kp_scale", default_action::kKpScale);
+
78  const double kd_scale =
+
79  servo_action.get<double>("kd_scale", default_action::kKdScale);
+
80  const double maximum_torque = servo_action.get<double>(
+
81  "maximum_torque", default_action::kMaximumTorque);
+
82 
+
83  // The moteus convention is that positive angles correspond to clockwise
+
84  // rotations when looking at the rotor / back of the moteus board. See:
+
85  // https://jpieper.com/2021/04/30/moteus-direction-configuration/
+
86  const double position_rev = position_rad / (2.0 * M_PI);
+
87  const double velocity_rev_s = velocity_rad_s / (2.0 * M_PI);
+
88 
+
89  command.mode = Mode::kPosition;
+
90  command.position.feedforward_torque = feedforward_torque;
+
91  command.position.position = position_rev;
+
92  command.position.velocity = velocity_rev_s;
+
93  command.position.kp_scale = kp_scale;
+
94  command.position.kd_scale = kd_scale;
+
95  command.position.maximum_torque = maximum_torque;
+
96  }
+
97 }
+
98 
+
99 } // namespace vulp::actuation
+ +
void write_position_commands(const Dictionary &action)
Write position commands from an action dictionary.
Definition: Interface.cpp:40
+
void initialize_action(Dictionary &action)
Initialize action dictionary with keys corresponding to the servo layout.
Definition: Interface.cpp:27
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Map from servo ID to joint name.
Definition: Interface.h:82
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Get the full servo-joint map.
Definition: ServoLayout.h:54
+ + + + + +
constexpr double kFeedforwardTorque
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
+
+ + + + diff --git a/Interface_8h.html b/Interface_8h.html new file mode 100644 index 00000000..7141d24e --- /dev/null +++ b/Interface_8h.html @@ -0,0 +1,167 @@ + + + + + + + +vulp: vulp/actuation/Interface.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Interface.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <map>
+#include <string>
+#include <vector>
+#include "vulp/actuation/ImuData.h"
+#include "vulp/actuation/ServoLayout.h"
+#include "vulp/actuation/moteus/Data.h"
+#include "vulp/actuation/moteus/Output.h"
+#include "vulp/actuation/resolution.h"
+
+Include dependency graph for Interface.h:
+
+
+ + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::actuation::Interface
 Base class for actuation interfaces. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/Interface_8h__dep__incl.map b/Interface_8h__dep__incl.map new file mode 100644 index 00000000..c861b723 --- /dev/null +++ b/Interface_8h__dep__incl.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Interface_8h__dep__incl.md5 b/Interface_8h__dep__incl.md5 new file mode 100644 index 00000000..68300dd9 --- /dev/null +++ b/Interface_8h__dep__incl.md5 @@ -0,0 +1 @@ +0e5a3ae8d0ca806a3c13306aa537d756 \ No newline at end of file diff --git a/Interface_8h__dep__incl.png b/Interface_8h__dep__incl.png new file mode 100644 index 00000000..ce3d539d Binary files /dev/null and b/Interface_8h__dep__incl.png differ diff --git a/Interface_8h__incl.map b/Interface_8h__incl.map new file mode 100644 index 00000000..ed9aa58e --- /dev/null +++ b/Interface_8h__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Interface_8h__incl.md5 b/Interface_8h__incl.md5 new file mode 100644 index 00000000..2d7c3e3c --- /dev/null +++ b/Interface_8h__incl.md5 @@ -0,0 +1 @@ +8f489a47eff0f6dfb7a36adb5f818005 \ No newline at end of file diff --git a/Interface_8h__incl.png b/Interface_8h__incl.png new file mode 100644 index 00000000..1f8976f7 Binary files /dev/null and b/Interface_8h__incl.png differ diff --git a/Interface_8h_source.html b/Interface_8h_source.html new file mode 100644 index 00000000..9e0d15ca --- /dev/null +++ b/Interface_8h_source.html @@ -0,0 +1,209 @@ + + + + + + + +vulp: vulp/actuation/Interface.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Interface.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 
+
8 #include <map>
+
9 #include <string>
+
10 #include <vector>
+
11 
+
12 #include "vulp/actuation/ImuData.h"
+ +
14 #include "vulp/actuation/moteus/Data.h"
+
15 #include "vulp/actuation/moteus/Output.h"
+ +
17 
+
19 namespace vulp::actuation {
+
20 
+
21 using palimpsest::Dictionary;
+
22 
+
24 class Interface {
+
25  public:
+ +
31  : servo_layout_(servo_layout) {
+
32  auto query = get_query_resolution();
+
33  auto resolution = get_position_resolution();
+
34  for (const auto& pair : servo_layout.servo_bus_map()) {
+
35  commands_.push_back({});
+
36  commands_.back().id = pair.first;
+
37  commands_.back().resolution = resolution;
+
38  commands_.back().query = query;
+
39  }
+
40 
+
41  replies_.resize(commands_.size());
+
42  data_.commands = {commands_.data(), commands_.size()};
+
43  data_.replies = {replies_.data(), replies_.size()};
+
44  }
+
45 
+
47  virtual ~Interface() = default;
+
48 
+
58  virtual void cycle(const moteus::Data& data,
+
59  std::function<void(const moteus::Output&)> callback) = 0;
+
60 
+
65  virtual void reset(const Dictionary& config) = 0;
+
66 
+
71  virtual void observe(Dictionary& observation) const = 0;
+
72 
+
74  const ServoLayout& servo_layout() const noexcept { return servo_layout_; }
+
75 
+
77  const std::map<int, int>& servo_bus_map() const noexcept {
+
78  return servo_layout_.servo_bus_map();
+
79  }
+
80 
+
82  const std::map<int, std::string>& servo_joint_map() const noexcept {
+
83  return servo_layout_.servo_joint_map();
+
84  }
+
85 
+
87  std::vector<moteus::ServoCommand>& commands() { return commands_; }
+
88 
+
90  const std::vector<moteus::ServoReply>& replies() const { return replies_; }
+
91 
+
97  moteus::Data& data() { return data_; }
+
98 
+
103  void initialize_action(Dictionary& action);
+
104 
+
109  void write_position_commands(const Dictionary& action);
+
110 
+
118  inline void write_stop_commands() noexcept {
+
119  for (auto& command : commands_) {
+
120  command.mode = actuation::moteus::Mode::kStopped;
+
121  }
+
122  }
+
123 
+
124  private:
+
126  ServoLayout servo_layout_;
+
127 
+
137  std::vector<moteus::ServoCommand> commands_;
+
138 
+
143  std::vector<moteus::ServoReply> replies_;
+
144 
+
150  moteus::Data data_;
+
151 };
+
152 
+
153 } // namespace vulp::actuation
+ + +
Base class for actuation interfaces.
Definition: Interface.h:24
+
const std::map< int, int > & servo_bus_map() const noexcept
Map from servo ID to the CAN bus the servo is connected to.
Definition: Interface.h:77
+
void write_position_commands(const Dictionary &action)
Write position commands from an action dictionary.
Definition: Interface.cpp:40
+
Interface(const ServoLayout &servo_layout)
Initialize actuation interface for a given servo layout.
Definition: Interface.h:30
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
virtual ~Interface()=default
Virtual destructor so that derived destructors are called properly.
+
const ServoLayout & servo_layout() const noexcept
Get servo layout.
Definition: Interface.h:74
+
void initialize_action(Dictionary &action)
Initialize action dictionary with keys corresponding to the servo layout.
Definition: Interface.cpp:27
+
virtual void reset(const Dictionary &config)=0
Reset interface using a new servo layout.
+
void write_stop_commands() noexcept
Stop all servos.
Definition: Interface.h:118
+
virtual void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback)=0
Spin a new communication cycle.
+
const std::vector< moteus::ServoReply > & replies() const
Get servo replies.
Definition: Interface.h:90
+
virtual void observe(Dictionary &observation) const =0
Write servo and IMU observations to dictionary.
+
std::vector< moteus::ServoCommand > & commands()
Get servo commands.
Definition: Interface.h:87
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Map from servo ID to joint name.
Definition: Interface.h:82
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Get the full servo-joint map.
Definition: ServoLayout.h:54
+
const std::map< int, int > & servo_bus_map() const noexcept
Get the full servo-bus map.
Definition: ServoLayout.h:49
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
actuation::moteus::QueryCommand get_query_resolution()
Query resolution settings for all servo commands.
Definition: resolution.h:18
+
actuation::moteus::PositionResolution get_position_resolution()
Resolution settings for all servo commands.
Definition: resolution.h:41
+ +
+
+ + + + diff --git a/Joystick_8cpp.html b/Joystick_8cpp.html new file mode 100644 index 00000000..dbe105d0 --- /dev/null +++ b/Joystick_8cpp.html @@ -0,0 +1,132 @@ + + + + + + + +vulp: vulp/observation/sources/Joystick.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Joystick.cpp File Reference
+
+
+
+Include dependency graph for Joystick.cpp:
+
+
+ + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+
+
+ + + + diff --git a/Joystick_8cpp__incl.map b/Joystick_8cpp__incl.map new file mode 100644 index 00000000..1bca95c9 --- /dev/null +++ b/Joystick_8cpp__incl.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Joystick_8cpp__incl.md5 b/Joystick_8cpp__incl.md5 new file mode 100644 index 00000000..6425e683 --- /dev/null +++ b/Joystick_8cpp__incl.md5 @@ -0,0 +1 @@ +96e9afbc43729f064c6a356fa3265fbf \ No newline at end of file diff --git a/Joystick_8cpp__incl.png b/Joystick_8cpp__incl.png new file mode 100644 index 00000000..4330ceeb Binary files /dev/null and b/Joystick_8cpp__incl.png differ diff --git a/Joystick_8cpp_source.html b/Joystick_8cpp_source.html new file mode 100644 index 00000000..2a92c04f --- /dev/null +++ b/Joystick_8cpp_source.html @@ -0,0 +1,237 @@ + + + + + + + +vulp: vulp/observation/sources/Joystick.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Joystick.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+ +
7 
+
8 Joystick::Joystick(const std::string& device_path) {
+
9  fd_ = ::open(device_path.c_str(), O_RDONLY | O_NONBLOCK);
+
10  if (fd_ < 0) {
+
11  spdlog::warn("[Joystick] Observer disabled: no joystick found at {}",
+
12  device_path);
+
13  }
+
14 }
+
15 
+ +
17  if (fd_ >= 0) {
+
18  ::close(fd_);
+
19  }
+
20 }
+
21 
+
22 void Joystick::read_event() {
+
23  if (fd_ < 0) {
+
24  return;
+
25  }
+
26 
+
27  ssize_t bytes = ::read(fd_, &event_, sizeof(event_));
+
28  if (bytes != sizeof(event_)) { // no input
+
29  return;
+
30  }
+
31 
+
32  double normalized_value = static_cast<double>(event_.value) / 32767;
+
33  if (std::abs(normalized_value) < kJoystickDeadband) {
+
34  normalized_value = 0.0;
+
35  }
+
36 
+
37  switch (event_.type) {
+
38  case JS_EVENT_BUTTON:
+
39  switch (event_.number) {
+
40  case 0: // PS4: cross, Xbox: A
+
41  cross_button_ = event_.value;
+
42  break;
+
43  case 1: // PS4: circle, Xbox: B
+
44  throw std::runtime_error(event_.value ? "Stop button pressed"
+
45  : "Stop button released");
+
46  break;
+
47  case 2: // PS4: triangle, Xbox: X
+
48  triangle_button_ = event_.value;
+
49  break;
+
50  case 3: // PS4: square, Xbox: Y
+
51  square_button_ = event_.value;
+
52  break;
+
53  case 4: // PS4: L1, Xbox: L
+
54  left_button_ = event_.value;
+
55  break;
+
56  case 5: // PS4: R1, Xbox: R
+
57  right_button_ = event_.value;
+
58  break;
+
59  case 6: // PS4: L2, Xbox: back
+
60  break;
+
61  case 7: // PS4: R2, Xbox: start
+
62  break;
+
63  case 8: // PS4: share, Xbox: Xbox button
+
64  break;
+
65  case 9: // PS4: options, Xbox: left stick button
+
66  break;
+
67  case 10: // PS4: PS, Xbox: right stick button
+
68  break;
+
69  case 11: // PS4: L3, Xbox: N/A
+
70  break;
+
71  case 12: // PS4: R3, Xbox: N/A
+
72  break;
+
73  default:
+
74  spdlog::warn("Button number {} is out of range", event_.number);
+
75  break;
+
76  }
+
77  break;
+
78  case JS_EVENT_AXIS:
+
79  switch (event_.number) {
+
80  case 0:
+
81  left_axis_.x() = normalized_value;
+
82  break;
+
83  case 1:
+
84  left_axis_.y() = normalized_value;
+
85  break;
+
86  case 2:
+
87  left_trigger_ = normalized_value;
+
88  break;
+
89  case 3:
+
90  right_axis_.x() = normalized_value;
+
91  break;
+
92  case 4:
+
93  right_axis_.y() = normalized_value;
+
94  break;
+
95  case 5:
+
96  right_trigger_ = normalized_value;
+
97  break;
+
98  case 6:
+
99  pad_axis_.x() = normalized_value;
+
100  break;
+
101  case 7:
+
102  pad_axis_.y() = normalized_value;
+
103  break;
+
104  default:
+
105  spdlog::warn("Axis number {} is out of range", event_.number);
+
106  break;
+
107  }
+
108  break;
+
109  default:
+
110  // initialization events
+
111  break;
+
112  }
+
113 }
+
114 
+
115 void Joystick::write(Dictionary& observation) {
+
116  read_event();
+
117  auto& output = observation(prefix());
+
118  output("cross_button") = cross_button_;
+
119  output("left_axis") = left_axis_;
+
120  output("left_button") = left_button_;
+
121  output("left_trigger") = left_trigger_;
+
122  output("pad_axis") = pad_axis_;
+
123  output("right_axis") = right_axis_;
+
124  output("right_button") = right_button_;
+
125  output("right_trigger") = right_trigger_;
+
126  output("square_button") = square_button_;
+
127  output("triangle_button") = triangle_button_;
+
128 }
+
129 
+
130 } // namespace vulp::observation::sources
+ +
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
Definition: Joystick.h:42
+
~Joystick() override
Close device file.
Definition: Joystick.cpp:16
+
void write(Dictionary &output) final
Write output to a dictionary.
Definition: Joystick.cpp:115
+
Joystick(const std::string &device_path="/dev/input/js0")
Open the device file.
Definition: Joystick.cpp:8
+ +
constexpr double kJoystickDeadband
Deadband between 0.0 and 1.0.
Definition: Joystick.h:18
+
+
+ + + + diff --git a/Joystick_8h.html b/Joystick_8h.html new file mode 100644 index 00000000..388ea1f1 --- /dev/null +++ b/Joystick_8h.html @@ -0,0 +1,159 @@ + + + + + + + +vulp: vulp/observation/sources/Joystick.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Joystick.h File Reference
+
+
+
#include <fcntl.h>
+#include <linux/joystick.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string>
+#include "vulp/observation/Source.h"
+
+Include dependency graph for Joystick.h:
+
+
+ + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::sources::Joystick
 Source for a joystick controller. More...
 
+ + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+ + + + +

+Variables

constexpr double vulp::observation::sources::kJoystickDeadband = 0.1
 Deadband between 0.0 and 1.0. More...
 
+
+
+ + + + diff --git a/Joystick_8h.js b/Joystick_8h.js new file mode 100644 index 00000000..56995d52 --- /dev/null +++ b/Joystick_8h.js @@ -0,0 +1,5 @@ +var Joystick_8h = +[ + [ "Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html", "classvulp_1_1observation_1_1sources_1_1Joystick" ], + [ "kJoystickDeadband", "Joystick_8h.html#a7e19b63b7a414ab70c8b9468df93de44", null ] +]; \ No newline at end of file diff --git a/Joystick_8h__dep__incl.map b/Joystick_8h__dep__incl.map new file mode 100644 index 00000000..e795941e --- /dev/null +++ b/Joystick_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Joystick_8h__dep__incl.md5 b/Joystick_8h__dep__incl.md5 new file mode 100644 index 00000000..9bad3aac --- /dev/null +++ b/Joystick_8h__dep__incl.md5 @@ -0,0 +1 @@ +16068a2c521e72883f6dc4dd88cac2c5 \ No newline at end of file diff --git a/Joystick_8h__dep__incl.png b/Joystick_8h__dep__incl.png new file mode 100644 index 00000000..b8d70d36 Binary files /dev/null and b/Joystick_8h__dep__incl.png differ diff --git a/Joystick_8h__incl.map b/Joystick_8h__incl.map new file mode 100644 index 00000000..2fda7bbd --- /dev/null +++ b/Joystick_8h__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Joystick_8h__incl.md5 b/Joystick_8h__incl.md5 new file mode 100644 index 00000000..dc2ac84c --- /dev/null +++ b/Joystick_8h__incl.md5 @@ -0,0 +1 @@ +9d886ba52bb2d530a444cba259547760 \ No newline at end of file diff --git a/Joystick_8h__incl.png b/Joystick_8h__incl.png new file mode 100644 index 00000000..d347bc4f Binary files /dev/null and b/Joystick_8h__incl.png differ diff --git a/Joystick_8h_source.html b/Joystick_8h_source.html new file mode 100644 index 00000000..07174ac0 --- /dev/null +++ b/Joystick_8h_source.html @@ -0,0 +1,170 @@ + + + + + + + +vulp: vulp/observation/sources/Joystick.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Joystick.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <fcntl.h>
+
7 #include <linux/joystick.h>
+
8 #include <stdio.h>
+
9 #include <unistd.h>
+
10 
+
11 #include <string>
+
12 
+ +
14 
+ +
16 
+
18 constexpr double kJoystickDeadband = 0.1;
+
19 
+
27 class Joystick : public Source {
+
28  public:
+
33  Joystick(const std::string& device_path = "/dev/input/js0");
+
34 
+
36  ~Joystick() override;
+
37 
+
39  inline bool present() const noexcept { return (fd_ >= 0); }
+
40 
+
42  inline std::string prefix() const noexcept final { return "joystick"; }
+
43 
+
48  void write(Dictionary& output) final;
+
49 
+
50  private:
+
52  void read_event();
+
53 
+
54  private:
+
56  int fd_;
+
57 
+
59  struct js_event event_;
+
60 
+
62  Eigen::Vector2d left_axis_ = Eigen::Vector2d::Zero();
+
63 
+
65  double left_trigger_ = -1.0;
+
66 
+
68  Eigen::Vector2d right_axis_ = Eigen::Vector2d::Zero();
+
69 
+
71  double right_trigger_ = -1.0;
+
72 
+
74  Eigen::Vector2d pad_axis_ = Eigen::Vector2d::Zero();
+
75 
+
77  bool cross_button_ = false;
+
78 
+
80  bool left_button_ = false;
+
81 
+
83  bool right_button_ = false;
+
84 
+
86  bool square_button_ = false;
+
87 
+
89  bool triangle_button_ = false;
+
90 };
+
91 
+
92 } // namespace vulp::observation::sources
+ +
Base class for sources.
Definition: Source.h:20
+
Source for a joystick controller.
Definition: Joystick.h:27
+
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
Definition: Joystick.h:42
+
~Joystick() override
Close device file.
Definition: Joystick.cpp:16
+
bool present() const noexcept
Check if the device file was opened successfully.
Definition: Joystick.h:39
+
void write(Dictionary &output) final
Write output to a dictionary.
Definition: Joystick.cpp:115
+
Joystick(const std::string &device_path="/dev/input/js0")
Open the device file.
Definition: Joystick.cpp:8
+ +
constexpr double kJoystickDeadband
Deadband between 0.0 and 1.0.
Definition: Joystick.h:18
+
+
+ + + + diff --git a/Keyboard_8cpp.html b/Keyboard_8cpp.html new file mode 100644 index 00000000..741a47f7 --- /dev/null +++ b/Keyboard_8cpp.html @@ -0,0 +1,137 @@ + + + + + + + +vulp: vulp/observation/sources/Keyboard.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Keyboard.cpp File Reference
+
+
+
+Include dependency graph for Keyboard.cpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+
+
+ + + + diff --git a/Keyboard_8cpp__incl.map b/Keyboard_8cpp__incl.map new file mode 100644 index 00000000..26c6b36a --- /dev/null +++ b/Keyboard_8cpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/Keyboard_8cpp__incl.md5 b/Keyboard_8cpp__incl.md5 new file mode 100644 index 00000000..d436df11 --- /dev/null +++ b/Keyboard_8cpp__incl.md5 @@ -0,0 +1 @@ +e0c4b1200cfb8c9664331af2174bf57f \ No newline at end of file diff --git a/Keyboard_8cpp__incl.png b/Keyboard_8cpp__incl.png new file mode 100644 index 00000000..5bd4b485 Binary files /dev/null and b/Keyboard_8cpp__incl.png differ diff --git a/Keyboard_8cpp_source.html b/Keyboard_8cpp_source.html new file mode 100644 index 00000000..60b8ae2c --- /dev/null +++ b/Keyboard_8cpp_source.html @@ -0,0 +1,241 @@ + + + + + + + +vulp: vulp/observation/sources/Keyboard.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Keyboard.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2023 Inria
+
3 
+ +
5 
+ + +
8  termios term;
+
9  tcgetattr(STDIN_FILENO, &term);
+
10  term.c_lflag &= ~ICANON;
+
11  tcsetattr(STDIN_FILENO, TCSANOW, &term);
+
12  setbuf(stdin, NULL);
+
13 
+
14  key_pressed_ = false;
+
15  key_code_ = Key::UNKNOWN;
+
16 
+
17  last_key_poll_time_ = system_clock::now() - milliseconds(kPollingIntervalMS);
+
18 }
+
19 
+ +
21 
+
22 bool Keyboard::read_event() {
+
23  ssize_t bytes_available = 0;
+
24  ioctl(STDIN_FILENO, FIONREAD, &bytes_available);
+
25 
+
26  if (bytes_available) {
+
27  ssize_t bytes_to_read =
+
28  bytes_available < kMaxKeyBytes ? bytes_available : kMaxKeyBytes;
+
29  ssize_t bytes_read = ::read(STDIN_FILENO, &buf_, bytes_to_read);
+
30 
+
31  if (bytes_read < bytes_available) {
+
32  // Skip the remaining bytes
+
33  do {
+
34  unsigned char garbage[bytes_available - bytes_read];
+
35  bytes_read =
+
36  ::read(STDIN_FILENO, &garbage, bytes_available - bytes_read);
+
37  ioctl(STDIN_FILENO, FIONREAD, &bytes_available);
+
38  } while (bytes_available);
+
39  }
+
40  return 1;
+
41  }
+
42  return 0;
+
43 }
+
44 
+
45 Key Keyboard::map_char_to_key(unsigned char* buf) {
+
46  // Check for 3-byte characters first (i.e. arrows)
+
47  if (!memcmp(buf_, DOWN_BYTES, kMaxKeyBytes)) {
+
48  return Key::DOWN;
+
49  }
+
50  if (!memcmp(buf_, UP_BYTES, kMaxKeyBytes)) {
+
51  return Key::UP;
+
52  }
+
53  if (!memcmp(buf_, LEFT_BYTES, kMaxKeyBytes)) {
+
54  return Key::LEFT;
+
55  }
+
56  if (!memcmp(buf_, RIGHT_BYTES, kMaxKeyBytes)) {
+
57  return Key::RIGHT;
+
58  }
+
59 
+
60  // If the first byte corresponds to a lowercase ASCII alphabetic
+
61  if (is_lowercase_alpha(buf[0])) {
+
62  buf[0] -= 32; // Map to uppercase equivalent
+
63  }
+
64 
+
65  // We treat any printable ASCII as a single key code
+
66  if (is_printable_ascii(buf[0])) {
+
67  switch (buf[0]) {
+
68  case 87: // 0x57
+
69  return Key::W;
+
70  case 65: // 0x41
+
71  return Key::A;
+
72  case 83: // 0x53
+
73  return Key::S;
+
74  case 68: // 0x44
+
75  return Key::D;
+
76  case 88: // 0x58
+
77  return Key::X;
+
78  }
+
79  }
+
80  return Key::UNKNOWN;
+
81 }
+
82 
+
83 void Keyboard::write(Dictionary& observation) {
+
84  // Check elapsed time since last key polling
+
85  auto elapsed = system_clock::now() - last_key_poll_time_;
+
86  auto elapsed_ms = duration_cast<milliseconds>(elapsed).count();
+
87 
+
88  // Poll for key press if enough time has elapsed or if no key is pressed
+
89  if (elapsed_ms >= kPollingIntervalMS || !key_pressed_) {
+
90  key_pressed_ = read_event();
+
91 
+
92  if (key_pressed_) {
+
93  key_code_ = map_char_to_key(buf_);
+
94  } else {
+
95  key_code_ = Key::NONE;
+
96  }
+
97 
+
98  last_key_poll_time_ = system_clock::now();
+
99  }
+
100 
+
101  auto& output = observation(prefix());
+
102  output("key_pressed") = key_pressed_;
+
103  output("up") = key_code_ == Key::UP;
+
104  output("down") = key_code_ == Key::DOWN;
+
105  output("left") = key_code_ == Key::LEFT;
+
106  output("right") = key_code_ == Key::RIGHT;
+
107  output("w") = key_code_ == Key::W;
+
108  output("a") = key_code_ == Key::A;
+
109  output("s") = key_code_ == Key::S;
+
110  output("d") = key_code_ == Key::D;
+
111  output("x") = key_code_ == Key::X;
+
112  output("unknown") = key_code_ == Key::UNKNOWN;
+
113 }
+
114 
+
115 } // namespace vulp::observation::sources
+ +
bool is_printable_ascii(unsigned char c)
Definition: Keyboard.h:42
+
constexpr unsigned char LEFT_BYTES[]
Definition: Keyboard.h:34
+
constexpr unsigned char UP_BYTES[]
Definition: Keyboard.h:31
+
constexpr unsigned char DOWN_BYTES[]
Definition: Keyboard.h:32
+
bool is_lowercase_alpha(unsigned char c)
Definition: Keyboard.h:36
+
constexpr ssize_t kMaxKeyBytes
Maximum number of bytes to encode a key.
Definition: Keyboard.h:25
+
constexpr int64_t kPollingIntervalMS
Polling interval in milliseconds.
Definition: Keyboard.h:28
+
constexpr unsigned char RIGHT_BYTES[]
Definition: Keyboard.h:33
+
Keyboard()
Constructor sets up the terminal in non-canonical mode where input is available immediately without w...
Definition: Keyboard.cpp:7
+
~Keyboard() override
Destructor.
Definition: Keyboard.cpp:20
+
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
Definition: Keyboard.h:82
+
void write(Dictionary &output) final
Write output to a dictionary.
Definition: Keyboard.cpp:83
+ + + + + + + + + + + + + +
+
+ + + + diff --git a/Keyboard_8h.html b/Keyboard_8h.html new file mode 100644 index 00000000..11fdb399 --- /dev/null +++ b/Keyboard_8h.html @@ -0,0 +1,445 @@ + + + + + + + +vulp: vulp/observation/sources/Keyboard.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Keyboard.h File Reference
+
+
+
#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/select.h>
+#include <termios.h>
+#include <unistd.h>
+#include <chrono>
+#include <iostream>
+#include <string>
+#include "vulp/observation/Source.h"
+
+Include dependency graph for Keyboard.h:
+
+
+ + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::sources::Keyboard
 Source for reading Keyboard inputs. More...
 
+ + + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
 vulp::observation::sources
 
+ + + +

+Enumerations

enum class  vulp::observation::sources::Key {
+  vulp::observation::sources::UP +, vulp::observation::sources::DOWN +, vulp::observation::sources::LEFT +, vulp::observation::sources::RIGHT +,
+  vulp::observation::sources::W +, vulp::observation::sources::A +, vulp::observation::sources::S +, vulp::observation::sources::D +,
+  vulp::observation::sources::X +, vulp::observation::sources::NONE +, vulp::observation::sources::UNKNOWN +
+ }
 
+ + + + + + + +

+Functions

bool is_lowercase_alpha (unsigned char c)
 
bool is_uppercase_alpha (unsigned char c)
 
bool is_printable_ascii (unsigned char c)
 
+ + + + + + + + + + + + + + + +

+Variables

constexpr ssize_t kMaxKeyBytes = 3
 Maximum number of bytes to encode a key. More...
 
constexpr int64_t kPollingIntervalMS = 50
 Polling interval in milliseconds. More...
 
constexpr unsigned char UP_BYTES [] = {0x1B, 0x5B, 0x41}
 
constexpr unsigned char DOWN_BYTES [] = {0x1B, 0x5B, 0x42}
 
constexpr unsigned char RIGHT_BYTES [] = {0x1B, 0x5B, 0x43}
 
constexpr unsigned char LEFT_BYTES [] = {0x1B, 0x5B, 0x44}
 
+

Function Documentation

+ +

◆ is_lowercase_alpha()

+ +
+
+ + + + + +
+ + + + + + + + +
bool is_lowercase_alpha (unsigned char c)
+
+inline
+
+ +

Definition at line 36 of file Keyboard.h.

+ +
+
+ +

◆ is_printable_ascii()

+ +
+
+ + + + + +
+ + + + + + + + +
bool is_printable_ascii (unsigned char c)
+
+inline
+
+ +

Definition at line 42 of file Keyboard.h.

+ +
+
+ +

◆ is_uppercase_alpha()

+ +
+
+ + + + + +
+ + + + + + + + +
bool is_uppercase_alpha (unsigned char c)
+
+inline
+
+ +

Definition at line 39 of file Keyboard.h.

+ +
+
+

Variable Documentation

+ +

◆ DOWN_BYTES

+ +
+
+ + + + + +
+ + + + +
constexpr unsigned char DOWN_BYTES[] = {0x1B, 0x5B, 0x42}
+
+constexpr
+
+ +

Definition at line 32 of file Keyboard.h.

+ +
+
+ +

◆ kMaxKeyBytes

+ +
+
+ + + + + +
+ + + + +
constexpr ssize_t kMaxKeyBytes = 3
+
+constexpr
+
+ +

Maximum number of bytes to encode a key.

+ +

Definition at line 25 of file Keyboard.h.

+ +
+
+ +

◆ kPollingIntervalMS

+ +
+
+ + + + + +
+ + + + +
constexpr int64_t kPollingIntervalMS = 50
+
+constexpr
+
+ +

Polling interval in milliseconds.

+ +

Definition at line 28 of file Keyboard.h.

+ +
+
+ +

◆ LEFT_BYTES

+ +
+
+ + + + + +
+ + + + +
constexpr unsigned char LEFT_BYTES[] = {0x1B, 0x5B, 0x44}
+
+constexpr
+
+ +

Definition at line 34 of file Keyboard.h.

+ +
+
+ +

◆ RIGHT_BYTES

+ +
+
+ + + + + +
+ + + + +
constexpr unsigned char RIGHT_BYTES[] = {0x1B, 0x5B, 0x43}
+
+constexpr
+
+ +

Definition at line 33 of file Keyboard.h.

+ +
+
+ +

◆ UP_BYTES

+ +
+
+ + + + + +
+ + + + +
constexpr unsigned char UP_BYTES[] = {0x1B, 0x5B, 0x41}
+
+constexpr
+
+ +

Definition at line 31 of file Keyboard.h.

+ +
+
+
+
+ + + + diff --git a/Keyboard_8h.js b/Keyboard_8h.js new file mode 100644 index 00000000..01767cb9 --- /dev/null +++ b/Keyboard_8h.js @@ -0,0 +1,26 @@ +var Keyboard_8h = +[ + [ "Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html", "classvulp_1_1observation_1_1sources_1_1Keyboard" ], + [ "Key", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422", [ + [ "UP", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1", null ], + [ "DOWN", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f", null ], + [ "LEFT", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758", null ], + [ "RIGHT", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403", null ], + [ "W", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276", null ], + [ "A", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29", null ], + [ "S", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e", null ], + [ "D", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5", null ], + [ "X", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383", null ], + [ "NONE", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693", null ], + [ "UNKNOWN", "Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3", null ] + ] ], + [ "is_lowercase_alpha", "Keyboard_8h.html#a436c4f03139123bc3fe3e764046213c3", null ], + [ "is_printable_ascii", "Keyboard_8h.html#a1f200ef3dbbdfee1673df8bfa3e12901", null ], + [ "is_uppercase_alpha", "Keyboard_8h.html#aa61d4e7c4b5a2d4ad8fc70900fe17cf9", null ], + [ "DOWN_BYTES", "Keyboard_8h.html#a3e1a7b8e0852d8d31fd8b17e6d82d766", null ], + [ "kMaxKeyBytes", "Keyboard_8h.html#aad42040bb8f9fbb2a4e312fca9736ffa", null ], + [ "kPollingIntervalMS", "Keyboard_8h.html#ac524932df3a0d0889f6ef63734eb9b96", null ], + [ "LEFT_BYTES", "Keyboard_8h.html#a287b5932e75598bfa911b731d94a1ff2", null ], + [ "RIGHT_BYTES", "Keyboard_8h.html#adeec831a3176c6cfbd9eb8e8f982aa59", null ], + [ "UP_BYTES", "Keyboard_8h.html#a391c665c8ffd7ddd3a8fbca4aaf58225", null ] +]; \ No newline at end of file diff --git a/Keyboard_8h__dep__incl.map b/Keyboard_8h__dep__incl.map new file mode 100644 index 00000000..e3bbfd10 --- /dev/null +++ b/Keyboard_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Keyboard_8h__dep__incl.md5 b/Keyboard_8h__dep__incl.md5 new file mode 100644 index 00000000..a244d69f --- /dev/null +++ b/Keyboard_8h__dep__incl.md5 @@ -0,0 +1 @@ +88187cd1cac7a76459f445e9ee095525 \ No newline at end of file diff --git a/Keyboard_8h__dep__incl.png b/Keyboard_8h__dep__incl.png new file mode 100644 index 00000000..7b1171ed Binary files /dev/null and b/Keyboard_8h__dep__incl.png differ diff --git a/Keyboard_8h__incl.map b/Keyboard_8h__incl.map new file mode 100644 index 00000000..3c7c9f43 --- /dev/null +++ b/Keyboard_8h__incl.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Keyboard_8h__incl.md5 b/Keyboard_8h__incl.md5 new file mode 100644 index 00000000..460ee39e --- /dev/null +++ b/Keyboard_8h__incl.md5 @@ -0,0 +1 @@ +395ce2f9ec987dc25ff2c23abce388c8 \ No newline at end of file diff --git a/Keyboard_8h__incl.png b/Keyboard_8h__incl.png new file mode 100644 index 00000000..027479da Binary files /dev/null and b/Keyboard_8h__incl.png differ diff --git a/Keyboard_8h_source.html b/Keyboard_8h_source.html new file mode 100644 index 00000000..50c845fd --- /dev/null +++ b/Keyboard_8h_source.html @@ -0,0 +1,212 @@ + + + + + + + +vulp: vulp/observation/sources/Keyboard.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Keyboard.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2023 Inria
+
3 
+
4 #pragma once
+
5 
+
6 #include <fcntl.h>
+
7 #include <stdio.h>
+
8 #include <string.h>
+
9 #include <sys/ioctl.h>
+
10 #include <sys/select.h>
+
11 #include <termios.h>
+
12 #include <unistd.h>
+
13 
+
14 #include <chrono>
+
15 #include <iostream>
+
16 #include <string>
+
17 
+ +
19 
+
20 using std::chrono::duration_cast;
+
21 using std::chrono::milliseconds;
+
22 using std::chrono::system_clock;
+
23 
+
25 constexpr ssize_t kMaxKeyBytes = 3;
+
26 
+
28 constexpr int64_t kPollingIntervalMS = 50;
+
29 
+
30 // Scan codes for arrow keys
+
31 constexpr unsigned char UP_BYTES[] = {0x1B, 0x5B, 0x41};
+
32 constexpr unsigned char DOWN_BYTES[] = {0x1B, 0x5B, 0x42};
+
33 constexpr unsigned char RIGHT_BYTES[] = {0x1B, 0x5B, 0x43};
+
34 constexpr unsigned char LEFT_BYTES[] = {0x1B, 0x5B, 0x44};
+
35 
+
36 inline bool is_lowercase_alpha(unsigned char c) {
+
37  return 0x61 <= c && c <= 0x7A;
+
38 }
+
39 inline bool is_uppercase_alpha(unsigned char c) {
+
40  return 0x41 <= c && c <= 0x5A;
+
41 }
+
42 inline bool is_printable_ascii(unsigned char c) {
+
43  return 0x20 <= c && c <= 0x7F;
+
44 }
+
45 
+ +
47 enum class Key {
+
48  UP,
+
49  DOWN,
+
50  LEFT,
+
51  RIGHT,
+
52  W,
+
53  A,
+
54  S,
+
55  D,
+
56  X,
+
57  NONE, // No key pressed
+
58  UNKNOWN // Map everything else to this key
+
59 };
+
60 
+
71 class Keyboard : public Source {
+
72  public:
+
76  Keyboard();
+
77 
+
79  ~Keyboard() override;
+
80 
+
82  inline std::string prefix() const noexcept final { return "keyboard"; }
+
83 
+
88  void write(Dictionary& output) final;
+
89 
+
90  private:
+
92  bool read_event();
+
93 
+
99  Key map_char_to_key(unsigned char* buf);
+
100 
+
102  unsigned char buf_[kMaxKeyBytes];
+
103 
+
105  Key key_code_;
+
106 
+
108  bool key_pressed_;
+
109 
+
111  system_clock::time_point last_key_poll_time_;
+
112 };
+
113 
+
114 } // namespace vulp::observation::sources
+
bool is_printable_ascii(unsigned char c)
Definition: Keyboard.h:42
+
constexpr unsigned char LEFT_BYTES[]
Definition: Keyboard.h:34
+
constexpr unsigned char UP_BYTES[]
Definition: Keyboard.h:31
+
constexpr unsigned char DOWN_BYTES[]
Definition: Keyboard.h:32
+
bool is_lowercase_alpha(unsigned char c)
Definition: Keyboard.h:36
+
bool is_uppercase_alpha(unsigned char c)
Definition: Keyboard.h:39
+
constexpr ssize_t kMaxKeyBytes
Maximum number of bytes to encode a key.
Definition: Keyboard.h:25
+
constexpr int64_t kPollingIntervalMS
Polling interval in milliseconds.
Definition: Keyboard.h:28
+
constexpr unsigned char RIGHT_BYTES[]
Definition: Keyboard.h:33
+ +
Base class for sources.
Definition: Source.h:20
+
Source for reading Keyboard inputs.
Definition: Keyboard.h:71
+
Keyboard()
Constructor sets up the terminal in non-canonical mode where input is available immediately without w...
Definition: Keyboard.cpp:7
+
~Keyboard() override
Destructor.
Definition: Keyboard.cpp:20
+
std::string prefix() const noexcept final
Prefix of output in the observation dictionary.
Definition: Keyboard.h:82
+
void write(Dictionary &output) final
Write output to a dictionary.
Definition: Keyboard.cpp:83
+ + + + + + + + + + + + + +
+
+ + + + diff --git a/MockInterface_8cpp.html b/MockInterface_8cpp.html new file mode 100644 index 00000000..5e76ab3b --- /dev/null +++ b/MockInterface_8cpp.html @@ -0,0 +1,140 @@ + + + + + + + +vulp: vulp/actuation/MockInterface.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
MockInterface.cpp File Reference
+
+
+
+Include dependency graph for MockInterface.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/MockInterface_8cpp__incl.map b/MockInterface_8cpp__incl.map new file mode 100644 index 00000000..619ece70 --- /dev/null +++ b/MockInterface_8cpp__incl.map @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/MockInterface_8cpp__incl.md5 b/MockInterface_8cpp__incl.md5 new file mode 100644 index 00000000..9a56c202 --- /dev/null +++ b/MockInterface_8cpp__incl.md5 @@ -0,0 +1 @@ +96c84203e047ad5ec48f71b1fcaef47e \ No newline at end of file diff --git a/MockInterface_8cpp__incl.png b/MockInterface_8cpp__incl.png new file mode 100644 index 00000000..9183710a Binary files /dev/null and b/MockInterface_8cpp__incl.png differ diff --git a/MockInterface_8cpp_source.html b/MockInterface_8cpp_source.html new file mode 100644 index 00000000..8a090c37 --- /dev/null +++ b/MockInterface_8cpp_source.html @@ -0,0 +1,181 @@ + + + + + + + +vulp: vulp/actuation/MockInterface.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
MockInterface.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 using std::chrono::duration_cast;
+
7 using std::chrono::microseconds;
+
8 
+
9 namespace vulp::actuation {
+
10 
+
11 MockInterface::MockInterface(const ServoLayout& layout, const double dt)
+
12  : Interface(layout), dt_(dt) {
+
13  query_results_.clear();
+
14  for (const auto& id_bus : layout.servo_bus_map()) {
+
15  const auto& servo_id = id_bus.first;
+
16  moteus::QueryResult result;
+
17  result.d_current = std::numeric_limits<double>::quiet_NaN();
+
18  result.fault = 0;
+
19  result.q_current = std::numeric_limits<double>::quiet_NaN();
+
20  result.rezero_state = false;
+
21  result.temperature = std::numeric_limits<double>::quiet_NaN();
+
22  result.voltage = std::numeric_limits<double>::quiet_NaN();
+
23  query_results_.try_emplace(servo_id, result);
+
24  }
+
25 }
+
26 
+
27 void MockInterface::reset(const Dictionary& config) {}
+
28 
+
29 void MockInterface::observe(Dictionary& observation) const {
+
30  // Eigen quaternions are serialized as [w, x, y, z]
+
31  // See include/palimpsest/mpack/eigen.h in palimpsest
+
32  observation("imu")("orientation") = imu_data_.orientation_imu_in_ars;
+
33  observation("imu")("angular_velocity") =
+ +
35  observation("imu")("linear_acceleration") =
+ +
37 }
+
38 
+
39 void MockInterface::cycle(const moteus::Data& data,
+
40  std::function<void(const moteus::Output&)> callback) {
+
41  assert(data.replies.size() == data.commands.size());
+
42 
+
43  for (const auto& command : data.commands) {
+
44  const auto servo_id = command.id;
+
45  auto& result = query_results_[servo_id];
+
46  result.mode = command.mode;
+
47  const auto& target = command.position;
+
48  if (std::isnan(target.position) && !std::isnan(target.velocity) &&
+
49  !std::isnan(result.position)) {
+
50  result.position += target.velocity * dt_;
+
51  } else {
+
52  result.position = target.position;
+
53  }
+
54  result.velocity = target.velocity;
+
55  result.torque = target.feedforward_torque;
+
56  }
+
57 
+
58  moteus::Output output;
+
59  for (size_t i = 0; i < data.replies.size(); ++i) {
+
60  const auto servo_id = data.commands[i].id;
+
61  data.replies[i].id = servo_id;
+
62  data.replies[i].result = query_results_[servo_id];
+
63  output.query_result_size = i + 1;
+
64  }
+
65  callback(output);
+
66 }
+
67 
+
68 } // namespace vulp::actuation
+ +
Base class for actuation interfaces.
Definition: Interface.h:24
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
MockInterface(const ServoLayout &layout, const double dt)
Create mock actuator interface.
+
void reset(const Dictionary &config) override
Reset interface.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Simulate a new communication cycle.
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
const std::map< int, int > & servo_bus_map() const noexcept
Get the full servo-bus map.
Definition: ServoLayout.h:49
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Definition: ImuData.h:20
+
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Definition: ImuData.h:39
+
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].
Definition: ImuData.h:30
+
+
+ + + + diff --git a/MockInterface_8h.html b/MockInterface_8h.html new file mode 100644 index 00000000..843372e0 --- /dev/null +++ b/MockInterface_8h.html @@ -0,0 +1,162 @@ + + + + + + + +vulp: vulp/actuation/MockInterface.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
MockInterface.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <spdlog/spdlog.h>
+#include <Eigen/Geometry>
+#include <limits>
+#include <map>
+#include <string>
+#include "vulp/actuation/ImuData.h"
+#include "vulp/actuation/Interface.h"
+#include "vulp/actuation/moteus/protocol.h"
+
+Include dependency graph for MockInterface.h:
+
+
+ + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + +

+Classes

class  vulp::actuation::MockInterface
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/MockInterface_8h__dep__incl.map b/MockInterface_8h__dep__incl.map new file mode 100644 index 00000000..79b1b8a9 --- /dev/null +++ b/MockInterface_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/MockInterface_8h__dep__incl.md5 b/MockInterface_8h__dep__incl.md5 new file mode 100644 index 00000000..93f659d9 --- /dev/null +++ b/MockInterface_8h__dep__incl.md5 @@ -0,0 +1 @@ +32f46e072cb866c1622ff48b4b4f5977 \ No newline at end of file diff --git a/MockInterface_8h__dep__incl.png b/MockInterface_8h__dep__incl.png new file mode 100644 index 00000000..9ca311ab Binary files /dev/null and b/MockInterface_8h__dep__incl.png differ diff --git a/MockInterface_8h__incl.map b/MockInterface_8h__incl.map new file mode 100644 index 00000000..6db72099 --- /dev/null +++ b/MockInterface_8h__incl.map @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/MockInterface_8h__incl.md5 b/MockInterface_8h__incl.md5 new file mode 100644 index 00000000..9120969d --- /dev/null +++ b/MockInterface_8h__incl.md5 @@ -0,0 +1 @@ +5f358221f6ee97f328ec5e9a208f78ca \ No newline at end of file diff --git a/MockInterface_8h__incl.png b/MockInterface_8h__incl.png new file mode 100644 index 00000000..f93d18ce Binary files /dev/null and b/MockInterface_8h__incl.png differ diff --git a/MockInterface_8h_source.html b/MockInterface_8h_source.html new file mode 100644 index 00000000..68e08997 --- /dev/null +++ b/MockInterface_8h_source.html @@ -0,0 +1,154 @@ + + + + + + + +vulp: vulp/actuation/MockInterface.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
MockInterface.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 #include <spdlog/spdlog.h>
+
8 
+
9 #include <Eigen/Geometry>
+
10 #include <limits>
+
11 #include <map>
+
12 #include <string>
+
13 
+
14 #include "vulp/actuation/ImuData.h"
+ +
16 #include "vulp/actuation/moteus/protocol.h"
+
17 
+
18 namespace vulp::actuation {
+
19 
+
20 class MockInterface : public Interface {
+
21  public:
+
26  MockInterface(const ServoLayout& layout, const double dt);
+
27 
+
29  ~MockInterface() = default;
+
30 
+
35  void reset(const Dictionary& config) override;
+
36 
+
41  void observe(Dictionary& observation) const override;
+
42 
+
52  void cycle(const moteus::Data& data,
+
53  std::function<void(const moteus::Output&)> callback) final;
+
54 
+
55  private:
+
57  const double dt_;
+
58 
+
60  std::map<int, moteus::QueryResult> query_results_;
+
61 
+
63  ImuData imu_data_;
+
64 };
+
65 
+
66 } // namespace vulp::actuation
+ + +
Base class for actuation interfaces.
Definition: Interface.h:24
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+ +
MockInterface(const ServoLayout &layout, const double dt)
Create mock actuator interface.
+
~MockInterface()=default
Default destructor.
+
void reset(const Dictionary &config) override
Reset interface.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Simulate a new communication cycle.
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
Data filtered from an onboard IMU such as the pi3hat's.
Definition: ImuData.h:12
+
+
+ + + + diff --git a/ObserverPipeline_8cpp.html b/ObserverPipeline_8cpp.html new file mode 100644 index 00000000..27a1cf68 --- /dev/null +++ b/ObserverPipeline_8cpp.html @@ -0,0 +1,133 @@ + + + + + + + +vulp: vulp/observation/ObserverPipeline.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ObserverPipeline.cpp File Reference
+
+
+
#include "vulp/observation/ObserverPipeline.h"
+#include <palimpsest/exceptions/KeyError.h>
+#include "vulp/exceptions/ObserverError.h"
+
+Include dependency graph for ObserverPipeline.cpp:
+
+
+ + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
+
+
+ + + + diff --git a/ObserverPipeline_8cpp__incl.map b/ObserverPipeline_8cpp__incl.map new file mode 100644 index 00000000..eedc403e --- /dev/null +++ b/ObserverPipeline_8cpp__incl.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/ObserverPipeline_8cpp__incl.md5 b/ObserverPipeline_8cpp__incl.md5 new file mode 100644 index 00000000..a9ec27e1 --- /dev/null +++ b/ObserverPipeline_8cpp__incl.md5 @@ -0,0 +1 @@ +5320f7ff47471aeab8d47055789272a9 \ No newline at end of file diff --git a/ObserverPipeline_8cpp__incl.png b/ObserverPipeline_8cpp__incl.png new file mode 100644 index 00000000..8e4cc3cc Binary files /dev/null and b/ObserverPipeline_8cpp__incl.png differ diff --git a/ObserverPipeline_8cpp_source.html b/ObserverPipeline_8cpp_source.html new file mode 100644 index 00000000..c9a85ce0 --- /dev/null +++ b/ObserverPipeline_8cpp_source.html @@ -0,0 +1,143 @@ + + + + + + + +vulp: vulp/observation/ObserverPipeline.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ObserverPipeline.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 #include <palimpsest/exceptions/KeyError.h>
+
7 
+
8 #include "vulp/exceptions/ObserverError.h"
+
9 
+
10 namespace vulp::observation {
+
11 
+
12 using palimpsest::exceptions::KeyError;
+
13 using vulp::exceptions::ObserverError;
+
14 
+
15 void ObserverPipeline::reset(const Dictionary& config) {
+
16  for (auto observer : observers_) {
+
17  observer->reset(config);
+
18  }
+
19 }
+
20 
+
21 void ObserverPipeline::run(Dictionary& observation) {
+
22  for (auto source : sources_) {
+
23  source->write(observation);
+
24  }
+
25  for (auto observer : observers_) {
+
26  try {
+
27  observer->read(observation);
+
28  observer->write(observation);
+
29  } catch (const KeyError& e) {
+
30  throw ObserverError(observer->prefix(), e.key());
+
31  } catch (const std::exception& e) {
+
32  spdlog::error("[ObserverPipeline] Observer {} threw an exception: {}",
+
33  observer->prefix(), e.what());
+
34  throw;
+
35  }
+
36  }
+
37 }
+
38 
+
39 } // namespace vulp::observation
+ +
void reset(const Dictionary &config)
Reset observers.
+
void run(Dictionary &observation)
Run observer pipeline on an observation dictionary.
+
State observation.
+
+
+ + + + diff --git a/ObserverPipeline_8h.html b/ObserverPipeline_8h.html new file mode 100644 index 00000000..dbc61ceb --- /dev/null +++ b/ObserverPipeline_8h.html @@ -0,0 +1,149 @@ + + + + + + + +vulp: vulp/observation/ObserverPipeline.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ObserverPipeline.h File Reference
+
+
+
#include <memory>
+#include <vector>
+#include "vulp/observation/Observer.h"
+#include "vulp/observation/Source.h"
+
+Include dependency graph for ObserverPipeline.h:
+
+
+ + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::ObserverPipeline
 Observer pipeline. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
+
+
+ + + + diff --git a/ObserverPipeline_8h__dep__incl.map b/ObserverPipeline_8h__dep__incl.map new file mode 100644 index 00000000..0bff46a9 --- /dev/null +++ b/ObserverPipeline_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/ObserverPipeline_8h__dep__incl.md5 b/ObserverPipeline_8h__dep__incl.md5 new file mode 100644 index 00000000..b7d66a89 --- /dev/null +++ b/ObserverPipeline_8h__dep__incl.md5 @@ -0,0 +1 @@ +e9376eda56ff73c7c7f6eff801ff338f \ No newline at end of file diff --git a/ObserverPipeline_8h__dep__incl.png b/ObserverPipeline_8h__dep__incl.png new file mode 100644 index 00000000..37f8adbd Binary files /dev/null and b/ObserverPipeline_8h__dep__incl.png differ diff --git a/ObserverPipeline_8h__incl.map b/ObserverPipeline_8h__incl.map new file mode 100644 index 00000000..4073b913 --- /dev/null +++ b/ObserverPipeline_8h__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ObserverPipeline_8h__incl.md5 b/ObserverPipeline_8h__incl.md5 new file mode 100644 index 00000000..258d5688 --- /dev/null +++ b/ObserverPipeline_8h__incl.md5 @@ -0,0 +1 @@ +c10da2485829f726c9741fcddb66bd51 \ No newline at end of file diff --git a/ObserverPipeline_8h__incl.png b/ObserverPipeline_8h__incl.png new file mode 100644 index 00000000..53340f8b Binary files /dev/null and b/ObserverPipeline_8h__incl.png differ diff --git a/ObserverPipeline_8h_source.html b/ObserverPipeline_8h_source.html new file mode 100644 index 00000000..8bc96f72 --- /dev/null +++ b/ObserverPipeline_8h_source.html @@ -0,0 +1,173 @@ + + + + + + + +vulp: vulp/observation/ObserverPipeline.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ObserverPipeline.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <memory>
+
7 #include <vector>
+
8 
+ + +
11 
+
13 namespace vulp::observation {
+
14 
+ +
23  using ObserverPtrVector = std::vector<std::shared_ptr<observation::Observer>>;
+
24  using SourcePtrVector = std::vector<std::shared_ptr<observation::Source>>;
+
25  using Dictionary = palimpsest::Dictionary;
+
26 
+
27  public:
+
28  using iterator = ObserverPtrVector::iterator;
+
29 
+
34  void reset(const Dictionary& config);
+
35 
+
36  /* Add a source at the beginning of the pipeline.
+
37  *
+
38  * \param source Source to append.
+
39  *
+
40  * \note Contrary to observers, the order in which sources are executed is
+
41  * not guaranteed. If a source needs to run after another, consider splitting
+
42  * it into one source and one observer.
+
43  */
+
44  void connect_source(std::shared_ptr<Source> source) {
+
45  sources_.push_back(std::shared_ptr<Source>(source));
+
46  }
+
47 
+
48  /* Append an observer at the end of the pipeline.
+
49  *
+
50  * \param observer Observer to append.
+
51  */
+
52  void append_observer(std::shared_ptr<Observer> observer) {
+
53  observers_.push_back(std::shared_ptr<Observer>(observer));
+
54  }
+
55 
+
57  SourcePtrVector& sources() { return sources_; }
+
58 
+
60  size_t nb_sources() { return sources_.size(); }
+
61 
+
63  ObserverPtrVector& observers() { return observers_; }
+
64 
+
66  size_t nb_observers() { return observers_.size(); }
+
67 
+
72  void run(Dictionary& observation);
+
73 
+
74  private:
+
76  SourcePtrVector sources_;
+
77 
+
79  ObserverPtrVector observers_;
+
80 };
+
81 
+
82 } // namespace vulp::observation
+ + + +
SourcePtrVector & sources()
Sources of the pipeline.
+
void reset(const Dictionary &config)
Reset observers.
+
ObserverPtrVector & observers()
Observers of the pipeline. Order matters.
+
void run(Dictionary &observation)
Run observer pipeline on an observation dictionary.
+
size_t nb_observers()
Number of observers in the pipeline.
+
size_t nb_sources()
Number of sources in the pipeline.
+
void connect_source(std::shared_ptr< Source > source)
+
void append_observer(std::shared_ptr< Observer > observer)
+
ObserverPtrVector::iterator iterator
+
State observation.
+
+
+ + + + diff --git a/Observer_8h.html b/Observer_8h.html new file mode 100644 index 00000000..2e266643 --- /dev/null +++ b/Observer_8h.html @@ -0,0 +1,145 @@ + + + + + + + +vulp: vulp/observation/Observer.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Observer.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <string>
+
+Include dependency graph for Observer.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::Observer
 Base class for observers. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
+
+
+ + + + diff --git a/Observer_8h__dep__incl.map b/Observer_8h__dep__incl.map new file mode 100644 index 00000000..cb75f33a --- /dev/null +++ b/Observer_8h__dep__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Observer_8h__dep__incl.md5 b/Observer_8h__dep__incl.md5 new file mode 100644 index 00000000..5b55cc00 --- /dev/null +++ b/Observer_8h__dep__incl.md5 @@ -0,0 +1 @@ +1ca40010cd4c8ba729e5f6762018f196 \ No newline at end of file diff --git a/Observer_8h__dep__incl.png b/Observer_8h__dep__incl.png new file mode 100644 index 00000000..0419d6fb Binary files /dev/null and b/Observer_8h__dep__incl.png differ diff --git a/Observer_8h__incl.map b/Observer_8h__incl.map new file mode 100644 index 00000000..cf19ee6c --- /dev/null +++ b/Observer_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/Observer_8h__incl.md5 b/Observer_8h__incl.md5 new file mode 100644 index 00000000..fa54fa6d --- /dev/null +++ b/Observer_8h__incl.md5 @@ -0,0 +1 @@ +855c6053ab4ec6ce14525d92fa25b2d0 \ No newline at end of file diff --git a/Observer_8h__incl.png b/Observer_8h__incl.png new file mode 100644 index 00000000..d5fbc48f Binary files /dev/null and b/Observer_8h__incl.png differ diff --git a/Observer_8h_source.html b/Observer_8h_source.html new file mode 100644 index 00000000..9600ceda --- /dev/null +++ b/Observer_8h_source.html @@ -0,0 +1,136 @@ + + + + + + + +vulp: vulp/observation/Observer.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Observer.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 
+
8 #include <string>
+
9 
+
10 namespace vulp::observation {
+
11 
+
12 using palimpsest::Dictionary;
+
13 
+
15 class Observer {
+
16  public:
+
18  virtual ~Observer() {}
+
19 
+
21  virtual inline std::string prefix() const noexcept {
+
22  return "unknown_source";
+
23  }
+
24 
+
29  virtual void reset(const Dictionary& config) {}
+
30 
+
38  virtual void read(const Dictionary& observation) {}
+
39 
+
47  virtual void write(Dictionary& observation) {}
+
48 };
+
49 
+
50 } // namespace vulp::observation
+
Base class for observers.
Definition: Observer.h:15
+
virtual void reset(const Dictionary &config)
Reset observer.
Definition: Observer.h:29
+
virtual std::string prefix() const noexcept
Prefix of outputs in the observation dictionary.
Definition: Observer.h:21
+
virtual void read(const Dictionary &observation)
Read inputs from other observations.
Definition: Observer.h:38
+
virtual void write(Dictionary &observation)
Write outputs, called if reading was successful.
Definition: Observer.h:47
+
virtual ~Observer()
Destructor is virtual to deallocate lists of observers properly.
Definition: Observer.h:18
+
State observation.
+
+
+ + + + diff --git a/Pi3HatInterface_8cpp.html b/Pi3HatInterface_8cpp.html new file mode 100644 index 00000000..0869fde5 --- /dev/null +++ b/Pi3HatInterface_8cpp.html @@ -0,0 +1,151 @@ + + + + + + + +vulp: vulp/actuation/Pi3HatInterface.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Pi3HatInterface.cpp File Reference
+
+
+
+Include dependency graph for Pi3HatInterface.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/Pi3HatInterface_8cpp__incl.map b/Pi3HatInterface_8cpp__incl.map new file mode 100644 index 00000000..7e487d59 --- /dev/null +++ b/Pi3HatInterface_8cpp__incl.map @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pi3HatInterface_8cpp__incl.md5 b/Pi3HatInterface_8cpp__incl.md5 new file mode 100644 index 00000000..786dbdfc --- /dev/null +++ b/Pi3HatInterface_8cpp__incl.md5 @@ -0,0 +1 @@ +507ee21f824f586099264bea78d2d36d \ No newline at end of file diff --git a/Pi3HatInterface_8cpp__incl.png b/Pi3HatInterface_8cpp__incl.png new file mode 100644 index 00000000..dfedcf3d Binary files /dev/null and b/Pi3HatInterface_8cpp__incl.png differ diff --git a/Pi3HatInterface_8cpp_source.html b/Pi3HatInterface_8cpp_source.html new file mode 100644 index 00000000..9bd15a2a --- /dev/null +++ b/Pi3HatInterface_8cpp_source.html @@ -0,0 +1,283 @@ + + + + + + + +vulp: vulp/actuation/Pi3HatInterface.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Pi3HatInterface.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 /*
+
4  * This file incorporates work covered by the following copyright and
+
5  * permission notice:
+
6  *
+
7  * SPDX-License-Identifier: Apache-2.0
+
8  * Copyright 2020 Josh Pieper, jjp@pobox.com.
+
9  */
+
10 
+ +
12 
+
13 namespace vulp::actuation {
+
14 
+
15 Pi3HatInterface::Pi3HatInterface(const ServoLayout& layout, const int can_cpu,
+
16  const Pi3Hat::Configuration& pi3hat_config)
+
17  : Interface(layout),
+
18  can_cpu_(can_cpu),
+
19  pi3hat_config_(pi3hat_config),
+
20  can_thread_(std::bind(&Pi3HatInterface::run_can_thread, this)) {}
+
21 
+ +
23  done_ = true; // comes first
+
24  if (ongoing_can_cycle_) {
+
25  // thread will exit at the end of its loop because done_ is set
+
26  spdlog::info("Waiting for CAN thread to finish active cycle...");
+
27  can_thread_.join();
+
28  spdlog::info("CAN thread finished last cycle cleanly");
+
29  } else /* thread is waiting for notification */ {
+
30  {
+
31  std::lock_guard<std::mutex> lock(mutex_);
+
32  can_wait_condition_.notify_one();
+
33  }
+
34  can_thread_.join();
+
35  }
+
36 }
+
37 
+
38 void Pi3HatInterface::reset(const Dictionary& config) {}
+
39 
+
40 void Pi3HatInterface::observe(Dictionary& observation) const {
+
41  ImuData imu_data;
+
42  imu_data.orientation_imu_in_ars = get_attitude();
+
43  imu_data.angular_velocity_imu_in_imu = get_angular_velocity();
+
44  imu_data.linear_acceleration_imu_in_imu = get_linear_acceleration();
+
45 
+
46  // Eigen quaternions are serialized as [w, x, y, z]
+
47  // See include/palimpsest/mpack/eigen.h in palimpsest
+
48  observation("imu")("orientation") = imu_data.orientation_imu_in_ars;
+
49  observation("imu")("angular_velocity") = imu_data.angular_velocity_imu_in_imu;
+
50  observation("imu")("linear_acceleration") =
+ +
52 }
+
53 
+ +
55  const moteus::Data& data,
+
56  std::function<void(const moteus::Output&)> callback) {
+
57  std::lock_guard<std::mutex> lock(mutex_);
+
58  if (ongoing_can_cycle_) {
+
59  throw std::logic_error(
+
60  "Cycle cannot be called before the previous one has completed.");
+
61  }
+
62 
+
63  callback_ = std::move(callback);
+
64  ongoing_can_cycle_ = true;
+
65  data_ = data;
+
66 
+
67  can_wait_condition_.notify_all();
+
68 }
+
69 
+
70 void Pi3HatInterface::run_can_thread() {
+ + +
73  pi3hat_.reset(new Pi3Hat({pi3hat_config_}));
+
74  pthread_setname_np(pthread_self(), "can_thread");
+
75  while (!done_) {
+
76  {
+
77  std::unique_lock<std::mutex> lock(mutex_);
+
78  if (!ongoing_can_cycle_) {
+
79  can_wait_condition_.wait(lock);
+
80  if (done_) {
+
81  return;
+
82  }
+
83  if (!ongoing_can_cycle_) {
+
84  continue;
+
85  }
+
86  }
+
87  }
+
88  auto output = cycle_can_thread();
+
89  std::function<void(const moteus::Output&)> callback_copy;
+
90  {
+
91  std::unique_lock<std::mutex> lock(mutex_);
+
92  ongoing_can_cycle_ = false;
+
93  std::swap(callback_copy, callback_);
+
94  }
+
95  callback_copy(output);
+
96  }
+
97 }
+
98 
+
99 moteus::Output Pi3HatInterface::cycle_can_thread() {
+
100  tx_can_.resize(data_.commands.size());
+
101  int out_idx = 0;
+
102  for (const auto& cmd : data_.commands) {
+
103  const auto& query = cmd.query;
+
104 
+
105  auto& can = tx_can_[out_idx++];
+
106 
+
107  can.expect_reply = query.any_set();
+
108  can.id = cmd.id | (can.expect_reply ? 0x8000 : 0x0000);
+
109  can.size = 0;
+
110 
+
111  can.bus = [&]() {
+
112  const auto it = servo_bus_map().find(cmd.id);
+
113  if (it == servo_bus_map().end()) {
+
114  return 1;
+
115  }
+
116  return it->second;
+
117  }();
+
118 
+
119  moteus::WriteCanFrame write_frame(can.data, &can.size);
+
120  switch (cmd.mode) {
+
121  case moteus::Mode::kStopped: {
+
122  moteus::EmitStopCommand(&write_frame);
+
123  break;
+
124  }
+
125  case moteus::Mode::kPosition:
+
126  case moteus::Mode::kZeroVelocity: {
+
127  moteus::EmitPositionCommand(&write_frame, cmd.position, cmd.resolution);
+
128  break;
+
129  }
+
130  default: {
+
131  throw std::logic_error("unsupported mode");
+
132  }
+
133  }
+
134  moteus::EmitQueryCommand(&write_frame, cmd.query);
+
135  }
+
136 
+
137  rx_can_.resize(data_.commands.size() * 2);
+
138 
+
139  Pi3Hat::Input input;
+
140  input.tx_can = {tx_can_.data(), tx_can_.size()};
+
141  input.rx_can = {rx_can_.data(), rx_can_.size()};
+
142  input.attitude = &attitude_;
+
143  input.request_attitude = true;
+
144  input.wait_for_attitude = true; // we may revisit this later
+
145 
+
146  moteus::Output result;
+
147  const auto pi3hat_output = pi3hat_->Cycle(input);
+
148  if (pi3hat_output.error) {
+
149  spdlog::error("pi3hat: {}", pi3hat_output.error);
+
150  }
+
151  for (size_t i = 0; i < pi3hat_output.rx_can_size && i < data_.replies.size();
+
152  ++i) {
+
153  const auto& can = rx_can_[i];
+
154  data_.replies[i].id = (can.id & 0x7f00) >> 8;
+
155  data_.replies[i].result = moteus::ParseQueryResult(can.data, can.size);
+
156  result.query_result_size = i + 1;
+
157  }
+
158  if (!pi3hat_output.attitude_present) { // because we wait for attitude
+
159  spdlog::warn("Missing attitude data!");
+
160  }
+
161  return result;
+
162 }
+
163 
+
164 } // namespace vulp::actuation
+ +
Base class for actuation interfaces.
Definition: Interface.h:24
+
const std::map< int, int > & servo_bus_map() const noexcept
Map from servo ID to the CAN bus the servo is connected to.
Definition: Interface.h:77
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
Interface to moteus controllers.
+ +
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Spin a new communication cycle.
+
Pi3HatInterface(const ServoLayout &layout, const int can_cpu, const Pi3Hat::Configuration &pi3hat_config)
Configure interface and spawn CAN thread.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
void reset(const Dictionary &config) override
Reset interface.
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
::mjbots::pi3hat::Pi3Hat Pi3Hat
+
void configure_scheduler(int priority)
Configure the scheduler policy to round-robin for this thread.
Definition: realtime.h:45
+
void configure_cpu(int cpu)
Set the current thread to run on a given CPU core.
Definition: realtime.h:23
+
Data filtered from an onboard IMU such as the pi3hat's.
Definition: ImuData.h:12
+
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Definition: ImuData.h:20
+
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Definition: ImuData.h:39
+
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].
Definition: ImuData.h:30
+
+
+ + + + diff --git a/Pi3HatInterface_8h.html b/Pi3HatInterface_8h.html new file mode 100644 index 00000000..6f394584 --- /dev/null +++ b/Pi3HatInterface_8h.html @@ -0,0 +1,189 @@ + + + + + + + +vulp: vulp/actuation/Pi3HatInterface.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Pi3HatInterface.h File Reference
+
+
+
#include <mjbots/pi3hat/pi3hat.h>
+#include <pthread.h>
+#include <spdlog/spdlog.h>
+#include <Eigen/Geometry>
+#include <condition_variable>
+#include <functional>
+#include <map>
+#include <memory>
+#include <mutex>
+#include <stdexcept>
+#include <string>
+#include <thread>
+#include <utility>
+#include <vector>
+#include "vulp/actuation/ImuData.h"
+#include "vulp/actuation/Interface.h"
+#include "vulp/actuation/moteus/protocol.h"
+#include "vulp/utils/realtime.h"
+
+Include dependency graph for Pi3HatInterface.h:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::actuation::Pi3HatInterface
 Interface to moteus controllers. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+ + + +

+Typedefs

using vulp::actuation::Pi3Hat = ::mjbots::pi3hat::Pi3Hat
 
+
+
+ + + + diff --git a/Pi3HatInterface_8h.js b/Pi3HatInterface_8h.js new file mode 100644 index 00000000..537f6fbd --- /dev/null +++ b/Pi3HatInterface_8h.js @@ -0,0 +1,5 @@ +var Pi3HatInterface_8h = +[ + [ "Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html", "classvulp_1_1actuation_1_1Pi3HatInterface" ], + [ "Pi3Hat", "Pi3HatInterface_8h.html#ab2b376daf35eae21e48708f9b3f63460", null ] +]; \ No newline at end of file diff --git a/Pi3HatInterface_8h__dep__incl.map b/Pi3HatInterface_8h__dep__incl.map new file mode 100644 index 00000000..753cdb31 --- /dev/null +++ b/Pi3HatInterface_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Pi3HatInterface_8h__dep__incl.md5 b/Pi3HatInterface_8h__dep__incl.md5 new file mode 100644 index 00000000..896cb93d --- /dev/null +++ b/Pi3HatInterface_8h__dep__incl.md5 @@ -0,0 +1 @@ +a27a0ced7230ddf45dd707b0c20387a7 \ No newline at end of file diff --git a/Pi3HatInterface_8h__dep__incl.png b/Pi3HatInterface_8h__dep__incl.png new file mode 100644 index 00000000..2f75fd55 Binary files /dev/null and b/Pi3HatInterface_8h__dep__incl.png differ diff --git a/Pi3HatInterface_8h__incl.map b/Pi3HatInterface_8h__incl.map new file mode 100644 index 00000000..a21a05ed --- /dev/null +++ b/Pi3HatInterface_8h__incl.map @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pi3HatInterface_8h__incl.md5 b/Pi3HatInterface_8h__incl.md5 new file mode 100644 index 00000000..4df66add --- /dev/null +++ b/Pi3HatInterface_8h__incl.md5 @@ -0,0 +1 @@ +2aca969e7be4569aaa3d4951b74f0c8e \ No newline at end of file diff --git a/Pi3HatInterface_8h__incl.png b/Pi3HatInterface_8h__incl.png new file mode 100644 index 00000000..3e3c97bf Binary files /dev/null and b/Pi3HatInterface_8h__incl.png differ diff --git a/Pi3HatInterface_8h_source.html b/Pi3HatInterface_8h_source.html new file mode 100644 index 00000000..fdac678a --- /dev/null +++ b/Pi3HatInterface_8h_source.html @@ -0,0 +1,225 @@ + + + + + + + +vulp: vulp/actuation/Pi3HatInterface.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Pi3HatInterface.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 /*
+
4  * This file incorporates work covered by the following copyright and
+
5  * permission notice:
+
6  *
+
7  * SPDX-License-Identifier: Apache-2.0
+
8  * Copyright 2020 Josh Pieper, jjp@pobox.com.
+
9  */
+
10 
+
11 #pragma once
+
12 
+
13 #include <mjbots/pi3hat/pi3hat.h>
+
14 #include <pthread.h>
+
15 #include <spdlog/spdlog.h>
+
16 
+
17 #include <Eigen/Geometry>
+
18 #include <condition_variable>
+
19 #include <functional>
+
20 #include <map>
+
21 #include <memory>
+
22 #include <mutex>
+
23 #include <stdexcept>
+
24 #include <string>
+
25 #include <thread>
+
26 #include <utility>
+
27 #include <vector>
+
28 
+
29 #include "vulp/actuation/ImuData.h"
+ +
31 #include "vulp/actuation/moteus/protocol.h"
+
32 #include "vulp/utils/realtime.h"
+
33 
+
34 namespace vulp::actuation {
+
35 
+ +
37 
+
43 class Pi3HatInterface : public Interface {
+
44  public:
+
51  Pi3HatInterface(const ServoLayout& layout, const int can_cpu,
+
52  const Pi3Hat::Configuration& pi3hat_config);
+
53 
+ +
56 
+
61  void reset(const Dictionary& config) override;
+
62 
+
67  void observe(Dictionary& observation) const override;
+
68 
+
78  void cycle(const moteus::Data& data,
+
79  std::function<void(const moteus::Output&)> callback) final;
+
80 
+
81  private:
+
86  void run_can_thread();
+
87 
+
92  moteus::Output cycle_can_thread();
+
93 
+
99  Eigen::Quaterniond get_attitude() const noexcept {
+
100  const double w = attitude_.attitude.w;
+
101  const double x = attitude_.attitude.x;
+
102  const double y = attitude_.attitude.y;
+
103  const double z = attitude_.attitude.z;
+
104  // These values were floats so the resulting quaternion is only
+
105  // approximately normalized. We saw this property in d7fcaa97fa.
+
106  return Eigen::Quaterniond(w, x, y, z).normalized();
+
107  }
+
108 
+
114  Eigen::Vector3d get_angular_velocity() const noexcept {
+
115  const double omega_x = attitude_.rate_dps.x * M_PI / 180.;
+
116  const double omega_y = attitude_.rate_dps.y * M_PI / 180.;
+
117  const double omega_z = attitude_.rate_dps.z * M_PI / 180.;
+
118  return {omega_x, omega_y, omega_z};
+
119  }
+
120 
+
126  Eigen::Vector3d get_linear_acceleration() const noexcept {
+
127  const double a_x = attitude_.accel_mps2.x;
+
128  const double a_y = attitude_.accel_mps2.y;
+
129  const double a_z = attitude_.accel_mps2.z;
+
130  return {a_x, a_y, a_z};
+
131  }
+
132 
+
133  private:
+
135  const int can_cpu_;
+
136 
+
137  // pi3hat configuration
+
138  const Pi3Hat::Configuration pi3hat_config_;
+
139 
+
141  std::mutex mutex_;
+
142 
+
144  std::condition_variable can_wait_condition_;
+
145 
+
147  bool ongoing_can_cycle_ = false;
+
148 
+
150  bool done_ = false;
+
151 
+
153  std::function<void(const moteus::Output&)> callback_;
+
154 
+
156  moteus::Data data_;
+
157 
+
159  std::thread can_thread_;
+
160 
+
162  std::unique_ptr<Pi3Hat> pi3hat_;
+
163 
+
164  // These are kept persistently so that no memory allocation is
+
165  // required in steady state.
+
166  std::vector<::mjbots::pi3hat::CanFrame> tx_can_;
+
167  std::vector<::mjbots::pi3hat::CanFrame> rx_can_;
+
168 
+
170  ::mjbots::pi3hat::Attitude attitude_;
+
171 };
+
172 
+
173 } // namespace vulp::actuation
+ + +
Base class for actuation interfaces.
Definition: Interface.h:24
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
Interface to moteus controllers.
+ +
void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
Spin a new communication cycle.
+
Pi3HatInterface(const ServoLayout &layout, const int can_cpu, const Pi3Hat::Configuration &pi3hat_config)
Configure interface and spawn CAN thread.
+
void observe(Dictionary &observation) const override
Write actuation-interface observations to dictionary.
+
void reset(const Dictionary &config) override
Reset interface.
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
::mjbots::pi3hat::Pi3Hat Pi3Hat
+ +
+
+ + + + diff --git a/README_8md.html b/README_8md.html new file mode 100644 index 00000000..594678cb --- /dev/null +++ b/README_8md.html @@ -0,0 +1,100 @@ + + + + + + + +vulp: README.md File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
README.md File Reference
+
+
+
+
+ + + + diff --git a/Request_8h.html b/Request_8h.html new file mode 100644 index 00000000..cb69b1ec --- /dev/null +++ b/Request_8h.html @@ -0,0 +1,152 @@ + + + + + + + +vulp: vulp/spine/Request.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Request.h File Reference
+
+
+
#include <cstdint>
+
+Include dependency graph for Request.h:
+
+
+ + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+ + + +

+Enumerations

enum class  vulp.spine::Request : uint32_t {
+  vulp.spine::kNone = 0 +, vulp.spine::kObservation = 1 +, vulp.spine::kAction = 2 +, vulp.spine::kStart = 3 +,
+  vulp.spine::kStop = 4 +, vulp.spine::kError = 5 +
+ }
 
+
+
+ + + + diff --git a/Request_8h.js b/Request_8h.js new file mode 100644 index 00000000..2676a270 --- /dev/null +++ b/Request_8h.js @@ -0,0 +1,11 @@ +var Request_8h = +[ + [ "Request", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1", [ + [ "kNone", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13", null ], + [ "kObservation", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28", null ], + [ "kAction", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4", null ], + [ "kStart", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d", null ], + [ "kStop", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b", null ], + [ "kError", "Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97", null ] + ] ] +]; \ No newline at end of file diff --git a/Request_8h__dep__incl.map b/Request_8h__dep__incl.map new file mode 100644 index 00000000..384ba80f --- /dev/null +++ b/Request_8h__dep__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Request_8h__dep__incl.md5 b/Request_8h__dep__incl.md5 new file mode 100644 index 00000000..d76acf5d --- /dev/null +++ b/Request_8h__dep__incl.md5 @@ -0,0 +1 @@ +f41a23efaa5f57fb5ad7ba47fb06dfcb \ No newline at end of file diff --git a/Request_8h__dep__incl.png b/Request_8h__dep__incl.png new file mode 100644 index 00000000..4e3f26c2 Binary files /dev/null and b/Request_8h__dep__incl.png differ diff --git a/Request_8h__incl.map b/Request_8h__incl.map new file mode 100644 index 00000000..c7a008f2 --- /dev/null +++ b/Request_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Request_8h__incl.md5 b/Request_8h__incl.md5 new file mode 100644 index 00000000..d2b94670 --- /dev/null +++ b/Request_8h__incl.md5 @@ -0,0 +1 @@ +7bf854064b1ed2df1d8a86ad7459fa65 \ No newline at end of file diff --git a/Request_8h__incl.png b/Request_8h__incl.png new file mode 100644 index 00000000..129e2d94 Binary files /dev/null and b/Request_8h__incl.png differ diff --git a/Request_8h_source.html b/Request_8h_source.html new file mode 100644 index 00000000..ee18454f --- /dev/null +++ b/Request_8h_source.html @@ -0,0 +1,127 @@ + + + + + + + +vulp: vulp/spine/Request.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Request.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <cstdint>
+
7 
+
8 namespace vulp::spine {
+
9 
+
10 enum class Request : uint32_t {
+
11  kNone = 0, // no active request
+
12  kObservation = 1,
+
13  kAction = 2,
+
14  kStart = 3,
+
15  kStop = 4,
+
16  kError = 5 // last request was invalid
+
17 };
+
18 
+
19 } // namespace vulp::spine
+
Flag set by the agent to request an operation from the spine.
Definition: request.py:10
+ + + + + + +
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
+
+ + + + diff --git a/ServoLayout_8h.html b/ServoLayout_8h.html new file mode 100644 index 00000000..1551984c --- /dev/null +++ b/ServoLayout_8h.html @@ -0,0 +1,150 @@ + + + + + + + +vulp: vulp/actuation/ServoLayout.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ServoLayout.h File Reference
+
+
+
#include <map>
+#include <string>
+
+Include dependency graph for ServoLayout.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::actuation::ServoLayout
 Map between servos, their busses and the joints they actuate. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+
+
+ + + + diff --git a/ServoLayout_8h__dep__incl.map b/ServoLayout_8h__dep__incl.map new file mode 100644 index 00000000..54816e34 --- /dev/null +++ b/ServoLayout_8h__dep__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/ServoLayout_8h__dep__incl.md5 b/ServoLayout_8h__dep__incl.md5 new file mode 100644 index 00000000..389dde9c --- /dev/null +++ b/ServoLayout_8h__dep__incl.md5 @@ -0,0 +1 @@ +6897acf258e3d26d3684f7097d37eea4 \ No newline at end of file diff --git a/ServoLayout_8h__dep__incl.png b/ServoLayout_8h__dep__incl.png new file mode 100644 index 00000000..271f5c03 Binary files /dev/null and b/ServoLayout_8h__dep__incl.png differ diff --git a/ServoLayout_8h__incl.map b/ServoLayout_8h__incl.map new file mode 100644 index 00000000..db42f725 --- /dev/null +++ b/ServoLayout_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/ServoLayout_8h__incl.md5 b/ServoLayout_8h__incl.md5 new file mode 100644 index 00000000..87be51b0 --- /dev/null +++ b/ServoLayout_8h__incl.md5 @@ -0,0 +1 @@ +77d416586b6dd6b368a256b2a6dd234e \ No newline at end of file diff --git a/ServoLayout_8h__incl.png b/ServoLayout_8h__incl.png new file mode 100644 index 00000000..c215d482 Binary files /dev/null and b/ServoLayout_8h__incl.png differ diff --git a/ServoLayout_8h_source.html b/ServoLayout_8h_source.html new file mode 100644 index 00000000..e43e2328 --- /dev/null +++ b/ServoLayout_8h_source.html @@ -0,0 +1,149 @@ + + + + + + + +vulp: vulp/actuation/ServoLayout.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
ServoLayout.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <map>
+
7 #include <string>
+
8 
+
9 namespace vulp::actuation {
+
10 
+
12 class ServoLayout {
+
13  public:
+
20  void add_servo(const int servo_id, const int bus_id,
+
21  const std::string& joint_name) {
+
22  servo_bus_map_[servo_id] = bus_id;
+
23  servo_joint_map_[servo_id] = joint_name;
+
24  }
+
25 
+
34  int bus(const int servo_id) const { return servo_bus_map_.at(servo_id); }
+
35 
+
44  const std::string& joint_name(const int servo_id) const {
+
45  return servo_joint_map_.at(servo_id);
+
46  }
+
47 
+
49  const std::map<int, int>& servo_bus_map() const noexcept {
+
50  return servo_bus_map_;
+
51  }
+
52 
+
54  const std::map<int, std::string>& servo_joint_map() const noexcept {
+
55  return servo_joint_map_;
+
56  }
+
57 
+
59  size_t size() const noexcept { return servo_bus_map_.size(); }
+
60 
+
61  private:
+
63  std::map<int, int> servo_bus_map_;
+
64 
+
66  std::map<int, std::string> servo_joint_map_;
+
67 };
+
68 
+
69 } // namespace vulp::actuation
+
Map between servos, their busses and the joints they actuate.
Definition: ServoLayout.h:12
+
const std::string & joint_name(const int servo_id) const
Get the name of the joint a servo actuates.
Definition: ServoLayout.h:44
+
void add_servo(const int servo_id, const int bus_id, const std::string &joint_name)
Add a servo to the layout.
Definition: ServoLayout.h:20
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Get the full servo-joint map.
Definition: ServoLayout.h:54
+
size_t size() const noexcept
Get the number of servos in the layout.
Definition: ServoLayout.h:59
+
int bus(const int servo_id) const
Get identifier of the CAN bus a servo is connected to.
Definition: ServoLayout.h:34
+
const std::map< int, int > & servo_bus_map() const noexcept
Get the full servo-bus map.
Definition: ServoLayout.h:49
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
+
+ + + + diff --git a/Source_8h.html b/Source_8h.html new file mode 100644 index 00000000..1b6491bd --- /dev/null +++ b/Source_8h.html @@ -0,0 +1,150 @@ + + + + + + + +vulp: vulp/observation/Source.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Source.h File Reference
+
+
+
#include <palimpsest/Dictionary.h>
+#include <string>
+
+Include dependency graph for Source.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp::observation::Source
 Base class for sources. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp::observation
 State observation.
 
+
+
+ + + + diff --git a/Source_8h__dep__incl.map b/Source_8h__dep__incl.map new file mode 100644 index 00000000..ced01ad8 --- /dev/null +++ b/Source_8h__dep__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/Source_8h__dep__incl.md5 b/Source_8h__dep__incl.md5 new file mode 100644 index 00000000..046481db --- /dev/null +++ b/Source_8h__dep__incl.md5 @@ -0,0 +1 @@ +ef2844ebfef08a30c3688e6761f5f882 \ No newline at end of file diff --git a/Source_8h__dep__incl.png b/Source_8h__dep__incl.png new file mode 100644 index 00000000..a7efa25b Binary files /dev/null and b/Source_8h__dep__incl.png differ diff --git a/Source_8h__incl.map b/Source_8h__incl.map new file mode 100644 index 00000000..dfb4dcca --- /dev/null +++ b/Source_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/Source_8h__incl.md5 b/Source_8h__incl.md5 new file mode 100644 index 00000000..58c75fbb --- /dev/null +++ b/Source_8h__incl.md5 @@ -0,0 +1 @@ +532144a3185748164ffc1062a7b9e1a5 \ No newline at end of file diff --git a/Source_8h__incl.png b/Source_8h__incl.png new file mode 100644 index 00000000..69b18fd5 Binary files /dev/null and b/Source_8h__incl.png differ diff --git a/Source_8h_source.html b/Source_8h_source.html new file mode 100644 index 00000000..c6cc41ea --- /dev/null +++ b/Source_8h_source.html @@ -0,0 +1,130 @@ + + + + + + + +vulp: vulp/observation/Source.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Source.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <palimpsest/Dictionary.h>
+
7 
+
8 #include <string>
+
9 
+
10 namespace vulp::observation {
+
11 
+
12 using palimpsest::Dictionary;
+
13 
+
20 class Source {
+
21  public:
+
23  virtual ~Source() {}
+
24 
+
30  virtual inline std::string prefix() const noexcept {
+
31  return "unknown_source";
+
32  }
+
33 
+
41  virtual void write(Dictionary& observation) {}
+
42 };
+
43 
+
44 } // namespace vulp::observation
+
Base class for sources.
Definition: Source.h:20
+
virtual void write(Dictionary &observation)
Write output to a dictionary.
Definition: Source.h:41
+
virtual ~Source()
Destructor is virtual to deallocate lists of observers properly.
Definition: Source.h:23
+
virtual std::string prefix() const noexcept
Prefix of output in the observation dictionary.
Definition: Source.h:30
+
State observation.
+
+
+ + + + diff --git a/Spine_8cpp.html b/Spine_8cpp.html new file mode 100644 index 00000000..ed9acdfc --- /dev/null +++ b/Spine_8cpp.html @@ -0,0 +1,169 @@ + + + + + + + +vulp: vulp/spine/Spine.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Spine.cpp File Reference
+
+
+
#include "vulp/spine/Spine.h"
+#include <mpacklog/Logger.h>
+#include <limits>
+#include "vulp/exceptions/ObserverError.h"
+
+Include dependency graph for Spine.cpp:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+
+
+ + + + diff --git a/Spine_8cpp__incl.map b/Spine_8cpp__incl.map new file mode 100644 index 00000000..2b7c0312 --- /dev/null +++ b/Spine_8cpp__incl.map @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spine_8cpp__incl.md5 b/Spine_8cpp__incl.md5 new file mode 100644 index 00000000..ef67ad32 --- /dev/null +++ b/Spine_8cpp__incl.md5 @@ -0,0 +1 @@ +4196cdf2498e22af9fe45a413d62eb4b \ No newline at end of file diff --git a/Spine_8cpp__incl.png b/Spine_8cpp__incl.png new file mode 100644 index 00000000..b20a6fad Binary files /dev/null and b/Spine_8cpp__incl.png differ diff --git a/Spine_8cpp_source.html b/Spine_8cpp_source.html new file mode 100644 index 00000000..3c7eaa21 --- /dev/null +++ b/Spine_8cpp_source.html @@ -0,0 +1,392 @@ + + + + + + + +vulp: vulp/spine/Spine.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Spine.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 /*
+
4  * This file incorporates work covered by the following copyright and
+
5  * permission notice:
+
6  *
+
7  * SPDX-License-Identifier: Apache-2.0
+
8  * Copyright 2020 Josh Pieper, jjp@pobox.com.
+
9  */
+
10 
+
11 #include "vulp/spine/Spine.h"
+
12 
+
13 #include <mpacklog/Logger.h>
+
14 
+
15 #include <limits>
+
16 
+
17 #include "vulp/exceptions/ObserverError.h"
+
18 
+
19 namespace vulp::spine {
+
20 
+
21 using palimpsest::Dictionary;
+
22 using vulp::exceptions::ObserverError;
+
23 
+
24 Spine::Spine(const Parameters& params, actuation::Interface& actuation,
+ +
26  : frequency_(params.frequency),
+
27  actuation_(actuation),
+
28  agent_interface_(params.shm_name, params.shm_size),
+
29  observer_pipeline_(observers),
+
30  logger_(params.log_path),
+
31  caught_interrupt_(vulp::utils::handle_interrupts()),
+
32  state_machine_(agent_interface_),
+
33  state_cycle_beginning_(State::kOver),
+
34  state_cycle_end_(State::kOver) {
+
35 // Thread name as it appears in the `cmd` column of `ps`
+
36 #ifdef __APPLE__
+
37  pthread_setname_np("spine_thread");
+
38 #else
+
39  pthread_setname_np(pthread_self(), "spine_thread");
+
40 #endif
+
41 
+
42  // Real-time configuration
+
43  // NB: it is too late to lock memory here, this should be done by the caller
+
44  if (params.cpu >= 0) {
+
45  utils::configure_cpu(params.cpu);
+ +
47  }
+
48 
+
49  // Inter-process communication
+ +
51 
+
52  // Initialize internal dictionary
+
53  Dictionary& observation = working_dict_("observation");
+
54  observation::observe_time(observation);
+
55  working_dict_.insert<double>("time", observation.get<double>("time"));
+
56 }
+
57 
+
58 void Spine::reset(const Dictionary& config) {
+
59  Dictionary& action = working_dict_("action");
+
60  actuation_.reset(config);
+
61  action.clear();
+ +
63  observer_pipeline_.reset(config);
+
64 }
+
65 
+
66 void Spine::log_working_dict() {
+
67  Dictionary& spine = working_dict_("spine");
+
68  spine("logger")("last_size") = static_cast<uint32_t>(logger_.last_size());
+
69  spine("state")("cycle_beginning") =
+
70  static_cast<uint32_t>(state_cycle_beginning_);
+
71  spine("state")("cycle_end") = static_cast<uint32_t>(state_cycle_end_);
+ +
73 
+
74  // Log configuration dictionary at most once (at reset)
+
75  if (working_dict_.has("config")) {
+
76  working_dict_.remove("config");
+
77  }
+
78 }
+
79 
+
80 void Spine::run() {
+
81  Dictionary& spine = working_dict_("spine");
+ +
83  while (state_machine_.state() != State::kOver) {
+
84  cycle();
+ +
86  spine("clock")("measured_period") = clock.measured_period();
+
87  spine("clock")("skip_count") = clock.skip_count();
+
88  spine("clock")("slack") = clock.slack();
+
89  log_working_dict();
+
90  }
+
91  clock.wait_for_next_tick();
+
92  }
+
93  spdlog::info("SEE YOU SPACE COWBOY...");
+
94 }
+
95 
+
96 void Spine::cycle() {
+
97  begin_cycle(); // check interrupts, read agent inputs
+
98  cycle_actuation(); // read latest actuation replies, send new commands
+
99  end_cycle(); // output to agent
+
100 }
+
101 
+
102 void Spine::simulate(unsigned nb_substeps) {
+
103  while (state_machine_.state() != State::kOver) {
+
104  begin_cycle();
+ +
106  cycle_actuation(); // S1: cycle the simulator, promise actuation_output_
+
107  cycle_actuation(); // S2: fill latest_replies_ from actuation_output_
+
108  cycle_actuation(); // S3: fill observation dict from latest_replies_
+
109  // now the first observation is ready to be read by the agent
+
110  } else if (state_machine_.state() == State::kAct) {
+
111  for (unsigned substep = 0; substep < nb_substeps; ++substep) {
+
112  cycle_actuation();
+
113  }
+
114  }
+
115  end_cycle();
+
116  }
+
117 }
+
118 
+
119 void Spine::begin_cycle() {
+
120  if (caught_interrupt_) {
+ +
122  } else /* (!caught_interrupt_) */ {
+ +
124  }
+ +
126 
+
127  // Read input dictionary if applicable
+ +
129  Dictionary& config = working_dict_("config");
+
130  const char* data = agent_interface_.data();
+
131  size_t size = agent_interface_.size();
+
132  config.clear();
+
133  config.update(data, size);
+
134  reset(config);
+
135  } else if (state_machine_.state() == State::kAct) {
+
136  Dictionary& action = working_dict_("action");
+
137  const char* data = agent_interface_.data();
+
138  size_t size = agent_interface_.size();
+
139  action.update(data, size);
+
140  }
+
141 }
+
142 
+
143 void Spine::end_cycle() {
+
144  // Write observation if applicable
+
145  const Dictionary& observation = working_dict_("observation");
+
146  working_dict_("time") = observation.get<double>("time");
+ +
148  size_t size = observation.serialize(ipc_buffer_);
+
149  agent_interface_.write(ipc_buffer_.data(), size);
+
150  }
+
151 
+ + +
154 }
+
155 
+
156 void Spine::cycle_actuation() {
+
157  try {
+
158  // 1. Observation
+
159  Dictionary& observation = working_dict_("observation");
+
160  observation::observe_time(observation);
+ + +
163  actuation_.observe(observation);
+
164  // Observers need configuration, so they cannot run at stop
+ + +
167  try {
+
168  observer_pipeline_.run(observation);
+
169  } catch (const ObserverError& e) {
+
170  spdlog::info("Key error from {}: key \"{}\" not found", e.prefix(),
+
171  e.key());
+
172  }
+
173  }
+
174 
+
175  // 2. Action
+ + + +
179  } else if (state_machine_.state() == State::kAct) {
+
180  Dictionary& action = working_dict_("action");
+ +
182  }
+
183  } catch (const std::exception& e) {
+
184  spdlog::error("[Spine] Caught an exception: {}", e.what());
+
185  spdlog::error("[Spine] Sending stop commands...");
+ + +
188  } catch (...) {
+
189  spdlog::error("[Spine] Caught an unknown exception!");
+
190  spdlog::error("[Spine] Sending stop commands...");
+ + +
193  }
+
194 
+
195  // Whatever exceptions were thrown around, we caught them and at this
+
196  // point every actuation command is either a stop or a position one.
+
197 
+
198  // 3. Wait for the result of the last query and copy it
+
199  if (actuation_output_.valid()) {
+
200  const auto current_values = actuation_output_.get(); // may wait here
+
201  const auto rx_count = current_values.query_result_size;
+
202  latest_replies_.resize(rx_count);
+
203  std::copy(actuation_.replies().begin(),
+
204  actuation_.replies().begin() + rx_count, latest_replies_.begin());
+
205  }
+
206 
+
207  // Now we are after the previous cycle (we called actuation_output_.get())
+
208  // and before the next one. This is a good time to break out of loop of
+
209  // communication cycles. Otherwise, the interface may warn that it is waiting
+
210  // for the last actuation cycle to finish.
+ +
212  spdlog::info("Wrapping up last communication cycle");
+
213  return;
+
214  }
+
215 
+
216  // 4. Start a new cycle. Results have been copied, so actuation commands and
+
217  // replies are available again to the actuation thread for writing.
+
218  auto promise = std::make_shared<std::promise<actuation::moteus::Output>>();
+ +
220  [promise](const actuation::moteus::Output& output) {
+
221  // This is called from an arbitrary thread, so we
+
222  // just set the promise value here.
+
223  promise->set_value(output);
+
224  });
+
225  actuation_output_ = promise->get_future();
+
226 }
+
227 
+
228 } // namespace vulp::spine
+ +
Base class for actuation interfaces.
Definition: Interface.h:24
+
void write_position_commands(const Dictionary &action)
Write position commands from an action dictionary.
Definition: Interface.cpp:40
+
moteus::Data & data()
Get joint command-reply data.
Definition: Interface.h:97
+
void initialize_action(Dictionary &action)
Initialize action dictionary with keys corresponding to the servo layout.
Definition: Interface.cpp:27
+
virtual void reset(const Dictionary &config)=0
Reset interface using a new servo layout.
+
void write_stop_commands() noexcept
Stop all servos.
Definition: Interface.h:118
+
virtual void cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback)=0
Spin a new communication cycle.
+
const std::vector< moteus::ServoReply > & replies() const
Get servo replies.
Definition: Interface.h:90
+
virtual void observe(Dictionary &observation) const =0
Write servo and IMU observations to dictionary.
+
const std::map< int, std::string > & servo_joint_map() const noexcept
Map from servo ID to joint name.
Definition: Interface.h:82
+ +
void reset(const Dictionary &config)
Reset observers.
+
void run(Dictionary &observation)
Run observer pipeline on an observation dictionary.
+
void set_request(Request request)
Set current request in shared memory.
+
void write(char *data, size_t size)
Write data to the data buffer in shared memory.
+
uint32_t size() const
Get size of current data buffer.
+
const char * data() const
Get pointer to data buffer.
+
mpacklog::Logger logger_
Logger for the working_dict_ produced at each cycle.
Definition: Spine.h:164
+
AgentInterface agent_interface_
Shared memory mapping for inter-process communication.
Definition: Spine.h:149
+
std::future< actuation::moteus::Output > actuation_output_
Future used to wait for moteus replies.
Definition: Spine.h:152
+
const unsigned frequency_
Frequency of the spine loop in [Hz].
Definition: Spine.h:139
+
void run()
Run the spine loop until termination.
Definition: Spine.cpp:80
+
State state_cycle_beginning_
State after the last Event::kCycleBeginning.
Definition: Spine.h:176
+
State state_cycle_end_
State after the last Event::kCycleEnd.
Definition: Spine.h:179
+
void reset(const palimpsest::Dictionary &config)
Reset the spine with a new configuration.
Definition: Spine.cpp:58
+
StateMachine state_machine_
Internal state machine.
Definition: Spine.h:173
+
observation::ObserverPipeline observer_pipeline_
Pipeline of observers, executed in that order.
Definition: Spine.h:161
+
void simulate(unsigned nb_substeps)
Alternative to run where the actuation interface is cycled a fixed number of times,...
Definition: Spine.cpp:102
+
std::vector< char > ipc_buffer_
Buffer used to serialize/deserialize dictionaries in IPC.
Definition: Spine.h:167
+
std::vector< actuation::moteus::ServoReply > latest_replies_
Latest servo replies. They are copied and thread-safe.
Definition: Spine.h:155
+
void cycle()
Spin one cycle of the spine loop.
Definition: Spine.cpp:96
+
const bool & caught_interrupt_
Boolean flag that becomes true when an interruption is caught.
Definition: Spine.h:170
+
actuation::Interface & actuation_
Interface that communicates with actuators.
Definition: Spine.h:146
+
palimpsest::Dictionary working_dict_
All data from observation to action goes to this dictionary.
Definition: Spine.h:158
+
Spine(const Parameters &params, actuation::Interface &interface, observation::ObserverPipeline &observers)
Initialize spine.
Definition: Spine.cpp:24
+
void process_event(const Event &event) noexcept
Process a new event.
+
const State & state() const noexcept
Get current state.
Definition: StateMachine.h:103
+
bool is_over_after_this_cycle() const noexcept
Whether we transition to the terminal state at the next end-cycle event.
Definition: StateMachine.h:106
+ +
Synchronous (blocking) clock.
+
double measured_period() const noexcept
Get measured period in seconds.
+
int skip_count() const noexcept
Get last number of clock cycles skipped.
+
void wait_for_next_tick()
Wait until the next tick of the internal clock.
+
double slack() const noexcept
Get the last sleep duration duration in seconds.
+
void observe_time(Dictionary &observation)
Observe time since the epoch.
Definition: observe_time.h:16
+
void observe_servos(Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)
+
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+ + + +
State
States of the state machine.
Definition: StateMachine.h:14
+ + + + + + +
void configure_scheduler(int priority)
Configure the scheduler policy to round-robin for this thread.
Definition: realtime.h:45
+
void configure_cpu(int cpu)
Set the current thread to run on a given CPU core.
Definition: realtime.h:23
+
const bool & handle_interrupts()
Redirect interrupts to setting a global interrupt boolean.
+ +
Spine parameters.
Definition: Spine.h:48
+
int cpu
CPUID for the spine thread (-1 to disable realtime).
Definition: Spine.h:50
+
+
+ + + + diff --git a/Spine_8h.html b/Spine_8h.html new file mode 100644 index 00000000..c796c337 --- /dev/null +++ b/Spine_8h.html @@ -0,0 +1,203 @@ + + + + + + + +vulp: vulp/spine/Spine.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
Spine.h File Reference
+
+
+
#include <mpacklog/Logger.h>
+#include <algorithm>
+#include <future>
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+#include "vulp/actuation/Interface.h"
+#include "vulp/observation/ObserverPipeline.h"
+#include "vulp/observation/observe_servos.h"
+#include "vulp/observation/observe_time.h"
+#include "vulp/spine/AgentInterface.h"
+#include "vulp/spine/StateMachine.h"
+#include "vulp/utils/SynchronousClock.h"
+#include "vulp/utils/handle_interrupts.h"
+#include "vulp/utils/realtime.h"
+
+Include dependency graph for Spine.h:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + + +

+Classes

class  vulp.spine::Spine
 Loop transmitting actions to the actuation and observations to the agent. More...
 
struct  vulp.spine::Spine::Parameters
 Spine parameters. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+ + + +

+Variables

constexpr size_t vulp.spine::kMebibytes = 1 << 20
 
+
+
+ + + + diff --git a/Spine_8h.js b/Spine_8h.js new file mode 100644 index 00000000..77f09ad3 --- /dev/null +++ b/Spine_8h.js @@ -0,0 +1,6 @@ +var Spine_8h = +[ + [ "Spine", "classvulp_1_1spine_1_1Spine.html", "classvulp_1_1spine_1_1Spine" ], + [ "Parameters", "structvulp_1_1spine_1_1Spine_1_1Parameters.html", "structvulp_1_1spine_1_1Spine_1_1Parameters" ], + [ "kMebibytes", "Spine_8h.html#a6c2c8dbd236f8d35e2ecac79f165fa29", null ] +]; \ No newline at end of file diff --git a/Spine_8h__dep__incl.map b/Spine_8h__dep__incl.map new file mode 100644 index 00000000..349d8b6d --- /dev/null +++ b/Spine_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/Spine_8h__dep__incl.md5 b/Spine_8h__dep__incl.md5 new file mode 100644 index 00000000..e82e473a --- /dev/null +++ b/Spine_8h__dep__incl.md5 @@ -0,0 +1 @@ +eea8878eb10293201fcf7fa39848c6c9 \ No newline at end of file diff --git a/Spine_8h__dep__incl.png b/Spine_8h__dep__incl.png new file mode 100644 index 00000000..e3752b5d Binary files /dev/null and b/Spine_8h__dep__incl.png differ diff --git a/Spine_8h__incl.map b/Spine_8h__incl.map new file mode 100644 index 00000000..3ee6f6b4 --- /dev/null +++ b/Spine_8h__incl.map @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Spine_8h__incl.md5 b/Spine_8h__incl.md5 new file mode 100644 index 00000000..cb148a92 --- /dev/null +++ b/Spine_8h__incl.md5 @@ -0,0 +1 @@ +dd2b8887a0b4bccbcb19e3a788725128 \ No newline at end of file diff --git a/Spine_8h__incl.png b/Spine_8h__incl.png new file mode 100644 index 00000000..e409ad15 Binary files /dev/null and b/Spine_8h__incl.png differ diff --git a/Spine_8h_source.html b/Spine_8h_source.html new file mode 100644 index 00000000..a64e98ef --- /dev/null +++ b/Spine_8h_source.html @@ -0,0 +1,232 @@ + + + + + + + +vulp: vulp/spine/Spine.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Spine.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <mpacklog/Logger.h>
+
7 
+
8 #include <algorithm>
+
9 #include <future>
+
10 #include <map>
+
11 #include <memory>
+
12 #include <string>
+
13 #include <vector>
+
14 
+ + + + + + + + +
23 #include "vulp/utils/realtime.h"
+
24 
+
25 namespace vulp::spine {
+
26 
+
27 constexpr size_t kMebibytes = 1 << 20;
+
28 
+
45 class Spine {
+
46  public:
+
48  struct Parameters {
+
50  int cpu = -1;
+
51 
+
53  unsigned frequency = 1000u;
+
54 
+
56  std::string log_path = "/dev/null";
+
57 
+
59  std::string shm_name = "/vulp";
+
60 
+
62  size_t shm_size = 1 * kMebibytes;
+
63  };
+
64 
+
72  Spine(const Parameters& params, actuation::Interface& interface,
+ +
74 
+
81  void reset(const palimpsest::Dictionary& config);
+
82 
+
92  void run();
+
93 
+
95  void cycle();
+
96 
+
114  void simulate(unsigned nb_substeps);
+
115 
+
116  private:
+
118  void begin_cycle();
+
119 
+
129  void cycle_actuation();
+
130 
+
132  void end_cycle();
+
133 
+
135  void log_working_dict();
+
136 
+
137  protected:
+
139  const unsigned frequency_;
+
140 
+ +
147 
+ +
150 
+
152  std::future<actuation::moteus::Output> actuation_output_;
+
153 
+
155  std::vector<actuation::moteus::ServoReply> latest_replies_;
+
156 
+
158  palimpsest::Dictionary working_dict_;
+
159 
+ +
162 
+
164  mpacklog::Logger logger_;
+
165 
+
167  std::vector<char> ipc_buffer_;
+
168 
+
170  const bool& caught_interrupt_;
+
171 
+ +
174 
+ +
177 
+ +
180 };
+
181 
+
182 } // namespace vulp::spine
+ + + + + +
Base class for actuation interfaces.
Definition: Interface.h:24
+ +
Memory map to shared memory.
+
Loop transmitting actions to the actuation and observations to the agent.
Definition: Spine.h:45
+
mpacklog::Logger logger_
Logger for the working_dict_ produced at each cycle.
Definition: Spine.h:164
+
AgentInterface agent_interface_
Shared memory mapping for inter-process communication.
Definition: Spine.h:149
+
std::future< actuation::moteus::Output > actuation_output_
Future used to wait for moteus replies.
Definition: Spine.h:152
+
const unsigned frequency_
Frequency of the spine loop in [Hz].
Definition: Spine.h:139
+
void run()
Run the spine loop until termination.
Definition: Spine.cpp:80
+
State state_cycle_beginning_
State after the last Event::kCycleBeginning.
Definition: Spine.h:176
+
State state_cycle_end_
State after the last Event::kCycleEnd.
Definition: Spine.h:179
+
void reset(const palimpsest::Dictionary &config)
Reset the spine with a new configuration.
Definition: Spine.cpp:58
+
StateMachine state_machine_
Internal state machine.
Definition: Spine.h:173
+
observation::ObserverPipeline observer_pipeline_
Pipeline of observers, executed in that order.
Definition: Spine.h:161
+
void simulate(unsigned nb_substeps)
Alternative to run where the actuation interface is cycled a fixed number of times,...
Definition: Spine.cpp:102
+
std::vector< char > ipc_buffer_
Buffer used to serialize/deserialize dictionaries in IPC.
Definition: Spine.h:167
+
std::vector< actuation::moteus::ServoReply > latest_replies_
Latest servo replies. They are copied and thread-safe.
Definition: Spine.h:155
+
void cycle()
Spin one cycle of the spine loop.
Definition: Spine.cpp:96
+
const bool & caught_interrupt_
Boolean flag that becomes true when an interruption is caught.
Definition: Spine.h:170
+
actuation::Interface & actuation_
Interface that communicates with actuators.
Definition: Spine.h:146
+
palimpsest::Dictionary working_dict_
All data from observation to action goes to this dictionary.
Definition: Spine.h:158
+
Spine(const Parameters &params, actuation::Interface &interface, observation::ObserverPipeline &observers)
Initialize spine.
Definition: Spine.cpp:24
+
Spine state machine.
Definition: StateMachine.h:88
+ +
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
constexpr size_t kMebibytes
Definition: Spine.h:27
+
State
States of the state machine.
Definition: StateMachine.h:14
+ + + +
Spine parameters.
Definition: Spine.h:48
+
size_t shm_size
Size of the shared memory object in bytes.
Definition: Spine.h:62
+
std::string shm_name
Name of the shared memory object for inter-process communication.
Definition: Spine.h:59
+
unsigned frequency
Frequency of the spine loop in [Hz].
Definition: Spine.h:53
+
int cpu
CPUID for the spine thread (-1 to disable realtime).
Definition: Spine.h:50
+
std::string log_path
Path to output log file.
Definition: Spine.h:56
+
+
+ + + + diff --git a/StateMachine_8cpp.html b/StateMachine_8cpp.html new file mode 100644 index 00000000..1727f1c7 --- /dev/null +++ b/StateMachine_8cpp.html @@ -0,0 +1,137 @@ + + + + + + + +vulp: vulp/spine/StateMachine.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
StateMachine.cpp File Reference
+
+
+
#include "vulp/spine/StateMachine.h"
+#include <spdlog/spdlog.h>
+#include "vulp/utils/handle_interrupts.h"
+
+Include dependency graph for StateMachine.cpp:
+
+
+ + + + + + + + + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+
+
+ + + + diff --git a/StateMachine_8cpp__incl.map b/StateMachine_8cpp__incl.map new file mode 100644 index 00000000..f24b852a --- /dev/null +++ b/StateMachine_8cpp__incl.map @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/StateMachine_8cpp__incl.md5 b/StateMachine_8cpp__incl.md5 new file mode 100644 index 00000000..f4e1e782 --- /dev/null +++ b/StateMachine_8cpp__incl.md5 @@ -0,0 +1 @@ +8684239cbfb579ed46bcbf3d33601234 \ No newline at end of file diff --git a/StateMachine_8cpp__incl.png b/StateMachine_8cpp__incl.png new file mode 100644 index 00000000..4862ad13 Binary files /dev/null and b/StateMachine_8cpp__incl.png differ diff --git a/StateMachine_8cpp_source.html b/StateMachine_8cpp_source.html new file mode 100644 index 00000000..71f5a9e9 --- /dev/null +++ b/StateMachine_8cpp_source.html @@ -0,0 +1,294 @@ + + + + + + + +vulp: vulp/spine/StateMachine.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
StateMachine.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 #include <spdlog/spdlog.h>
+
7 
+ +
9 
+
10 namespace vulp::spine {
+
11 
+ +
13  : interface_(interface), state_(State::kSendStops), stop_cycles_(0u) {
+
14  enter_state(State::kSendStops); // sets request to Request::kNone
+
15 }
+
16 
+
17 void StateMachine::process_event(const Event& event) noexcept {
+
18  switch (event) {
+
19  case Event::kInterrupt:
+
20  if (state_ != State::kShutdown) {
+
21  enter_state(State::kShutdown);
+
22  }
+
23  break;
+ +
25  process_cycle_beginning();
+
26  break;
+
27  case Event::kCycleEnd:
+
28  process_cycle_end();
+
29  break;
+
30  default:
+
31  spdlog::error("Invalid event '{}', shutting down...", event);
+
32  enter_state(State::kShutdown);
+
33  break;
+
34  }
+
35 }
+
36 
+
37 void StateMachine::process_cycle_beginning() {
+
38  const Request request = interface_.request();
+
39  switch (state_) {
+
40  case State::kIdle:
+
41  switch (request) {
+
42  case Request::kNone:
+
43  break;
+ +
45  enter_state(State::kObserve);
+
46  break;
+
47  case Request::kAction:
+
48  enter_state(State::kAct);
+
49  break;
+
50  case Request::kStart:
+
51  spdlog::warn(
+
52  "Request::kStart is invalid from State::kIdle! Stop the spine "
+
53  "then start it again");
+
54  enter_state(State::kIdle); // reset request
+
55  break;
+
56  case Request::kStop:
+
57  spdlog::info("Stop requested by agent");
+
58  enter_state(State::kSendStops);
+
59  break;
+
60  default:
+
61  interface_.set_request(Request::kError);
+
62  break;
+
63  }
+
64  break;
+
65  case State::kReset:
+
66  spdlog::warn(
+
67  "Event::kCycleBeginning should not happen from State::kReset");
+
68  break;
+
69  case State::kObserve:
+
70  spdlog::warn(
+
71  "Event::kCycleBeginning should not happen from State::kObserve");
+
72  break;
+
73  case State::kAct:
+
74  spdlog::warn("Event::kCycleBeginning should not happen from State::kAct");
+
75  break;
+
76  case State::kSendStops:
+
77  switch (request) {
+
78  case Request::kNone:
+
79  break;
+ +
81  case Request::kAction:
+
82  interface_.set_request(Request::kError);
+
83  break;
+
84  case Request::kStart:
+
85  if (stop_cycles_ >= kNbStopCycles) {
+
86  enter_state(State::kReset);
+
87  }
+
88  break;
+
89  case Request::kStop:
+
90  enter_state(State::kSendStops);
+
91  break;
+
92  default:
+
93  interface_.set_request(Request::kError);
+
94  break;
+
95  }
+
96  break;
+
97  case State::kShutdown:
+
98  case State::kOver:
+
99  break;
+
100  default:
+
101  spdlog::error("Invalid FSM state '{}', shutting down...", state_);
+
102  enter_state(State::kShutdown);
+
103  break;
+
104  }
+
105 }
+
106 
+
107 void StateMachine::process_cycle_end() {
+
108  switch (state_) {
+
109  case State::kIdle:
+
110  break;
+
111  case State::kReset:
+
112  spdlog::info("Start requested by agent");
+
113  enter_state(State::kIdle);
+
114  break;
+
115  case State::kSendStops:
+
116  if (++stop_cycles_ <= kNbStopCycles) {
+
117  spdlog::info("Stop cycle {} / {}", stop_cycles_, kNbStopCycles);
+
118  }
+
119  break;
+
120  case State::kObserve:
+
121  enter_state(State::kIdle);
+
122  break;
+
123  case State::kAct:
+
124  enter_state(State::kIdle);
+
125  break;
+
126  case State::kShutdown:
+
127  if (++stop_cycles_ == kNbStopCycles) {
+
128  enter_state(State::kOver);
+
129  }
+
130  spdlog::info("Shutdown cycle {} / {}", stop_cycles_, kNbStopCycles);
+
131  break;
+
132  case State::kOver:
+
133  break;
+
134  default:
+
135  spdlog::error("Invalid FSM state '{}', shutting down...", state_);
+
136  enter_state(State::kShutdown);
+
137  break;
+
138  }
+
139 }
+
140 
+
141 void StateMachine::enter_state(const State& next_state) noexcept {
+
142  switch (next_state) {
+
143  case State::kIdle:
+
144  interface_.set_request(Request::kNone);
+
145  break;
+
146  case State::kReset:
+
147  case State::kObserve:
+
148  case State::kAct:
+
149  break;
+
150  case State::kSendStops:
+
151  case State::kShutdown:
+
152  interface_.set_request(Request::kNone);
+
153  stop_cycles_ = 0u;
+
154  break;
+
155  case State::kOver:
+
156  break;
+
157  default:
+
158  spdlog::error("Cannot go to state '{}', shutting down...",
+
159  state_name(state_));
+
160  return enter_state(State::kShutdown);
+
161  }
+
162  state_ = next_state;
+
163 }
+
164 
+
165 } // namespace vulp::spine
+ +
Memory map to shared memory.
+
void set_request(Request request)
Set current request in shared memory.
+
Request request() const
Get current request from shared memory.
+
void process_event(const Event &event) noexcept
Process a new event.
+
StateMachine(AgentInterface &interface) noexcept
Initialize state machine.
+
Flag set by the agent to request an operation from the spine.
Definition: request.py:10
+ + + + + + + +
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
constexpr unsigned kNbStopCycles
When sending stop cycles, send at least that many.
Definition: StateMachine.h:11
+
Event
Events that may trigger transitions between states.
Definition: StateMachine.h:25
+ + + +
State
States of the state machine.
Definition: StateMachine.h:14
+ + + + + + + +
constexpr const char * state_name(const State &state) noexcept
Name of a state.
Definition: StateMachine.h:35
+
+
+ + + + diff --git a/StateMachine_8h.html b/StateMachine_8h.html new file mode 100644 index 00000000..d572c611 --- /dev/null +++ b/StateMachine_8h.html @@ -0,0 +1,186 @@ + + + + + + + +vulp: vulp/spine/StateMachine.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
StateMachine.h File Reference
+
+
+
+Include dependency graph for StateMachine.h:
+
+
+ + + + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp.spine::StateMachine
 Spine state machine. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp.spine
 Inter-process communication protocol with the spine.
 
+ + + + + + + +

+Enumerations

enum class  vulp.spine::State : uint32_t {
+  vulp.spine::kSendStops = 0 +, vulp.spine::kReset = 1 +, vulp.spine::kIdle = 2 +, vulp.spine::kObserve = 3 +,
+  vulp.spine::kAct = 4 +, vulp.spine::kShutdown = 5 +, vulp.spine::kOver = 6 +
+ }
 States of the state machine. More...
 
enum class  vulp.spine::Event : uint32_t { vulp.spine::kCycleBeginning = 0 +, vulp.spine::kCycleEnd = 1 +, vulp.spine::kInterrupt = 2 + }
 Events that may trigger transitions between states. More...
 
+ + + + +

+Functions

constexpr const char * vulp.spine::state_name (const State &state) noexcept
 Name of a state. More...
 
+ + + + +

+Variables

constexpr unsigned vulp.spine::kNbStopCycles = 5
 When sending stop cycles, send at least that many. More...
 
+
+
+ + + + diff --git a/StateMachine_8h.js b/StateMachine_8h.js new file mode 100644 index 00000000..afe84585 --- /dev/null +++ b/StateMachine_8h.js @@ -0,0 +1,20 @@ +var StateMachine_8h = +[ + [ "StateMachine", "classvulp_1_1spine_1_1StateMachine.html", "classvulp_1_1spine_1_1StateMachine" ], + [ "Event", "StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431", [ + [ "kCycleBeginning", "StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b", null ], + [ "kCycleEnd", "StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16", null ], + [ "kInterrupt", "StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae", null ] + ] ], + [ "State", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673b", [ + [ "kSendStops", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe", null ], + [ "kReset", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b", null ], + [ "kIdle", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b", null ], + [ "kObserve", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94", null ], + [ "kAct", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb", null ], + [ "kShutdown", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb", null ], + [ "kOver", "StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961", null ] + ] ], + [ "state_name", "StateMachine_8h.html#afe7d438605444b816b7d2fb170c87240", null ], + [ "kNbStopCycles", "StateMachine_8h.html#a5bc778508b13f1e9e7dd227025a32808", null ] +]; \ No newline at end of file diff --git a/StateMachine_8h__dep__incl.map b/StateMachine_8h__dep__incl.map new file mode 100644 index 00000000..3105e341 --- /dev/null +++ b/StateMachine_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/StateMachine_8h__dep__incl.md5 b/StateMachine_8h__dep__incl.md5 new file mode 100644 index 00000000..80ad0a1f --- /dev/null +++ b/StateMachine_8h__dep__incl.md5 @@ -0,0 +1 @@ +1d94826cae08d08087df497e1093c905 \ No newline at end of file diff --git a/StateMachine_8h__dep__incl.png b/StateMachine_8h__dep__incl.png new file mode 100644 index 00000000..6f56002e Binary files /dev/null and b/StateMachine_8h__dep__incl.png differ diff --git a/StateMachine_8h__incl.map b/StateMachine_8h__incl.map new file mode 100644 index 00000000..916b3f9e --- /dev/null +++ b/StateMachine_8h__incl.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/StateMachine_8h__incl.md5 b/StateMachine_8h__incl.md5 new file mode 100644 index 00000000..efca8608 --- /dev/null +++ b/StateMachine_8h__incl.md5 @@ -0,0 +1 @@ +c77328cd034e07a3553b36fc5900e5a6 \ No newline at end of file diff --git a/StateMachine_8h__incl.png b/StateMachine_8h__incl.png new file mode 100644 index 00000000..bf1fdef3 Binary files /dev/null and b/StateMachine_8h__incl.png differ diff --git a/StateMachine_8h_source.html b/StateMachine_8h_source.html new file mode 100644 index 00000000..14ee6ab3 --- /dev/null +++ b/StateMachine_8h_source.html @@ -0,0 +1,199 @@ + + + + + + + +vulp: vulp/spine/StateMachine.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
StateMachine.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+ +
7 
+
8 namespace vulp::spine {
+
9 
+
11 constexpr unsigned kNbStopCycles = 5;
+
12 
+
14 enum class State : uint32_t {
+
15  kSendStops = 0,
+
16  kReset = 1,
+
17  kIdle = 2,
+
18  kObserve = 3,
+
19  kAct = 4,
+
20  kShutdown = 5,
+
21  kOver = 6
+
22 };
+
23 
+
25 enum class Event : uint32_t {
+
26  kCycleBeginning = 0,
+
27  kCycleEnd = 1,
+
28  kInterrupt = 2,
+
29 };
+
30 
+
35 constexpr const char* state_name(const State& state) noexcept {
+
36  switch (state) {
+
37  case State::kSendStops:
+
38  return "State::kSendStops";
+
39  case State::kReset:
+
40  return "State::kReset";
+
41  case State::kIdle:
+
42  return "State::kIdle";
+
43  case State::kObserve:
+
44  return "State::kObserve";
+
45  case State::kAct:
+
46  return "State::kAct";
+
47  case State::kShutdown:
+
48  return "State::kShutdown";
+
49  case State::kOver:
+
50  return "State::kOver";
+
51  default:
+
52  break;
+
53  }
+
54  return "?";
+
55 }
+
56 
+
88 class StateMachine {
+
89  public:
+
94  explicit StateMachine(AgentInterface& interface) noexcept;
+
95 
+
100  void process_event(const Event& event) noexcept;
+
101 
+
103  const State& state() const noexcept { return state_; }
+
104 
+
106  bool is_over_after_this_cycle() const noexcept {
+
107  return (state_ == State::kShutdown && stop_cycles_ + 1u == kNbStopCycles);
+
108  }
+
109 
+
110  private:
+
115  void enter_state(const State& next_state) noexcept;
+
116 
+
118  void process_cycle_beginning();
+
119 
+
121  void process_cycle_end();
+
122 
+
123  private:
+
125  AgentInterface& interface_;
+
126 
+
128  State state_;
+
129 
+
131  unsigned stop_cycles_;
+
132 };
+
133 
+
134 } // namespace vulp::spine
+ +
Memory map to shared memory.
+
Spine state machine.
Definition: StateMachine.h:88
+
void process_event(const Event &event) noexcept
Process a new event.
+
StateMachine(AgentInterface &interface) noexcept
Initialize state machine.
+
const State & state() const noexcept
Get current state.
Definition: StateMachine.h:103
+
bool is_over_after_this_cycle() const noexcept
Whether we transition to the terminal state at the next end-cycle event.
Definition: StateMachine.h:106
+
Inter-process communication protocol with the spine.
Definition: __init__.py:1
+
constexpr unsigned kNbStopCycles
When sending stop cycles, send at least that many.
Definition: StateMachine.h:11
+
Event
Events that may trigger transitions between states.
Definition: StateMachine.h:25
+ + + +
State
States of the state machine.
Definition: StateMachine.h:14
+ + + + + + + +
constexpr const char * state_name(const State &state) noexcept
Name of a state.
Definition: StateMachine.h:35
+
+
+ + + + diff --git a/SynchronousClock_8cpp.html b/SynchronousClock_8cpp.html new file mode 100644 index 00000000..6a65fa7a --- /dev/null +++ b/SynchronousClock_8cpp.html @@ -0,0 +1,130 @@ + + + + + + + +vulp: vulp/utils/SynchronousClock.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
SynchronousClock.cpp File Reference
+
+
+
#include "vulp/utils/SynchronousClock.h"
+#include <thread>
+#include "vulp/utils/math.h"
+
+Include dependency graph for SynchronousClock.cpp:
+
+
+ + + + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
+
+
+ + + + diff --git a/SynchronousClock_8cpp__incl.map b/SynchronousClock_8cpp__incl.map new file mode 100644 index 00000000..f720599c --- /dev/null +++ b/SynchronousClock_8cpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/SynchronousClock_8cpp__incl.md5 b/SynchronousClock_8cpp__incl.md5 new file mode 100644 index 00000000..63005a86 --- /dev/null +++ b/SynchronousClock_8cpp__incl.md5 @@ -0,0 +1 @@ +fadb94e5a25e618a0c265f28005d4160 \ No newline at end of file diff --git a/SynchronousClock_8cpp__incl.png b/SynchronousClock_8cpp__incl.png new file mode 100644 index 00000000..43b8c5ee Binary files /dev/null and b/SynchronousClock_8cpp__incl.png differ diff --git a/SynchronousClock_8cpp_source.html b/SynchronousClock_8cpp_source.html new file mode 100644 index 00000000..e2adcbed --- /dev/null +++ b/SynchronousClock_8cpp_source.html @@ -0,0 +1,169 @@ + + + + + + + +vulp: vulp/utils/SynchronousClock.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
SynchronousClock.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 /*
+
4  * This file incorporates work covered by the following copyright and
+
5  * permission notice:
+
6  *
+
7  * moteus_control_example.cc from github.com:mjbots/pi3hat
+
8  * SPDX-License-Identifier: Apache-2.0
+
9  * Copyright 2020 Josh Pieper, jjp@pobox.com.
+
10  */
+
11 
+ +
13 
+
14 #include <thread>
+
15 
+
16 #include "vulp/utils/math.h"
+
17 
+
18 namespace vulp::utils {
+
19 
+ +
21  : period_us_(microseconds(static_cast<int64_t>(1e6 / frequency))),
+
22  measured_period_(1.0 / frequency),
+
23  skip_count_(0),
+
24  slack_(0.0) {
+
25  assert(math::divides(1000000u, static_cast<unsigned>(frequency)));
+
26  last_call_time_ = std::chrono::steady_clock::now();
+
27  measured_period_ = 1. / frequency;
+
28  next_tick_ = std::chrono::steady_clock::now() + period_us_;
+
29 }
+
30 
+
31 void SynchronousClock::measure_period(
+
32  const std::chrono::time_point<std::chrono::steady_clock>& call_time) {
+
33  const auto measured_period = call_time - last_call_time_;
+
34  measured_period_ =
+
35  std::chrono::duration_cast<microseconds>(measured_period).count() / 1e6;
+
36  last_call_time_ = call_time;
+
37 }
+
38 
+ +
40  const auto call_time = std::chrono::steady_clock::now();
+
41  const double duration_tick_to_call_us =
+
42  std::chrono::duration_cast<microseconds>(call_time - next_tick_).count();
+
43  skip_count_ = std::ceil(duration_tick_to_call_us / period_us_.count());
+
44  if (skip_count_ > 0) {
+
45  next_tick_ += skip_count_ * period_us_;
+
46  }
+
47  std::this_thread::sleep_until(next_tick_);
+
48  if (skip_count_ > 0) {
+
49  spdlog::warn("Skipped {} clock cycles", skip_count_);
+
50  slack_ = 0.0;
+
51  } else {
+
52  const auto wakeup_time = std::chrono::steady_clock::now();
+
53  const auto sleep_duration = wakeup_time - call_time;
+
54  const double duration_call_to_wakeup_us =
+
55  std::chrono::duration_cast<microseconds>(sleep_duration).count();
+
56  slack_ = duration_call_to_wakeup_us / 1e6;
+
57  }
+
58  next_tick_ += period_us_;
+
59  measure_period(call_time);
+
60 }
+
61 
+
62 } // namespace vulp::utils
+ +
double measured_period() const noexcept
Get measured period in seconds.
+
SynchronousClock(double frequency)
Initialize clock.
+
void wait_for_next_tick()
Wait until the next tick of the internal clock.
+ +
bool divides(uint32_t number, uint32_t divisor)
True if and only if divisor divides number.
Definition: math.h:15
+
Utility functions.
Definition: __init__.py:1
+
+
+ + + + diff --git a/SynchronousClock_8h.html b/SynchronousClock_8h.html new file mode 100644 index 00000000..da22dc37 --- /dev/null +++ b/SynchronousClock_8h.html @@ -0,0 +1,143 @@ + + + + + + + +vulp: vulp/utils/SynchronousClock.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
SynchronousClock.h File Reference
+
+
+
#include <spdlog/spdlog.h>
+#include <chrono>
+
+Include dependency graph for SynchronousClock.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + +

+Classes

class  vulp.utils::SynchronousClock
 Synchronous (blocking) clock. More...
 
+ + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
+
+
+ + + + diff --git a/SynchronousClock_8h__dep__incl.map b/SynchronousClock_8h__dep__incl.map new file mode 100644 index 00000000..24267681 --- /dev/null +++ b/SynchronousClock_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/SynchronousClock_8h__dep__incl.md5 b/SynchronousClock_8h__dep__incl.md5 new file mode 100644 index 00000000..63071efd --- /dev/null +++ b/SynchronousClock_8h__dep__incl.md5 @@ -0,0 +1 @@ +f1befdc0aeb6f850ebcc043d18e3215f \ No newline at end of file diff --git a/SynchronousClock_8h__dep__incl.png b/SynchronousClock_8h__dep__incl.png new file mode 100644 index 00000000..729e8879 Binary files /dev/null and b/SynchronousClock_8h__dep__incl.png differ diff --git a/SynchronousClock_8h__incl.map b/SynchronousClock_8h__incl.map new file mode 100644 index 00000000..0b9476bb --- /dev/null +++ b/SynchronousClock_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/SynchronousClock_8h__incl.md5 b/SynchronousClock_8h__incl.md5 new file mode 100644 index 00000000..c6f228c4 --- /dev/null +++ b/SynchronousClock_8h__incl.md5 @@ -0,0 +1 @@ +f1b0f120631a41dd3a7ca1c6b5394b4c \ No newline at end of file diff --git a/SynchronousClock_8h__incl.png b/SynchronousClock_8h__incl.png new file mode 100644 index 00000000..2138798a Binary files /dev/null and b/SynchronousClock_8h__incl.png differ diff --git a/SynchronousClock_8h_source.html b/SynchronousClock_8h_source.html new file mode 100644 index 00000000..9e250a06 --- /dev/null +++ b/SynchronousClock_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +vulp: vulp/utils/SynchronousClock.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
SynchronousClock.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <spdlog/spdlog.h>
+
7 
+
8 #include <chrono>
+
9 
+
10 namespace vulp::utils {
+
11 
+ +
27  using microseconds = std::chrono::microseconds;
+
28 
+
29  public:
+
35  explicit SynchronousClock(double frequency);
+
36 
+
42  void wait_for_next_tick();
+
43 
+
45  double measured_period() const noexcept { return measured_period_; }
+
46 
+
48  int skip_count() const noexcept { return skip_count_; }
+
49 
+
51  double slack() const noexcept { return slack_; }
+
52 
+
53  private:
+
58  void measure_period(
+
59  const std::chrono::time_point<std::chrono::steady_clock>& call_time);
+
60 
+
61  private:
+
63  const microseconds period_us_;
+
64 
+
66  std::chrono::time_point<std::chrono::steady_clock> next_tick_;
+
67 
+
69  std::chrono::time_point<std::chrono::steady_clock> last_call_time_;
+
70 
+
72  double measured_period_;
+
73 
+
75  int skip_count_;
+
76 
+
78  double slack_;
+
79 };
+
80 
+
81 } // namespace vulp::utils
+
Synchronous (blocking) clock.
+
double measured_period() const noexcept
Get measured period in seconds.
+
int skip_count() const noexcept
Get last number of clock cycles skipped.
+
SynchronousClock(double frequency)
Initialize clock.
+
void wait_for_next_tick()
Wait until the next tick of the internal clock.
+
double slack() const noexcept
Get the last sleep duration duration in seconds.
+
Utility functions.
Definition: __init__.py:1
+
+
+ + + + diff --git a/_formulas.tex b/_formulas.tex new file mode 100644 index 00000000..9de19548 --- /dev/null +++ b/_formulas.tex @@ -0,0 +1,24 @@ +\documentclass{article} +\usepackage{ifthen} +\usepackage{epsfig} +\usepackage[utf8]{inputenc} +\usepackage{newunicodechar} + \newunicodechar{⁻}{${}^{-}$}% Superscript minus + \newunicodechar{²}{${}^{2}$}% Superscript two + \newunicodechar{³}{${}^{3}$}% Superscript three + +\pagestyle{empty} +\begin{document} +$ {}_B \omega_{WB} $ +\pagebreak + +$ B $ +\pagebreak + +$ W $ +\pagebreak + +$ {}_B a $ +\pagebreak + +\end{document} diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..575e6ec9 --- /dev/null +++ b/annotated.html @@ -0,0 +1,141 @@ + + + + + + + +vulp: Class List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 1234]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Nvulp
 NactuationSend actions to actuators or simulators
 CBulletContactDataContact information for a single link
 CBulletImuData
 CBulletInterfaceActuation interface for the Bullet simulator
 CParametersInterface parameters
 CBulletJointPropertiesProperties for robot joints in the Bullet simulation
 CImuDataData filtered from an onboard IMU such as the pi3hat's
 CInterfaceBase class for actuation interfaces
 CMockInterface
 CPi3HatInterfaceInterface to moteus controllers
 CServoLayoutMap between servos, their busses and the joints they actuate
 NcontrolWIP: Process higher-level actions down to joint commands
 CControllerBase class for controllers
 NobservationState observation
 Nsources
 CCpuTemperatureSource for CPU temperature readings
 CJoystickSource for a joystick controller
 CKeyboardSource for reading Keyboard inputs
 CHistoryObserverReport high-frequency history vectors to lower-frequency agents
 CObserverBase class for observers
 CObserverPipelineObserver pipeline
 CSourceBase class for sources
 NspineInter-process communication protocol with the spine
 Nexceptions
 CVulpExceptionBase class for exceptions raised by Vulp
 CPerformanceIssueException raised when a performance issue is detected
 CSpineErrorException raised when the spine sets an error flag in the request field of the shared memory map
 Nrequest
 CRequestFlag set by the agent to request an operation from the spine
 Nspine_interface
 CSpineInterfaceInterface to interact with a spine from a Python agent
 CAgentInterfaceMemory map to shared memory
 CSpineLoop transmitting actions to the actuation and observations to the agent
 CParametersSpine parameters
 CStateMachineSpine state machine
 NutilsUtility functions
 CSynchronousClockSynchronous (blocking) clock
+
+
+
+ + + + diff --git a/annotated_dup.js b/annotated_dup.js new file mode 100644 index 00000000..63fbdf8d --- /dev/null +++ b/annotated_dup.js @@ -0,0 +1,49 @@ +var annotated_dup = +[ + [ "vulp", "namespacevulp.html", [ + [ "actuation", "namespacevulp_1_1actuation.html", [ + [ "BulletContactData", "structvulp_1_1actuation_1_1BulletContactData.html", "structvulp_1_1actuation_1_1BulletContactData" ], + [ "BulletImuData", "structvulp_1_1actuation_1_1BulletImuData.html", "structvulp_1_1actuation_1_1BulletImuData" ], + [ "BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html", "classvulp_1_1actuation_1_1BulletInterface" ], + [ "BulletJointProperties", "structvulp_1_1actuation_1_1BulletJointProperties.html", "structvulp_1_1actuation_1_1BulletJointProperties" ], + [ "ImuData", "structvulp_1_1actuation_1_1ImuData.html", "structvulp_1_1actuation_1_1ImuData" ], + [ "Interface", "classvulp_1_1actuation_1_1Interface.html", "classvulp_1_1actuation_1_1Interface" ], + [ "MockInterface", "classvulp_1_1actuation_1_1MockInterface.html", "classvulp_1_1actuation_1_1MockInterface" ], + [ "Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html", "classvulp_1_1actuation_1_1Pi3HatInterface" ], + [ "ServoLayout", "classvulp_1_1actuation_1_1ServoLayout.html", "classvulp_1_1actuation_1_1ServoLayout" ] + ] ], + [ "control", "namespacevulp_1_1control.html", [ + [ "Controller", "classvulp_1_1control_1_1Controller.html", "classvulp_1_1control_1_1Controller" ] + ] ], + [ "observation", "namespacevulp_1_1observation.html", [ + [ "sources", "namespacevulp_1_1observation_1_1sources.html", [ + [ "CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html", "classvulp_1_1observation_1_1sources_1_1CpuTemperature" ], + [ "Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html", "classvulp_1_1observation_1_1sources_1_1Joystick" ], + [ "Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html", "classvulp_1_1observation_1_1sources_1_1Keyboard" ] + ] ], + [ "HistoryObserver", "classvulp_1_1observation_1_1HistoryObserver.html", "classvulp_1_1observation_1_1HistoryObserver" ], + [ "Observer", "classvulp_1_1observation_1_1Observer.html", "classvulp_1_1observation_1_1Observer" ], + [ "ObserverPipeline", "classvulp_1_1observation_1_1ObserverPipeline.html", "classvulp_1_1observation_1_1ObserverPipeline" ], + [ "Source", "classvulp_1_1observation_1_1Source.html", "classvulp_1_1observation_1_1Source" ] + ] ], + [ "spine", "namespacevulp_1_1spine.html", [ + [ "exceptions", "namespacevulp_1_1spine_1_1exceptions.html", [ + [ "VulpException", "classvulp_1_1spine_1_1exceptions_1_1VulpException.html", null ], + [ "PerformanceIssue", "classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html", null ], + [ "SpineError", "classvulp_1_1spine_1_1exceptions_1_1SpineError.html", null ] + ] ], + [ "request", "namespacevulp_1_1spine_1_1request.html", [ + [ "Request", "classvulp_1_1spine_1_1request_1_1Request.html", null ] + ] ], + [ "spine_interface", "namespacevulp_1_1spine_1_1spine__interface.html", [ + [ "SpineInterface", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface" ] + ] ], + [ "AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html", "classvulp_1_1spine_1_1AgentInterface" ], + [ "Spine", "classvulp_1_1spine_1_1Spine.html", "classvulp_1_1spine_1_1Spine" ], + [ "StateMachine", "classvulp_1_1spine_1_1StateMachine.html", "classvulp_1_1spine_1_1StateMachine" ] + ] ], + [ "utils", "namespacevulp_1_1utils.html", [ + [ "SynchronousClock", "classvulp_1_1utils_1_1SynchronousClock.html", "classvulp_1_1utils_1_1SynchronousClock" ] + ] ] + ] ] +]; \ No newline at end of file diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/bc_s.png differ diff --git a/bdwn.png b/bdwn.png new file mode 100644 index 00000000..940a0b95 Binary files /dev/null and b/bdwn.png differ diff --git a/bullet__utils_8h.html b/bullet__utils_8h.html new file mode 100644 index 00000000..e754a505 --- /dev/null +++ b/bullet__utils_8h.html @@ -0,0 +1,163 @@ + + + + + + + +vulp: vulp/actuation/bullet_utils.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
bullet_utils.h File Reference
+
+
+
#include <spdlog/spdlog.h>
+#include <string>
+#include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+#include "vulp/actuation/BulletImuData.h"
+
+Include dependency graph for bullet_utils.h:
+
+
+ + + + + + + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
+ + + + + + + + + + + + + + + + + + + +

+Functions

btQuaternion vulp::actuation::bullet_from_eigen (const Eigen::Quaterniond &quat)
 Convert an Eigen quaternion to a Bullet one. More...
 
btVector3 vulp::actuation::bullet_from_eigen (const Eigen::Vector3d &v)
 Convert an Eigen vector to a Bullet one. More...
 
Eigen::Quaterniond vulp::actuation::eigen_from_bullet (const btQuaternion &quat)
 Convert a Bullet quaternion to an Eigen one. More...
 
Eigen::Vector3d vulp::actuation::eigen_from_bullet (const btVector3 &v)
 Convert a Bullet vector to an Eigen one. More...
 
int vulp::actuation::find_link_index (b3RobotSimulatorClientAPI &bullet, int robot, const std::string &link_name) noexcept
 Find the index of a link. More...
 
void vulp::actuation::read_imu_data (BulletImuData &imu_data, b3RobotSimulatorClientAPI &bullet, int robot, const int imu_link_index, double dt)
 Compute IMU readings from the IMU link state. More...
 
+
+
+ + + + diff --git a/bullet__utils_8h.js b/bullet__utils_8h.js new file mode 100644 index 00000000..7431a8af --- /dev/null +++ b/bullet__utils_8h.js @@ -0,0 +1,9 @@ +var bullet__utils_8h = +[ + [ "bullet_from_eigen", "bullet__utils_8h.html#ac2af057ce6d42297f974e1386b1b34b3", null ], + [ "bullet_from_eigen", "bullet__utils_8h.html#a225ab1b9ea7b3dd97f298768e432246a", null ], + [ "eigen_from_bullet", "bullet__utils_8h.html#a57658aadbd0ec10129a9692fe4c281f4", null ], + [ "eigen_from_bullet", "bullet__utils_8h.html#a3b0ac5d01ef820488834702e962bc765", null ], + [ "find_link_index", "bullet__utils_8h.html#ae3bf38e32e44b3a353850acb05bbd81a", null ], + [ "read_imu_data", "bullet__utils_8h.html#a17c7faa08c40ba9298774b4da1c86edb", null ] +]; \ No newline at end of file diff --git a/bullet__utils_8h__dep__incl.map b/bullet__utils_8h__dep__incl.map new file mode 100644 index 00000000..e09c25f9 --- /dev/null +++ b/bullet__utils_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/bullet__utils_8h__dep__incl.md5 b/bullet__utils_8h__dep__incl.md5 new file mode 100644 index 00000000..d9b317a7 --- /dev/null +++ b/bullet__utils_8h__dep__incl.md5 @@ -0,0 +1 @@ +b47440bca6d5f833859627b3f09ff0d0 \ No newline at end of file diff --git a/bullet__utils_8h__dep__incl.png b/bullet__utils_8h__dep__incl.png new file mode 100644 index 00000000..07c0a361 Binary files /dev/null and b/bullet__utils_8h__dep__incl.png differ diff --git a/bullet__utils_8h__incl.map b/bullet__utils_8h__incl.map new file mode 100644 index 00000000..31a3b0ba --- /dev/null +++ b/bullet__utils_8h__incl.map @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/bullet__utils_8h__incl.md5 b/bullet__utils_8h__incl.md5 new file mode 100644 index 00000000..47f0c4e7 --- /dev/null +++ b/bullet__utils_8h__incl.md5 @@ -0,0 +1 @@ +3de471a832e4b344792f41f3527fd51d \ No newline at end of file diff --git a/bullet__utils_8h__incl.png b/bullet__utils_8h__incl.png new file mode 100644 index 00000000..73dcfb15 Binary files /dev/null and b/bullet__utils_8h__incl.png differ diff --git a/bullet__utils_8h_source.html b/bullet__utils_8h_source.html new file mode 100644 index 00000000..c9093e6f --- /dev/null +++ b/bullet__utils_8h_source.html @@ -0,0 +1,212 @@ + + + + + + + +vulp: vulp/actuation/bullet_utils.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
bullet_utils.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <spdlog/spdlog.h>
+
7 
+
8 #include <string>
+
9 
+
10 #include "RobotSimulator/b3RobotSimulatorClientAPI.h"
+ +
12 
+
13 namespace vulp::actuation {
+
14 
+
21 inline btQuaternion bullet_from_eigen(const Eigen::Quaterniond& quat) {
+
22  return btQuaternion(quat.x(), quat.y(), quat.z(), quat.w());
+
23 }
+
24 
+
31 inline btVector3 bullet_from_eigen(const Eigen::Vector3d& v) {
+
32  return btVector3(v.x(), v.y(), v.z());
+
33 }
+
34 
+
41 inline Eigen::Quaterniond eigen_from_bullet(const btQuaternion& quat) {
+
42  return Eigen::Quaterniond(quat.getW(), quat.getX(), quat.getY(), quat.getZ());
+
43 }
+
44 
+
51 inline Eigen::Vector3d eigen_from_bullet(const btVector3& v) {
+
52  return Eigen::Vector3d(v.getX(), v.getY(), v.getZ());
+
53 }
+
54 
+
63 inline int find_link_index(b3RobotSimulatorClientAPI& bullet, int robot,
+
64  const std::string& link_name) noexcept {
+
65  b3JointInfo joint_info;
+
66  int nb_joints = bullet.getNumJoints(robot);
+
67  for (int joint_index = 0; joint_index < nb_joints; ++joint_index) {
+
68  bullet.getJointInfo(robot, joint_index, &joint_info);
+
69  if (std::string(joint_info.m_linkName) == link_name) {
+
70  return joint_index; // link and joint indices are the same in Bullet
+
71  }
+
72  }
+
73  return -1;
+
74 }
+
75 
+
84 inline void read_imu_data(BulletImuData& imu_data,
+
85  b3RobotSimulatorClientAPI& bullet, int robot,
+
86  const int imu_link_index, double dt) {
+
87  b3LinkState link_state;
+
88  bullet.getLinkState(robot, imu_link_index, /* computeVelocity = */ true,
+
89  /* computeForwardKinematics = */ true, &link_state);
+
90 
+
91  Eigen::Quaterniond orientation_imu_in_world;
+
92  orientation_imu_in_world.w() = link_state.m_worldLinkFrameOrientation[3];
+
93  orientation_imu_in_world.x() = link_state.m_worldLinkFrameOrientation[0];
+
94  orientation_imu_in_world.y() = link_state.m_worldLinkFrameOrientation[1];
+
95  orientation_imu_in_world.z() = link_state.m_worldLinkFrameOrientation[2];
+
96 
+
97  // The attitude reference system frame has +x forward, +y right and +z down,
+
98  // whereas our world frame has +x forward, +y left and +z up:
+
99  // https://github.com/mjbots/pi3hat/blob/master/docs/reference.md#orientation
+
100  Eigen::Matrix3d rotation_world_to_ars =
+
101  Eigen::Vector3d{1.0, -1.0, -1.0}.asDiagonal();
+
102 
+
103  Eigen::Matrix3d rotation_imu_to_world =
+
104  orientation_imu_in_world.toRotationMatrix();
+
105  Eigen::Matrix3d rotation_imu_to_ars =
+
106  rotation_world_to_ars * rotation_imu_to_world;
+
107  Eigen::Quaterniond orientation_imu_in_ars(rotation_imu_to_ars);
+
108 
+
109  Eigen::Vector3d linear_velocity_imu_in_world = {
+
110  link_state.m_worldLinearVelocity[0],
+
111  link_state.m_worldLinearVelocity[1],
+
112  link_state.m_worldLinearVelocity[2],
+
113  };
+
114 
+
115  Eigen::Vector3d angular_velocity_imu_to_world_in_world = {
+
116  link_state.m_worldAngularVelocity[0],
+
117  link_state.m_worldAngularVelocity[1],
+
118  link_state.m_worldAngularVelocity[2],
+
119  };
+
120 
+
121  // Compute linear acceleration in the world frame by discrete differentiation
+
122  const auto& previous_linear_velocity = imu_data.linear_velocity_imu_in_world;
+
123  Eigen::Vector3d linear_acceleration_imu_in_world =
+
124  (linear_velocity_imu_in_world - previous_linear_velocity) / dt;
+
125 
+
126  auto rotation_world_to_imu = orientation_imu_in_world.normalized().inverse();
+
127  Eigen::Vector3d angular_velocity_imu_in_imu =
+
128  rotation_world_to_imu * angular_velocity_imu_to_world_in_world;
+
129  Eigen::Vector3d linear_acceleration_imu_in_imu =
+
130  rotation_world_to_imu * linear_acceleration_imu_in_world;
+
131 
+
132  // Fill out regular IMU data
+
133  imu_data.orientation_imu_in_ars = orientation_imu_in_ars;
+
134  imu_data.angular_velocity_imu_in_imu = angular_velocity_imu_in_imu;
+
135  imu_data.linear_acceleration_imu_in_imu = linear_acceleration_imu_in_imu;
+
136 
+
137  // ... and the extra field for the Bullet interface
+
138  imu_data.linear_velocity_imu_in_world = linear_velocity_imu_in_world;
+
139 }
+
140 
+
141 } // namespace vulp::actuation
+ +
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
void read_imu_data(BulletImuData &imu_data, b3RobotSimulatorClientAPI &bullet, int robot, const int imu_link_index, double dt)
Compute IMU readings from the IMU link state.
Definition: bullet_utils.h:84
+
Eigen::Quaterniond eigen_from_bullet(const btQuaternion &quat)
Convert a Bullet quaternion to an Eigen one.
Definition: bullet_utils.h:41
+
btQuaternion bullet_from_eigen(const Eigen::Quaterniond &quat)
Convert an Eigen quaternion to a Bullet one.
Definition: bullet_utils.h:21
+
int find_link_index(b3RobotSimulatorClientAPI &bullet, int robot, const std::string &link_name) noexcept
Find the index of a link.
Definition: bullet_utils.h:63
+ +
Eigen::Vector3d linear_velocity_imu_in_world
Spatial linear velocity in [m] / [s]², used to compute the acceleration.
Definition: BulletImuData.h:15
+
Eigen::Quaterniond orientation_imu_in_ars
Orientation from the IMU frame to the attitude reference system (ARS) frame.
Definition: ImuData.h:20
+
Eigen::Vector3d linear_acceleration_imu_in_imu
Body linear acceleration of the IMU, in [m] / [s]².
Definition: ImuData.h:39
+
Eigen::Vector3d angular_velocity_imu_in_imu
Body angular velocity of the IMU frame in [rad] / [s].
Definition: ImuData.h:30
+
+
+ + + + diff --git a/classes.html b/classes.html new file mode 100644 index 00000000..4e0b9746 --- /dev/null +++ b/classes.html @@ -0,0 +1,141 @@ + + + + + + + +vulp: Class Index + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
A | B | C | H | I | J | K | M | O | P | R | S | V
+ +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1BulletInterface-members.html b/classvulp_1_1actuation_1_1BulletInterface-members.html new file mode 100644 index 00000000..65a68660 --- /dev/null +++ b/classvulp_1_1actuation_1_1BulletInterface-members.html @@ -0,0 +1,128 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::actuation::BulletInterface Member List
+
+
+ +

This is the complete list of members for vulp::actuation::BulletInterface, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
angular_velocity_base_in_base() const noexceptvulp::actuation::BulletInterface
BulletInterface(const ServoLayout &layout, const Parameters &params)vulp::actuation::BulletInterface
commands()vulp::actuation::Interfaceinline
compute_joint_torque(const std::string &joint_name, const double feedforward_torque, const double target_position, const double target_velocity, const double kp_scale, const double kd_scale, const double maximum_torque)vulp::actuation::BulletInterface
cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) finalvulp::actuation::BulletInterfacevirtual
data()vulp::actuation::Interfaceinline
initialize_action(Dictionary &action)vulp::actuation::Interface
Interface(const ServoLayout &servo_layout)vulp::actuation::Interfaceinlineexplicit
joint_properties()vulp::actuation::BulletInterfaceinline
linear_velocity_base_to_world_in_world() const noexceptvulp::actuation::BulletInterface
observe(Dictionary &observation) const overridevulp::actuation::BulletInterfacevirtual
replies() constvulp::actuation::Interfaceinline
reset(const Dictionary &config) overridevulp::actuation::BulletInterfacevirtual
reset_base_state(const Eigen::Vector3d &position_base_in_world, const Eigen::Quaterniond &orientation_base_in_world, const Eigen::Vector3d &linear_velocity_base_to_world_in_world, const Eigen::Vector3d &angular_velocity_base_in_base)vulp::actuation::BulletInterface
reset_contact_data()vulp::actuation::BulletInterface
reset_joint_angles()vulp::actuation::BulletInterface
reset_joint_properties()vulp::actuation::BulletInterface
servo_bus_map() const noexceptvulp::actuation::Interfaceinline
servo_joint_map() const noexceptvulp::actuation::Interfaceinline
servo_layout() const noexceptvulp::actuation::Interfaceinline
servo_reply()vulp::actuation::BulletInterfaceinline
transform_base_to_world() const noexceptvulp::actuation::BulletInterface
write_position_commands(const Dictionary &action)vulp::actuation::Interface
write_stop_commands() noexceptvulp::actuation::Interfaceinline
~BulletInterface()vulp::actuation::BulletInterface
~Interface()=defaultvulp::actuation::Interfacevirtual
+
+ + + + diff --git a/classvulp_1_1actuation_1_1BulletInterface.html b/classvulp_1_1actuation_1_1BulletInterface.html new file mode 100644 index 00000000..9b7a1e20 --- /dev/null +++ b/classvulp_1_1actuation_1_1BulletInterface.html @@ -0,0 +1,737 @@ + + + + + + + +vulp: vulp::actuation::BulletInterface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::actuation::BulletInterface Class Reference
+
+
+ +

Actuation interface for the Bullet simulator. + More...

+ +

#include <BulletInterface.h>

+ + + + + +

+Classes

struct  Parameters
 Interface parameters. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 BulletInterface (const ServoLayout &layout, const Parameters &params)
 Initialize interface. More...
 
 ~BulletInterface ()
 Disconnect interface. More...
 
void reset (const Dictionary &config) override
 Reset interface. More...
 
void cycle (const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
 Spin a new communication cycle. More...
 
void observe (Dictionary &observation) const override
 Write actuation-interface observations to dictionary. More...
 
Eigen::Matrix4d transform_base_to_world () const noexcept
 Get the groundtruth floating base transform. More...
 
Eigen::Vector3d linear_velocity_base_to_world_in_world () const noexcept
 Get the groundtruth floating base linear velocity. More...
 
Eigen::Vector3d angular_velocity_base_in_base () const noexcept
 Get the groundtruth floating base angular velocity. More...
 
void reset_contact_data ()
 Reset contact data. More...
 
void reset_joint_angles ()
 Reset joint angles to zero. More...
 
void reset_joint_properties ()
 Reset joint properties to defaults. More...
 
void reset_base_state (const Eigen::Vector3d &position_base_in_world, const Eigen::Quaterniond &orientation_base_in_world, const Eigen::Vector3d &linear_velocity_base_to_world_in_world, const Eigen::Vector3d &angular_velocity_base_in_base)
 Reset the pose and velocity of the floating base in the world frame. More...
 
const std::map< std::string, BulletJointProperties > & joint_properties ()
 Joint properties (accessor used for testing) More...
 
const std::map< std::string, moteus::ServoReply > & servo_reply ()
 Internal map of servo replies (accessor used for testing) More...
 
double compute_joint_torque (const std::string &joint_name, const double feedforward_torque, const double target_position, const double target_velocity, const double kp_scale, const double kd_scale, const double maximum_torque)
 Reproduce the moteus position controller in Bullet. More...
 
- Public Member Functions inherited from vulp::actuation::Interface
 Interface (const ServoLayout &servo_layout)
 Initialize actuation interface for a given servo layout. More...
 
virtual ~Interface ()=default
 Virtual destructor so that derived destructors are called properly. More...
 
const ServoLayoutservo_layout () const noexcept
 Get servo layout. More...
 
const std::map< int, int > & servo_bus_map () const noexcept
 Map from servo ID to the CAN bus the servo is connected to. More...
 
const std::map< int, std::string > & servo_joint_map () const noexcept
 Map from servo ID to joint name. More...
 
std::vector< moteus::ServoCommand > & commands ()
 Get servo commands. More...
 
const std::vector< moteus::ServoReply > & replies () const
 Get servo replies. More...
 
moteus::Data & data ()
 Get joint command-reply data. More...
 
void initialize_action (Dictionary &action)
 Initialize action dictionary with keys corresponding to the servo layout. More...
 
void write_position_commands (const Dictionary &action)
 Write position commands from an action dictionary. More...
 
void write_stop_commands () noexcept
 Stop all servos. More...
 
+

Detailed Description

+

Actuation interface for the Bullet simulator.

+ +

Definition at line 25 of file BulletInterface.h.

+

Constructor & Destructor Documentation

+ +

◆ BulletInterface()

+ +
+
+ + + + + + + + + + + + + + + + + + +
vulp::actuation::BulletInterface::BulletInterface (const ServoLayoutlayout,
const Parametersparams 
)
+
+ +

Initialize interface.

+
Parameters
+ + + +
[in]layoutServo layout.
[in]paramsInterface parameters.
+
+
+
Exceptions
+ + +
std::runtime_errorIf the simulator did not start properly.
+
+
+ +

Definition at line 27 of file BulletInterface.cpp.

+ +
+
+ +

◆ ~BulletInterface()

+ +
+
+ + + + + + + +
vulp::actuation::BulletInterface::~BulletInterface ()
+
+ +

Disconnect interface.

+ +

Definition at line 108 of file BulletInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ angular_velocity_base_in_base()

+ +
+
+ + + + + +
+ + + + + + + +
Eigen::Vector3d vulp::actuation::BulletInterface::angular_velocity_base_in_base () const
+
+noexcept
+
+ +

Get the groundtruth floating base angular velocity.

+
Note
This function is only used for testing and does not need to be optimized.
+ +

Definition at line 334 of file BulletInterface.cpp.

+ +
+
+ +

◆ compute_joint_torque()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
double vulp::actuation::BulletInterface::compute_joint_torque (const std::string & joint_name,
const double feedforward_torque,
const double target_position,
const double target_velocity,
const double kp_scale,
const double kd_scale,
const double maximum_torque 
)
+
+ +

Reproduce the moteus position controller in Bullet.

+
Parameters
+ + + + + + + + +
[in]joint_nameName of the joint.
[in]feedforward_torqueFeedforward torque command in [N] * [m].
[in]target_positionTarget angular position in [rad].
[in]target_velocityTarget angular velocity in [rad] / [s].
[in]kp_scaleMultiplicative factor applied to the proportional gain in torque control.
[in]kd_scaleMultiplicative factor applied to the derivative gain in torque control.
[in]maximum_torqueMaximum torque in [N] * [m] from the command.
+
+
+ +

Definition at line 289 of file BulletInterface.cpp.

+ +
+
+ +

◆ cycle()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void vulp::actuation::BulletInterface::cycle (const moteus::Data & data,
std::function< void(const moteus::Output &)> callback 
)
+
+finalvirtual
+
+ +

Spin a new communication cycle.

+
Parameters
+ + + +
dataBuffer to read commands from and write replies to.
callbackFunction to call when the cycle is over.
+
+
+

The callback will be invoked from an arbitrary thread when the communication cycle has completed. All memory pointed to by data must remain valid until the callback is invoked.

+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 186 of file BulletInterface.cpp.

+ +
+
+ +

◆ joint_properties()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<std::string, BulletJointProperties>& vulp::actuation::BulletInterface::joint_properties ()
+
+inline
+
+ +

Joint properties (accessor used for testing)

+ +

Definition at line 243 of file BulletInterface.h.

+ +
+
+ +

◆ linear_velocity_base_to_world_in_world()

+ +
+
+ + + + + +
+ + + + + + + +
Eigen::Vector3d vulp::actuation::BulletInterface::linear_velocity_base_to_world_in_world () const
+
+noexcept
+
+ +

Get the groundtruth floating base linear velocity.

+
Note
This function is only used for testing and does not need to be optimized.
+ +

Definition at line 326 of file BulletInterface.cpp.

+ +
+
+ +

◆ observe()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::BulletInterface::observe (Dictionary & observation) const
+
+overridevirtual
+
+ +

Write actuation-interface observations to dictionary.

+
Parameters
+ + +
[out]observationDictionary to write ot.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 170 of file BulletInterface.cpp.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::BulletInterface::reset (const Dictionary & config)
+
+overridevirtual
+
+ +

Reset interface.

+
Parameters
+ + +
[in]configAdditional configuration dictionary.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 110 of file BulletInterface.cpp.

+ +
+
+ +

◆ reset_base_state()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void vulp::actuation::BulletInterface::reset_base_state (const Eigen::Vector3d & position_base_in_world,
const Eigen::Quaterniond & orientation_base_in_world,
const Eigen::Vector3d & linear_velocity_base_to_world_in_world,
const Eigen::Vector3d & angular_velocity_base_in_base 
)
+
+ +

Reset the pose and velocity of the floating base in the world frame.

+
Parameters
+ + + + + +
[in]position_base_in_worldPosition of the base in the world frame.
[in]orientation_base_in_worldOrientation of the base in the world frame.
[in]linear_velocity_base_to_world_in_worldLinear velocity of the base in the world frame.
[in]angular_velocity_base_in_baseBody angular velocity of the base (in the base frame).
+
+
+ +

Definition at line 122 of file BulletInterface.cpp.

+ +
+
+ +

◆ reset_contact_data()

+ +
+
+ + + + + + + +
void vulp::actuation::BulletInterface::reset_contact_data ()
+
+ +

Reset contact data.

+ +

Definition at line 140 of file BulletInterface.cpp.

+ +
+
+ +

◆ reset_joint_angles()

+ +
+
+ + + + + + + +
void vulp::actuation::BulletInterface::reset_joint_angles ()
+
+ +

Reset joint angles to zero.

+ +

Definition at line 146 of file BulletInterface.cpp.

+ +
+
+ +

◆ reset_joint_properties()

+ +
+
+ + + + + + + +
void vulp::actuation::BulletInterface::reset_joint_properties ()
+
+ +

Reset joint properties to defaults.

+ +

Definition at line 153 of file BulletInterface.cpp.

+ +
+
+ +

◆ servo_reply()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<std::string, moteus::ServoReply>& vulp::actuation::BulletInterface::servo_reply ()
+
+inline
+
+ +

Internal map of servo replies (accessor used for testing)

+ +

Definition at line 248 of file BulletInterface.h.

+ +
+
+ +

◆ transform_base_to_world()

+ +
+
+ + + + + +
+ + + + + + + +
Eigen::Matrix4d vulp::actuation::BulletInterface::transform_base_to_world () const
+
+noexcept
+
+ +

Get the groundtruth floating base transform.

+ +

Definition at line 314 of file BulletInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1BulletInterface.js b/classvulp_1_1actuation_1_1BulletInterface.js new file mode 100644 index 00000000..7080f122 --- /dev/null +++ b/classvulp_1_1actuation_1_1BulletInterface.js @@ -0,0 +1,19 @@ +var classvulp_1_1actuation_1_1BulletInterface = +[ + [ "Parameters", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters" ], + [ "BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html#ae714260782b6110a5e77030ac8016540", null ], + [ "~BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html#a63ab50366c585f45de6ace6a05cd10d8", null ], + [ "angular_velocity_base_in_base", "classvulp_1_1actuation_1_1BulletInterface.html#a22a4561f736e47fd10838e33e3eea76f", null ], + [ "compute_joint_torque", "classvulp_1_1actuation_1_1BulletInterface.html#a947d01df9ece4fb48e0a3f48f9d524b0", null ], + [ "cycle", "classvulp_1_1actuation_1_1BulletInterface.html#a0b08119f9cdb5b36d9ec995dc56df7a5", null ], + [ "joint_properties", "classvulp_1_1actuation_1_1BulletInterface.html#aebf8c201d8d102e776fbef06283c2cad", null ], + [ "linear_velocity_base_to_world_in_world", "classvulp_1_1actuation_1_1BulletInterface.html#abf3317db63b1cf38d7da86e0efd7b5e1", null ], + [ "observe", "classvulp_1_1actuation_1_1BulletInterface.html#aa6e175ab2ded82e0c2e4c0e849e67b51", null ], + [ "reset", "classvulp_1_1actuation_1_1BulletInterface.html#a11efda56b80d0f7fa19616f825ba977e", null ], + [ "reset_base_state", "classvulp_1_1actuation_1_1BulletInterface.html#ae739f74f3dcb9316ca97840f5e5cab1a", null ], + [ "reset_contact_data", "classvulp_1_1actuation_1_1BulletInterface.html#a67388fea7cb1806923cae8db9fa32374", null ], + [ "reset_joint_angles", "classvulp_1_1actuation_1_1BulletInterface.html#a3e8cb3fe8ce7681bd903b6c64889824c", null ], + [ "reset_joint_properties", "classvulp_1_1actuation_1_1BulletInterface.html#a4c35888d4d83b4a011e2d3b866591a43", null ], + [ "servo_reply", "classvulp_1_1actuation_1_1BulletInterface.html#a1f7c35df51b913aa85333be81eec2430", null ], + [ "transform_base_to_world", "classvulp_1_1actuation_1_1BulletInterface.html#abca68c25b313ed573f05d7c8a0f0a74f", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1actuation_1_1Interface-members.html b/classvulp_1_1actuation_1_1Interface-members.html new file mode 100644 index 00000000..d1927390 --- /dev/null +++ b/classvulp_1_1actuation_1_1Interface-members.html @@ -0,0 +1,116 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::actuation::Interface Member List
+
+
+ +

This is the complete list of members for vulp::actuation::Interface, including all inherited members.

+ + + + + + + + + + + + + + + +
commands()vulp::actuation::Interfaceinline
cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback)=0vulp::actuation::Interfacepure virtual
data()vulp::actuation::Interfaceinline
initialize_action(Dictionary &action)vulp::actuation::Interface
Interface(const ServoLayout &servo_layout)vulp::actuation::Interfaceinlineexplicit
observe(Dictionary &observation) const =0vulp::actuation::Interfacepure virtual
replies() constvulp::actuation::Interfaceinline
reset(const Dictionary &config)=0vulp::actuation::Interfacepure virtual
servo_bus_map() const noexceptvulp::actuation::Interfaceinline
servo_joint_map() const noexceptvulp::actuation::Interfaceinline
servo_layout() const noexceptvulp::actuation::Interfaceinline
write_position_commands(const Dictionary &action)vulp::actuation::Interface
write_stop_commands() noexceptvulp::actuation::Interfaceinline
~Interface()=defaultvulp::actuation::Interfacevirtual
+
+ + + + diff --git a/classvulp_1_1actuation_1_1Interface.html b/classvulp_1_1actuation_1_1Interface.html new file mode 100644 index 00000000..248f85e5 --- /dev/null +++ b/classvulp_1_1actuation_1_1Interface.html @@ -0,0 +1,614 @@ + + + + + + + +vulp: vulp::actuation::Interface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::actuation::Interface Class Referenceabstract
+
+
+ +

Base class for actuation interfaces. + More...

+ +

#include <Interface.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Interface (const ServoLayout &servo_layout)
 Initialize actuation interface for a given servo layout. More...
 
virtual ~Interface ()=default
 Virtual destructor so that derived destructors are called properly. More...
 
virtual void cycle (const moteus::Data &data, std::function< void(const moteus::Output &)> callback)=0
 Spin a new communication cycle. More...
 
virtual void reset (const Dictionary &config)=0
 Reset interface using a new servo layout. More...
 
virtual void observe (Dictionary &observation) const =0
 Write servo and IMU observations to dictionary. More...
 
const ServoLayoutservo_layout () const noexcept
 Get servo layout. More...
 
const std::map< int, int > & servo_bus_map () const noexcept
 Map from servo ID to the CAN bus the servo is connected to. More...
 
const std::map< int, std::string > & servo_joint_map () const noexcept
 Map from servo ID to joint name. More...
 
std::vector< moteus::ServoCommand > & commands ()
 Get servo commands. More...
 
const std::vector< moteus::ServoReply > & replies () const
 Get servo replies. More...
 
moteus::Data & data ()
 Get joint command-reply data. More...
 
void initialize_action (Dictionary &action)
 Initialize action dictionary with keys corresponding to the servo layout. More...
 
void write_position_commands (const Dictionary &action)
 Write position commands from an action dictionary. More...
 
void write_stop_commands () noexcept
 Stop all servos. More...
 
+

Detailed Description

+

Base class for actuation interfaces.

+ +

Definition at line 24 of file Interface.h.

+

Constructor & Destructor Documentation

+ +

◆ Interface()

+ +
+
+ + + + + +
+ + + + + + + + +
vulp::actuation::Interface::Interface (const ServoLayoutservo_layout)
+
+inlineexplicit
+
+ +

Initialize actuation interface for a given servo layout.

+
Parameters
+ + +
[in]servo_layoutServo layout.
+
+
+ +

Definition at line 30 of file Interface.h.

+ +
+
+ +

◆ ~Interface()

+ +
+
+ + + + + +
+ + + + + + + +
virtual vulp::actuation::Interface::~Interface ()
+
+virtualdefault
+
+ +

Virtual destructor so that derived destructors are called properly.

+ +
+
+

Member Function Documentation

+ +

◆ commands()

+ +
+
+ + + + + +
+ + + + + + + +
std::vector<moteus::ServoCommand>& vulp::actuation::Interface::commands ()
+
+inline
+
+ +

Get servo commands.

+ +

Definition at line 87 of file Interface.h.

+ +
+
+ +

◆ cycle()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void vulp::actuation::Interface::cycle (const moteus::Data & data,
std::function< void(const moteus::Output &)> callback 
)
+
+pure virtual
+
+ +

Spin a new communication cycle.

+
Parameters
+ + + +
[in,out]dataBuffer to read commands from and write replies to.
callbackFunction to call when the cycle is over.
+
+
+

The callback will be invoked from an arbitrary thread when the communication cycle has completed. All memory pointed to by data must remain valid until the callback is invoked.

+ +

Implemented in vulp::actuation::Pi3HatInterface, vulp::actuation::MockInterface, and vulp::actuation::BulletInterface.

+ +
+
+ +

◆ data()

+ +
+
+ + + + + +
+ + + + + + + +
moteus::Data& vulp::actuation::Interface::data ()
+
+inline
+
+ +

Get joint command-reply data.

+

This field is meant to become internal when we refactor spine servo observations into actuation interfaces.

+ +

Definition at line 97 of file Interface.h.

+ +
+
+ +

◆ initialize_action()

+ +
+
+ + + + + + + + +
void vulp::actuation::Interface::initialize_action (Dictionary & action)
+
+ +

Initialize action dictionary with keys corresponding to the servo layout.

+
Parameters
+ + +
[out]actionAction dictionary.
+
+
+ +

Definition at line 27 of file Interface.cpp.

+ +
+
+ +

◆ observe()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::actuation::Interface::observe (Dictionary & observation) const
+
+pure virtual
+
+ +

Write servo and IMU observations to dictionary.

+
Parameters
+ + +
[out]observationDictionary to write ot.
+
+
+ +

Implemented in vulp::actuation::Pi3HatInterface, vulp::actuation::MockInterface, and vulp::actuation::BulletInterface.

+ +
+
+ +

◆ replies()

+ +
+
+ + + + + +
+ + + + + + + +
const std::vector<moteus::ServoReply>& vulp::actuation::Interface::replies () const
+
+inline
+
+ +

Get servo replies.

+ +

Definition at line 90 of file Interface.h.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::actuation::Interface::reset (const Dictionary & config)
+
+pure virtual
+
+ +

Reset interface using a new servo layout.

+
Parameters
+ + +
[in]configAdditional configuration dictionary.
+
+
+ +

Implemented in vulp::actuation::Pi3HatInterface, vulp::actuation::MockInterface, and vulp::actuation::BulletInterface.

+ +
+
+ +

◆ servo_bus_map()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<int, int>& vulp::actuation::Interface::servo_bus_map () const
+
+inlinenoexcept
+
+ +

Map from servo ID to the CAN bus the servo is connected to.

+ +

Definition at line 77 of file Interface.h.

+ +
+
+ +

◆ servo_joint_map()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<int, std::string>& vulp::actuation::Interface::servo_joint_map () const
+
+inlinenoexcept
+
+ +

Map from servo ID to joint name.

+ +

Definition at line 82 of file Interface.h.

+ +
+
+ +

◆ servo_layout()

+ +
+
+ + + + + +
+ + + + + + + +
const ServoLayout& vulp::actuation::Interface::servo_layout () const
+
+inlinenoexcept
+
+ +

Get servo layout.

+ +

Definition at line 74 of file Interface.h.

+ +
+
+ +

◆ write_position_commands()

+ +
+
+ + + + + + + + +
void vulp::actuation::Interface::write_position_commands (const Dictionary & action)
+
+ +

Write position commands from an action dictionary.

+
Parameters
+ + +
[in]actionAction to read commands from.
+
+
+ +

Definition at line 40 of file Interface.cpp.

+ +
+
+ +

◆ write_stop_commands()

+ +
+
+ + + + + +
+ + + + + + + +
void vulp::actuation::Interface::write_stop_commands ()
+
+inlinenoexcept
+
+ +

Stop all servos.

+
Parameters
+ + +
[out]commandsServo commands to set to stop.
+
+
+

This function does not and should not throw, as it will be called by default if any exception is caught from the spine control loop.

+ +

Definition at line 118 of file Interface.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1Interface.js b/classvulp_1_1actuation_1_1Interface.js new file mode 100644 index 00000000..9a2ba59f --- /dev/null +++ b/classvulp_1_1actuation_1_1Interface.js @@ -0,0 +1,17 @@ +var classvulp_1_1actuation_1_1Interface = +[ + [ "Interface", "classvulp_1_1actuation_1_1Interface.html#a154834670d82002681360eebf3353279", null ], + [ "~Interface", "classvulp_1_1actuation_1_1Interface.html#a4699195a001a20220ba4606f0bb58274", null ], + [ "commands", "classvulp_1_1actuation_1_1Interface.html#ac60af36fb98a8bda3b21d8252c3a1453", null ], + [ "cycle", "classvulp_1_1actuation_1_1Interface.html#ab9b6fe3cbfd5e58345a1297a97da5de9", null ], + [ "data", "classvulp_1_1actuation_1_1Interface.html#a3bb031735c3cfa22259787b88d63b49b", null ], + [ "initialize_action", "classvulp_1_1actuation_1_1Interface.html#a58633a8bc4024056e0512b23baa78cfa", null ], + [ "observe", "classvulp_1_1actuation_1_1Interface.html#ac5f1fd525398a0a0d290ee2aed26c66f", null ], + [ "replies", "classvulp_1_1actuation_1_1Interface.html#ac2ef0cf7b5e03256826df43fdde67923", null ], + [ "reset", "classvulp_1_1actuation_1_1Interface.html#a6a235100e7e6a7edc3b447ccdd86e71b", null ], + [ "servo_bus_map", "classvulp_1_1actuation_1_1Interface.html#a030c21ac2fe9fd6e037f1d8c8ab2a287", null ], + [ "servo_joint_map", "classvulp_1_1actuation_1_1Interface.html#ad8043504a3f4003d353919f664ad38aa", null ], + [ "servo_layout", "classvulp_1_1actuation_1_1Interface.html#a48f6e80769c28910d4d8affb66fc343e", null ], + [ "write_position_commands", "classvulp_1_1actuation_1_1Interface.html#a03bc60526db123752c398595584af95d", null ], + [ "write_stop_commands", "classvulp_1_1actuation_1_1Interface.html#a8cde746cb50f95e7bfbf9dfe718fa443", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1actuation_1_1MockInterface-members.html b/classvulp_1_1actuation_1_1MockInterface-members.html new file mode 100644 index 00000000..8c32b691 --- /dev/null +++ b/classvulp_1_1actuation_1_1MockInterface-members.html @@ -0,0 +1,118 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::actuation::MockInterface Member List
+
+
+ +

This is the complete list of members for vulp::actuation::MockInterface, including all inherited members.

+ + + + + + + + + + + + + + + + + +
commands()vulp::actuation::Interfaceinline
cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) finalvulp::actuation::MockInterfacevirtual
data()vulp::actuation::Interfaceinline
initialize_action(Dictionary &action)vulp::actuation::Interface
Interface(const ServoLayout &servo_layout)vulp::actuation::Interfaceinlineexplicit
MockInterface(const ServoLayout &layout, const double dt)vulp::actuation::MockInterface
observe(Dictionary &observation) const overridevulp::actuation::MockInterfacevirtual
replies() constvulp::actuation::Interfaceinline
reset(const Dictionary &config) overridevulp::actuation::MockInterfacevirtual
servo_bus_map() const noexceptvulp::actuation::Interfaceinline
servo_joint_map() const noexceptvulp::actuation::Interfaceinline
servo_layout() const noexceptvulp::actuation::Interfaceinline
write_position_commands(const Dictionary &action)vulp::actuation::Interface
write_stop_commands() noexceptvulp::actuation::Interfaceinline
~Interface()=defaultvulp::actuation::Interfacevirtual
~MockInterface()=defaultvulp::actuation::MockInterface
+
+ + + + diff --git a/classvulp_1_1actuation_1_1MockInterface.html b/classvulp_1_1actuation_1_1MockInterface.html new file mode 100644 index 00000000..fee7d9f1 --- /dev/null +++ b/classvulp_1_1actuation_1_1MockInterface.html @@ -0,0 +1,358 @@ + + + + + + + +vulp: vulp::actuation::MockInterface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::actuation::MockInterface Class Reference
+
+
+ +

#include <MockInterface.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 MockInterface (const ServoLayout &layout, const double dt)
 Create mock actuator interface. More...
 
 ~MockInterface ()=default
 Default destructor. More...
 
void reset (const Dictionary &config) override
 Reset interface. More...
 
void observe (Dictionary &observation) const override
 Write actuation-interface observations to dictionary. More...
 
void cycle (const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
 Simulate a new communication cycle. More...
 
- Public Member Functions inherited from vulp::actuation::Interface
 Interface (const ServoLayout &servo_layout)
 Initialize actuation interface for a given servo layout. More...
 
virtual ~Interface ()=default
 Virtual destructor so that derived destructors are called properly. More...
 
const ServoLayoutservo_layout () const noexcept
 Get servo layout. More...
 
const std::map< int, int > & servo_bus_map () const noexcept
 Map from servo ID to the CAN bus the servo is connected to. More...
 
const std::map< int, std::string > & servo_joint_map () const noexcept
 Map from servo ID to joint name. More...
 
std::vector< moteus::ServoCommand > & commands ()
 Get servo commands. More...
 
const std::vector< moteus::ServoReply > & replies () const
 Get servo replies. More...
 
moteus::Data & data ()
 Get joint command-reply data. More...
 
void initialize_action (Dictionary &action)
 Initialize action dictionary with keys corresponding to the servo layout. More...
 
void write_position_commands (const Dictionary &action)
 Write position commands from an action dictionary. More...
 
void write_stop_commands () noexcept
 Stop all servos. More...
 
+

Detailed Description

+
+

Definition at line 20 of file MockInterface.h.

+

Constructor & Destructor Documentation

+ +

◆ MockInterface()

+ +
+
+ + + + + + + + + + + + + + + + + + +
vulp::actuation::MockInterface::MockInterface (const ServoLayoutlayout,
const double dt 
)
+
+ +

Create mock actuator interface.

+
Parameters
+ + +
[in]paramsInterface parameters.
+
+
+ +

Definition at line 11 of file MockInterface.cpp.

+ +
+
+ +

◆ ~MockInterface()

+ +
+
+ + + + + +
+ + + + + + + +
vulp::actuation::MockInterface::~MockInterface ()
+
+default
+
+ +

Default destructor.

+ +
+
+

Member Function Documentation

+ +

◆ cycle()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void vulp::actuation::MockInterface::cycle (const moteus::Data & data,
std::function< void(const moteus::Output &)> callback 
)
+
+finalvirtual
+
+ +

Simulate a new communication cycle.

+
Parameters
+ + + +
dataBuffer to read commands from and write replies to.
callbackFunction to call when the cycle is over.
+
+
+

The callback will be invoked from an arbitrary thread when the communication cycle has completed. All memory pointed to by data must remain valid until the callback is invoked.

+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 39 of file MockInterface.cpp.

+ +
+
+ +

◆ observe()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::MockInterface::observe (Dictionary & observation) const
+
+overridevirtual
+
+ +

Write actuation-interface observations to dictionary.

+
Parameters
+ + +
[out]observationDictionary to write ot.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 29 of file MockInterface.cpp.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::MockInterface::reset (const Dictionary & config)
+
+overridevirtual
+
+ +

Reset interface.

+
Parameters
+ + +
[in]configAdditional configuration dictionary.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 27 of file MockInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1MockInterface.js b/classvulp_1_1actuation_1_1MockInterface.js new file mode 100644 index 00000000..b38d7d01 --- /dev/null +++ b/classvulp_1_1actuation_1_1MockInterface.js @@ -0,0 +1,8 @@ +var classvulp_1_1actuation_1_1MockInterface = +[ + [ "MockInterface", "classvulp_1_1actuation_1_1MockInterface.html#a0e5220c878595c959f26f51dbba9c078", null ], + [ "~MockInterface", "classvulp_1_1actuation_1_1MockInterface.html#a188d0479488241b3f5549c16a2f4daae", null ], + [ "cycle", "classvulp_1_1actuation_1_1MockInterface.html#a9aaaa09396d4966948f02e5953d99677", null ], + [ "observe", "classvulp_1_1actuation_1_1MockInterface.html#a790e57ed6a6157044ae70c3e59d9967e", null ], + [ "reset", "classvulp_1_1actuation_1_1MockInterface.html#a2e52d2e397d8e0bab2af4f1851f447c3", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1actuation_1_1Pi3HatInterface-members.html b/classvulp_1_1actuation_1_1Pi3HatInterface-members.html new file mode 100644 index 00000000..aaa92428 --- /dev/null +++ b/classvulp_1_1actuation_1_1Pi3HatInterface-members.html @@ -0,0 +1,118 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::actuation::Pi3HatInterface Member List
+
+
+ +

This is the complete list of members for vulp::actuation::Pi3HatInterface, including all inherited members.

+ + + + + + + + + + + + + + + + + +
commands()vulp::actuation::Interfaceinline
cycle(const moteus::Data &data, std::function< void(const moteus::Output &)> callback) finalvulp::actuation::Pi3HatInterfacevirtual
data()vulp::actuation::Interfaceinline
initialize_action(Dictionary &action)vulp::actuation::Interface
Interface(const ServoLayout &servo_layout)vulp::actuation::Interfaceinlineexplicit
observe(Dictionary &observation) const overridevulp::actuation::Pi3HatInterfacevirtual
Pi3HatInterface(const ServoLayout &layout, const int can_cpu, const Pi3Hat::Configuration &pi3hat_config)vulp::actuation::Pi3HatInterface
replies() constvulp::actuation::Interfaceinline
reset(const Dictionary &config) overridevulp::actuation::Pi3HatInterfacevirtual
servo_bus_map() const noexceptvulp::actuation::Interfaceinline
servo_joint_map() const noexceptvulp::actuation::Interfaceinline
servo_layout() const noexceptvulp::actuation::Interfaceinline
write_position_commands(const Dictionary &action)vulp::actuation::Interface
write_stop_commands() noexceptvulp::actuation::Interfaceinline
~Interface()=defaultvulp::actuation::Interfacevirtual
~Pi3HatInterface()vulp::actuation::Pi3HatInterface
+
+ + + + diff --git a/classvulp_1_1actuation_1_1Pi3HatInterface.html b/classvulp_1_1actuation_1_1Pi3HatInterface.html new file mode 100644 index 00000000..5398ac08 --- /dev/null +++ b/classvulp_1_1actuation_1_1Pi3HatInterface.html @@ -0,0 +1,365 @@ + + + + + + + +vulp: vulp::actuation::Pi3HatInterface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::actuation::Pi3HatInterface Class Reference
+
+
+ +

Interface to moteus controllers. + More...

+ +

#include <Pi3HatInterface.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Pi3HatInterface (const ServoLayout &layout, const int can_cpu, const Pi3Hat::Configuration &pi3hat_config)
 Configure interface and spawn CAN thread. More...
 
 ~Pi3HatInterface ()
 Stop CAN thread. More...
 
void reset (const Dictionary &config) override
 Reset interface. More...
 
void observe (Dictionary &observation) const override
 Write actuation-interface observations to dictionary. More...
 
void cycle (const moteus::Data &data, std::function< void(const moteus::Output &)> callback) final
 Spin a new communication cycle. More...
 
- Public Member Functions inherited from vulp::actuation::Interface
 Interface (const ServoLayout &servo_layout)
 Initialize actuation interface for a given servo layout. More...
 
virtual ~Interface ()=default
 Virtual destructor so that derived destructors are called properly. More...
 
const ServoLayoutservo_layout () const noexcept
 Get servo layout. More...
 
const std::map< int, int > & servo_bus_map () const noexcept
 Map from servo ID to the CAN bus the servo is connected to. More...
 
const std::map< int, std::string > & servo_joint_map () const noexcept
 Map from servo ID to joint name. More...
 
std::vector< moteus::ServoCommand > & commands ()
 Get servo commands. More...
 
const std::vector< moteus::ServoReply > & replies () const
 Get servo replies. More...
 
moteus::Data & data ()
 Get joint command-reply data. More...
 
void initialize_action (Dictionary &action)
 Initialize action dictionary with keys corresponding to the servo layout. More...
 
void write_position_commands (const Dictionary &action)
 Write position commands from an action dictionary. More...
 
void write_stop_commands () noexcept
 Stop all servos. More...
 
+

Detailed Description

+

Interface to moteus controllers.

+

Internally it uses a background thread to operate the pi3hat, enabling the main thread to perform work while servo communication is taking place.

+ +

Definition at line 43 of file Pi3HatInterface.h.

+

Constructor & Destructor Documentation

+ +

◆ Pi3HatInterface()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
vulp::actuation::Pi3HatInterface::Pi3HatInterface (const ServoLayoutlayout,
const int can_cpu,
const Pi3Hat::Configuration & pi3hat_config 
)
+
+ +

Configure interface and spawn CAN thread.

+
Parameters
+ + + + +
[in]layoutServo layout.
[in]can_cpuCPUID of the core to run the CAN thread on.
[in]pi3hat_configConfiguration for the pi3hat.
+
+
+ +

Definition at line 15 of file Pi3HatInterface.cpp.

+ +
+
+ +

◆ ~Pi3HatInterface()

+ +
+
+ + + + + + + +
vulp::actuation::Pi3HatInterface::~Pi3HatInterface ()
+
+ +

Stop CAN thread.

+ +

Definition at line 22 of file Pi3HatInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ cycle()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void vulp::actuation::Pi3HatInterface::cycle (const moteus::Data & data,
std::function< void(const moteus::Output &)> callback 
)
+
+finalvirtual
+
+ +

Spin a new communication cycle.

+
Parameters
+ + + +
[in]dataBuffer to read commands from and write replies to.
[in]callbackFunction to call when the cycle is over.
+
+
+

The callback will be invoked from an arbitrary thread when the communication cycle has completed. All memory pointed to by data must remain valid until the callback is invoked.

+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 54 of file Pi3HatInterface.cpp.

+ +
+
+ +

◆ observe()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::Pi3HatInterface::observe (Dictionary & observation) const
+
+overridevirtual
+
+ +

Write actuation-interface observations to dictionary.

+
Parameters
+ + +
[out]observationDictionary to write ot.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 40 of file Pi3HatInterface.cpp.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::actuation::Pi3HatInterface::reset (const Dictionary & config)
+
+overridevirtual
+
+ +

Reset interface.

+
Parameters
+ + +
[in]configAdditional configuration dictionary.
+
+
+ +

Implements vulp::actuation::Interface.

+ +

Definition at line 38 of file Pi3HatInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1Pi3HatInterface.js b/classvulp_1_1actuation_1_1Pi3HatInterface.js new file mode 100644 index 00000000..516d80dc --- /dev/null +++ b/classvulp_1_1actuation_1_1Pi3HatInterface.js @@ -0,0 +1,8 @@ +var classvulp_1_1actuation_1_1Pi3HatInterface = +[ + [ "Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html#a996e787fffa3e114248c62554a82ea6c", null ], + [ "~Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html#a7240e06f6198aebe50f0764c4610c511", null ], + [ "cycle", "classvulp_1_1actuation_1_1Pi3HatInterface.html#a7fba7d27e5486cfdefe177b1631989d3", null ], + [ "observe", "classvulp_1_1actuation_1_1Pi3HatInterface.html#abdec83204cb8b1bd51333d5d62f89293", null ], + [ "reset", "classvulp_1_1actuation_1_1Pi3HatInterface.html#ae6868c0cb7bdcb5dd16bbcd6bd8a6214", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1actuation_1_1ServoLayout-members.html b/classvulp_1_1actuation_1_1ServoLayout-members.html new file mode 100644 index 00000000..f1e6ee41 --- /dev/null +++ b/classvulp_1_1actuation_1_1ServoLayout-members.html @@ -0,0 +1,108 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::actuation::ServoLayout Member List
+
+
+ +

This is the complete list of members for vulp::actuation::ServoLayout, including all inherited members.

+ + + + + + + +
add_servo(const int servo_id, const int bus_id, const std::string &joint_name)vulp::actuation::ServoLayoutinline
bus(const int servo_id) constvulp::actuation::ServoLayoutinline
joint_name(const int servo_id) constvulp::actuation::ServoLayoutinline
servo_bus_map() const noexceptvulp::actuation::ServoLayoutinline
servo_joint_map() const noexceptvulp::actuation::ServoLayoutinline
size() const noexceptvulp::actuation::ServoLayoutinline
+
+ + + + diff --git a/classvulp_1_1actuation_1_1ServoLayout.html b/classvulp_1_1actuation_1_1ServoLayout.html new file mode 100644 index 00000000..39a4ac04 --- /dev/null +++ b/classvulp_1_1actuation_1_1ServoLayout.html @@ -0,0 +1,365 @@ + + + + + + + +vulp: vulp::actuation::ServoLayout Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::actuation::ServoLayout Class Reference
+
+
+ +

Map between servos, their busses and the joints they actuate. + More...

+ +

#include <ServoLayout.h>

+ + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void add_servo (const int servo_id, const int bus_id, const std::string &joint_name)
 Add a servo to the layout. More...
 
int bus (const int servo_id) const
 Get identifier of the CAN bus a servo is connected to. More...
 
const std::string & joint_name (const int servo_id) const
 Get the name of the joint a servo actuates. More...
 
const std::map< int, int > & servo_bus_map () const noexcept
 Get the full servo-bus map. More...
 
const std::map< int, std::string > & servo_joint_map () const noexcept
 Get the full servo-joint map. More...
 
size_t size () const noexcept
 Get the number of servos in the layout. More...
 
+

Detailed Description

+

Map between servos, their busses and the joints they actuate.

+ +

Definition at line 12 of file ServoLayout.h.

+

Member Function Documentation

+ +

◆ add_servo()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
void vulp::actuation::ServoLayout::add_servo (const int servo_id,
const int bus_id,
const std::string & joint_name 
)
+
+inline
+
+ +

Add a servo to the layout.

+
Parameters
+ + + + +
[in]servo_idServo ID (id.id for moteus)
[in]bus_idCAN bus the servo is connected to.
[in]joint_nameName of the joint the servo actuates.
+
+
+ +

Definition at line 20 of file ServoLayout.h.

+ +
+
+ +

◆ bus()

+ +
+
+ + + + + +
+ + + + + + + + +
int vulp::actuation::ServoLayout::bus (const int servo_id) const
+
+inline
+
+ +

Get identifier of the CAN bus a servo is connected to.

+
Parameters
+ + +
[in]servo_idServo ID.
+
+
+
Returns
CAN bus the servo is connected to.
+
Exceptions
+ + +
std::out_of_rangeif the servo is not in the layout.
+
+
+ +

Definition at line 34 of file ServoLayout.h.

+ +
+
+ +

◆ joint_name()

+ +
+
+ + + + + +
+ + + + + + + + +
const std::string& vulp::actuation::ServoLayout::joint_name (const int servo_id) const
+
+inline
+
+ +

Get the name of the joint a servo actuates.

+
Parameters
+ + +
[in]servo_idServo ID.
+
+
+
Returns
Name of the joint the servo actuates.
+
Exceptions
+ + +
std::out_of_rangeif the servo is not in the layout.
+
+
+ +

Definition at line 44 of file ServoLayout.h.

+ +
+
+ +

◆ servo_bus_map()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<int, int>& vulp::actuation::ServoLayout::servo_bus_map () const
+
+inlinenoexcept
+
+ +

Get the full servo-bus map.

+ +

Definition at line 49 of file ServoLayout.h.

+ +
+
+ +

◆ servo_joint_map()

+ +
+
+ + + + + +
+ + + + + + + +
const std::map<int, std::string>& vulp::actuation::ServoLayout::servo_joint_map () const
+
+inlinenoexcept
+
+ +

Get the full servo-joint map.

+ +

Definition at line 54 of file ServoLayout.h.

+ +
+
+ +

◆ size()

+ +
+
+ + + + + +
+ + + + + + + +
size_t vulp::actuation::ServoLayout::size () const
+
+inlinenoexcept
+
+ +

Get the number of servos in the layout.

+ +

Definition at line 59 of file ServoLayout.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1actuation_1_1ServoLayout.js b/classvulp_1_1actuation_1_1ServoLayout.js new file mode 100644 index 00000000..f08fb1d8 --- /dev/null +++ b/classvulp_1_1actuation_1_1ServoLayout.js @@ -0,0 +1,9 @@ +var classvulp_1_1actuation_1_1ServoLayout = +[ + [ "add_servo", "classvulp_1_1actuation_1_1ServoLayout.html#a5a77916f9ec8ffe722ce5b3fcacf2097", null ], + [ "bus", "classvulp_1_1actuation_1_1ServoLayout.html#aecd67b35fadbcd87c4528a7069f9ae71", null ], + [ "joint_name", "classvulp_1_1actuation_1_1ServoLayout.html#a50a75e86d72f40263d8103e4e575ee84", null ], + [ "servo_bus_map", "classvulp_1_1actuation_1_1ServoLayout.html#af5832e2cf2c38680ae5629437a6d8a5e", null ], + [ "servo_joint_map", "classvulp_1_1actuation_1_1ServoLayout.html#aa8acd7e824f357e25101d8e27a96cbc0", null ], + [ "size", "classvulp_1_1actuation_1_1ServoLayout.html#aa913aed179eea813eeb1e0a26e73079c", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1control_1_1Controller-members.html b/classvulp_1_1control_1_1Controller-members.html new file mode 100644 index 00000000..7d8743bf --- /dev/null +++ b/classvulp_1_1control_1_1Controller-members.html @@ -0,0 +1,103 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::control::Controller Member List
+
+
+ +

This is the complete list of members for vulp::control::Controller, including all inherited members.

+ + +
act(Dictionary &action, const Dictionary &observation)=0vulp::control::Controllerpure virtual
+
+ + + + diff --git a/classvulp_1_1control_1_1Controller.html b/classvulp_1_1control_1_1Controller.html new file mode 100644 index 00000000..38d3d713 --- /dev/null +++ b/classvulp_1_1control_1_1Controller.html @@ -0,0 +1,168 @@ + + + + + + + +vulp: vulp::control::Controller Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::control::Controller Class Referenceabstract
+
+
+ +

Base class for controllers. + More...

+ +

#include <Controller.h>

+ + + + + +

+Public Member Functions

virtual void act (Dictionary &action, const Dictionary &observation)=0
 Decide action. More...
 
+

Detailed Description

+

Base class for controllers.

+ +

Definition at line 14 of file Controller.h.

+

Member Function Documentation

+ +

◆ act()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual void vulp::control::Controller::act (Dictionary & action,
const Dictionary & observation 
)
+
+pure virtual
+
+ +

Decide action.

+
Parameters
+ + + +
[out]actionDictionary to write the full action to.
[in]observationLatest observation.
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1control_1_1Controller.js b/classvulp_1_1control_1_1Controller.js new file mode 100644 index 00000000..c1d0937b --- /dev/null +++ b/classvulp_1_1control_1_1Controller.js @@ -0,0 +1,4 @@ +var classvulp_1_1control_1_1Controller = +[ + [ "act", "classvulp_1_1control_1_1Controller.html#a67d54fc3c74f0464f1685d8d2640f9e0", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1HistoryObserver-members.html b/classvulp_1_1observation_1_1HistoryObserver-members.html new file mode 100644 index 00000000..f5ef706c --- /dev/null +++ b/classvulp_1_1observation_1_1HistoryObserver-members.html @@ -0,0 +1,108 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::HistoryObserver< T > Member List
+
+
+ +

This is the complete list of members for vulp::observation::HistoryObserver< T >, including all inherited members.

+ + + + + + + +
HistoryObserver(const std::vector< std::string > &keys, size_t size, const T &default_value)vulp::observation::HistoryObserver< T >inline
prefix() const noexcept finalvulp::observation::HistoryObserver< T >inlinevirtual
read(const Dictionary &observation) finalvulp::observation::HistoryObserver< T >inlinevirtual
reset(const Dictionary &config) finalvulp::observation::HistoryObserver< T >inlinevirtual
write(Dictionary &observation) finalvulp::observation::HistoryObserver< T >inlinevirtual
~Observer()vulp::observation::Observerinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1HistoryObserver.html b/classvulp_1_1observation_1_1HistoryObserver.html new file mode 100644 index 00000000..c922e5ef --- /dev/null +++ b/classvulp_1_1observation_1_1HistoryObserver.html @@ -0,0 +1,353 @@ + + + + + + + +vulp: vulp::observation::HistoryObserver< T > Class Template Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::HistoryObserver< T > Class Template Reference
+
+
+ +

Report high-frequency history vectors to lower-frequency agents. + More...

+ +

#include <HistoryObserver.h>

+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 HistoryObserver (const std::vector< std::string > &keys, size_t size, const T &default_value)
 Initialize observer. More...
 
std::string prefix () const noexcept final
 Prefix of outputs in the observation dictionary. More...
 
void reset (const Dictionary &config) final
 Reset observer. More...
 
void read (const Dictionary &observation) final
 Read inputs from other observations. More...
 
void write (Dictionary &observation) final
 Write outputs, called if reading was successful. More...
 
- Public Member Functions inherited from vulp::observation::Observer
virtual ~Observer ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
+

Detailed Description

+

template<typename T>
+class vulp::observation::HistoryObserver< T >

+ +

Report high-frequency history vectors to lower-frequency agents.

+

This observer allows processing higher-frequency signals from the spine as vectors of observations reported to lower-frequency agents.

+ +

Definition at line 28 of file HistoryObserver.h.

+

Constructor & Destructor Documentation

+ +

◆ HistoryObserver()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
vulp::observation::HistoryObserver< T >::HistoryObserver (const std::vector< std::string > & keys,
size_t size,
const T & default_value 
)
+
+inline
+
+ +

Initialize observer.

+
Parameters
+ + + + +
[in]keysList of keys to read values from in input observations.
[in]sizeSize of the history vector.
[in]default_valueValue to initialize history vectors.
+
+
+ +

Definition at line 36 of file HistoryObserver.h.

+ +
+
+

Member Function Documentation

+ +

◆ prefix()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + +
std::string vulp::observation::HistoryObserver< T >::prefix () const
+
+inlinefinalvirtualnoexcept
+
+ +

Prefix of outputs in the observation dictionary.

+ +

Reimplemented from vulp::observation::Observer.

+ +

Definition at line 41 of file HistoryObserver.h.

+ +
+
+ +

◆ read()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
void vulp::observation::HistoryObserver< T >::read (const Dictionary & observation)
+
+inlinefinalvirtual
+
+ +

Read inputs from other observations.

+
Parameters
+ + +
[in]observationDictionary to read other observations from.
+
+
+ +

Reimplemented from vulp::observation::Observer.

+ +

Definition at line 53 of file HistoryObserver.h.

+ +
+
+ +

◆ reset()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
void vulp::observation::HistoryObserver< T >::reset (const Dictionary & config)
+
+inlinefinalvirtual
+
+ +

Reset observer.

+
Parameters
+ + +
[in]configConfiguration dictionary.
+
+
+ +

Reimplemented from vulp::observation::Observer.

+ +

Definition at line 47 of file HistoryObserver.h.

+ +
+
+ +

◆ write()

+ +
+
+
+template<typename T >
+ + + + + +
+ + + + + + + + +
void vulp::observation::HistoryObserver< T >::write (Dictionary & observation)
+
+inlinefinalvirtual
+
+ +

Write outputs, called if reading was successful.

+
Parameters
+ + +
[out]observationDictionary to write observations to.
+
+
+ +

Reimplemented from vulp::observation::Observer.

+ +

Definition at line 61 of file HistoryObserver.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1HistoryObserver.js b/classvulp_1_1observation_1_1HistoryObserver.js new file mode 100644 index 00000000..c400ca08 --- /dev/null +++ b/classvulp_1_1observation_1_1HistoryObserver.js @@ -0,0 +1,8 @@ +var classvulp_1_1observation_1_1HistoryObserver = +[ + [ "HistoryObserver", "classvulp_1_1observation_1_1HistoryObserver.html#a556211d9cb6719e3a044c20ddfd0bb27", null ], + [ "prefix", "classvulp_1_1observation_1_1HistoryObserver.html#a9786400be17a5a9f6e1ca34016c27ad7", null ], + [ "read", "classvulp_1_1observation_1_1HistoryObserver.html#ad4b85e8cdf7f4b9b35e93ec062f2d712", null ], + [ "reset", "classvulp_1_1observation_1_1HistoryObserver.html#ad14642b0057573baf2ef01db21b3eb42", null ], + [ "write", "classvulp_1_1observation_1_1HistoryObserver.html#ad5cef6b330e2db7c80dcbaec7cf58892", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1Observer-members.html b/classvulp_1_1observation_1_1Observer-members.html new file mode 100644 index 00000000..7f437141 --- /dev/null +++ b/classvulp_1_1observation_1_1Observer-members.html @@ -0,0 +1,107 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::Observer Member List
+
+
+ +

This is the complete list of members for vulp::observation::Observer, including all inherited members.

+ + + + + + +
prefix() const noexceptvulp::observation::Observerinlinevirtual
read(const Dictionary &observation)vulp::observation::Observerinlinevirtual
reset(const Dictionary &config)vulp::observation::Observerinlinevirtual
write(Dictionary &observation)vulp::observation::Observerinlinevirtual
~Observer()vulp::observation::Observerinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1Observer.html b/classvulp_1_1observation_1_1Observer.html new file mode 100644 index 00000000..3d36d611 --- /dev/null +++ b/classvulp_1_1observation_1_1Observer.html @@ -0,0 +1,312 @@ + + + + + + + +vulp: vulp::observation::Observer Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::Observer Class Reference
+
+
+ +

Base class for observers. + More...

+ +

#include <Observer.h>

+ + + + + + + + + + + + + + + + + +

+Public Member Functions

virtual ~Observer ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
virtual std::string prefix () const noexcept
 Prefix of outputs in the observation dictionary. More...
 
virtual void reset (const Dictionary &config)
 Reset observer. More...
 
virtual void read (const Dictionary &observation)
 Read inputs from other observations. More...
 
virtual void write (Dictionary &observation)
 Write outputs, called if reading was successful. More...
 
+

Detailed Description

+

Base class for observers.

+ +

Definition at line 15 of file Observer.h.

+

Constructor & Destructor Documentation

+ +

◆ ~Observer()

+ +
+
+ + + + + +
+ + + + + + + +
virtual vulp::observation::Observer::~Observer ()
+
+inlinevirtual
+
+ +

Destructor is virtual to deallocate lists of observers properly.

+ +

Definition at line 18 of file Observer.h.

+ +
+
+

Member Function Documentation

+ +

◆ prefix()

+ +
+
+ + + + + +
+ + + + + + + +
virtual std::string vulp::observation::Observer::prefix () const
+
+inlinevirtualnoexcept
+
+ +

Prefix of outputs in the observation dictionary.

+ +

Reimplemented in vulp::observation::HistoryObserver< T >.

+ +

Definition at line 21 of file Observer.h.

+ +
+
+ +

◆ read()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::observation::Observer::read (const Dictionary & observation)
+
+inlinevirtual
+
+ +

Read inputs from other observations.

+
Parameters
+ + +
[in]observationDictionary to read other observations from.
+
+
+
Note
The base class reads nothing. We put an empty function here rather than making the class abstract to be able to instantiate vectors of it.
+ +

Reimplemented in vulp::observation::HistoryObserver< T >.

+ +

Definition at line 38 of file Observer.h.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::observation::Observer::reset (const Dictionary & config)
+
+inlinevirtual
+
+ +

Reset observer.

+
Parameters
+ + +
[in]configConfiguration dictionary.
+
+
+ +

Reimplemented in vulp::observation::HistoryObserver< T >.

+ +

Definition at line 29 of file Observer.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::observation::Observer::write (Dictionary & observation)
+
+inlinevirtual
+
+ +

Write outputs, called if reading was successful.

+
Parameters
+ + +
[out]observationDictionary to write observations to.
+
+
+
Note
The base class writes nothing. We put an empty function here rather than making the class abstract to be able to instantiate vectors of it.
+ +

Reimplemented in vulp::observation::HistoryObserver< T >.

+ +

Definition at line 47 of file Observer.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1Observer.js b/classvulp_1_1observation_1_1Observer.js new file mode 100644 index 00000000..c78e50d6 --- /dev/null +++ b/classvulp_1_1observation_1_1Observer.js @@ -0,0 +1,8 @@ +var classvulp_1_1observation_1_1Observer = +[ + [ "~Observer", "classvulp_1_1observation_1_1Observer.html#aedcf4bafa7051d01e5711180738b2ba6", null ], + [ "prefix", "classvulp_1_1observation_1_1Observer.html#a3fd28e0a2aa049f4a6a1e3a7a447ab60", null ], + [ "read", "classvulp_1_1observation_1_1Observer.html#a547821509ce1dffd57dccfca3e357b34", null ], + [ "reset", "classvulp_1_1observation_1_1Observer.html#a220adebd86175a8da2890f14e0fb3d65", null ], + [ "write", "classvulp_1_1observation_1_1Observer.html#ad1187770cd115152300db7ccbe0ad452", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1ObserverPipeline-members.html b/classvulp_1_1observation_1_1ObserverPipeline-members.html new file mode 100644 index 00000000..fadc1042 --- /dev/null +++ b/classvulp_1_1observation_1_1ObserverPipeline-members.html @@ -0,0 +1,111 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::ObserverPipeline Member List
+
+
+ +

This is the complete list of members for vulp::observation::ObserverPipeline, including all inherited members.

+ + + + + + + + + + +
append_observer(std::shared_ptr< Observer > observer)vulp::observation::ObserverPipelineinline
connect_source(std::shared_ptr< Source > source)vulp::observation::ObserverPipelineinline
iterator typedefvulp::observation::ObserverPipeline
nb_observers()vulp::observation::ObserverPipelineinline
nb_sources()vulp::observation::ObserverPipelineinline
observers()vulp::observation::ObserverPipelineinline
reset(const Dictionary &config)vulp::observation::ObserverPipeline
run(Dictionary &observation)vulp::observation::ObserverPipeline
sources()vulp::observation::ObserverPipelineinline
+
+ + + + diff --git a/classvulp_1_1observation_1_1ObserverPipeline.html b/classvulp_1_1observation_1_1ObserverPipeline.html new file mode 100644 index 00000000..ac5f5153 --- /dev/null +++ b/classvulp_1_1observation_1_1ObserverPipeline.html @@ -0,0 +1,395 @@ + + + + + + + +vulp: vulp::observation::ObserverPipeline Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::ObserverPipeline Class Reference
+
+
+ +

Observer pipeline. + More...

+ +

#include <ObserverPipeline.h>

+ + + + +

+Public Types

using iterator = ObserverPtrVector::iterator
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void reset (const Dictionary &config)
 Reset observers. More...
 
void connect_source (std::shared_ptr< Source > source)
 
void append_observer (std::shared_ptr< Observer > observer)
 
SourcePtrVector & sources ()
 Sources of the pipeline. More...
 
size_t nb_sources ()
 Number of sources in the pipeline. More...
 
ObserverPtrVector & observers ()
 Observers of the pipeline. Order matters. More...
 
size_t nb_observers ()
 Number of observers in the pipeline. More...
 
void run (Dictionary &observation)
 Run observer pipeline on an observation dictionary. More...
 
+

Detailed Description

+

Observer pipeline.

+

An observer pipeline is a list of sources and observers, to be executed in that order. Observers further down the pipeline may depend on the results of those that precede them, which are written to the observation dictionary. The pipeline is thus assumed to be topologically sorted.

+ +

Definition at line 22 of file ObserverPipeline.h.

+

Member Typedef Documentation

+ +

◆ iterator

+ +
+
+ + + + +
using vulp::observation::ObserverPipeline::iterator = ObserverPtrVector::iterator
+
+ +

Definition at line 28 of file ObserverPipeline.h.

+ +
+
+

Member Function Documentation

+ +

◆ append_observer()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::observation::ObserverPipeline::append_observer (std::shared_ptr< Observerobserver)
+
+inline
+
+ +

Definition at line 52 of file ObserverPipeline.h.

+ +
+
+ +

◆ connect_source()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::observation::ObserverPipeline::connect_source (std::shared_ptr< Sourcesource)
+
+inline
+
+ +

Definition at line 44 of file ObserverPipeline.h.

+ +
+
+ +

◆ nb_observers()

+ +
+
+ + + + + +
+ + + + + + + +
size_t vulp::observation::ObserverPipeline::nb_observers ()
+
+inline
+
+ +

Number of observers in the pipeline.

+ +

Definition at line 66 of file ObserverPipeline.h.

+ +
+
+ +

◆ nb_sources()

+ +
+
+ + + + + +
+ + + + + + + +
size_t vulp::observation::ObserverPipeline::nb_sources ()
+
+inline
+
+ +

Number of sources in the pipeline.

+ +

Definition at line 60 of file ObserverPipeline.h.

+ +
+
+ +

◆ observers()

+ +
+
+ + + + + +
+ + + + + + + +
ObserverPtrVector& vulp::observation::ObserverPipeline::observers ()
+
+inline
+
+ +

Observers of the pipeline. Order matters.

+ +

Definition at line 63 of file ObserverPipeline.h.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + + + + +
void vulp::observation::ObserverPipeline::reset (const Dictionary & config)
+
+ +

Reset observers.

+
Parameters
+ + +
[in]configOverall configuration dictionary.
+
+
+ +

Definition at line 15 of file ObserverPipeline.cpp.

+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + + +
void vulp::observation::ObserverPipeline::run (Dictionary & observation)
+
+ +

Run observer pipeline on an observation dictionary.

+
Parameters
+ + +
[in,out]observationObservation dictionary.
+
+
+ +

Definition at line 21 of file ObserverPipeline.cpp.

+ +
+
+ +

◆ sources()

+ +
+
+ + + + + +
+ + + + + + + +
SourcePtrVector& vulp::observation::ObserverPipeline::sources ()
+
+inline
+
+ +

Sources of the pipeline.

+ +

Definition at line 57 of file ObserverPipeline.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1ObserverPipeline.js b/classvulp_1_1observation_1_1ObserverPipeline.js new file mode 100644 index 00000000..a8a5eef5 --- /dev/null +++ b/classvulp_1_1observation_1_1ObserverPipeline.js @@ -0,0 +1,12 @@ +var classvulp_1_1observation_1_1ObserverPipeline = +[ + [ "iterator", "classvulp_1_1observation_1_1ObserverPipeline.html#af938c156ac8f8d3b4ad535c3073e2e15", null ], + [ "append_observer", "classvulp_1_1observation_1_1ObserverPipeline.html#ae2efd5d24271fca7cb053f9732df050f", null ], + [ "connect_source", "classvulp_1_1observation_1_1ObserverPipeline.html#ab9f3bed18ac04a0e441fd83422f010d4", null ], + [ "nb_observers", "classvulp_1_1observation_1_1ObserverPipeline.html#a98385c29632eef6f1edc9e6e1ed58f36", null ], + [ "nb_sources", "classvulp_1_1observation_1_1ObserverPipeline.html#aac2989ab99989a92a77d7e1125a0c152", null ], + [ "observers", "classvulp_1_1observation_1_1ObserverPipeline.html#a5137ef162e96278c44a05b146115c17b", null ], + [ "reset", "classvulp_1_1observation_1_1ObserverPipeline.html#a411a57b496f55b29070781481b2fd34b", null ], + [ "run", "classvulp_1_1observation_1_1ObserverPipeline.html#a56d8e82ec0322066ee77202c6a98f4be", null ], + [ "sources", "classvulp_1_1observation_1_1ObserverPipeline.html#a1757b995b52d4061bde1f043ff92ac03", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1Source-members.html b/classvulp_1_1observation_1_1Source-members.html new file mode 100644 index 00000000..a97cdf07 --- /dev/null +++ b/classvulp_1_1observation_1_1Source-members.html @@ -0,0 +1,105 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::Source Member List
+
+
+ +

This is the complete list of members for vulp::observation::Source, including all inherited members.

+ + + + +
prefix() const noexceptvulp::observation::Sourceinlinevirtual
write(Dictionary &observation)vulp::observation::Sourceinlinevirtual
~Source()vulp::observation::Sourceinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1Source.html b/classvulp_1_1observation_1_1Source.html new file mode 100644 index 00000000..1a20f563 --- /dev/null +++ b/classvulp_1_1observation_1_1Source.html @@ -0,0 +1,231 @@ + + + + + + + +vulp: vulp::observation::Source Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::Source Class Reference
+
+
+ +

Base class for sources. + More...

+ +

#include <Source.h>

+ + + + + + + + + + + +

+Public Member Functions

virtual ~Source ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
virtual std::string prefix () const noexcept
 Prefix of output in the observation dictionary. More...
 
virtual void write (Dictionary &observation)
 Write output to a dictionary. More...
 
+

Detailed Description

+

Base class for sources.

+

Sources run before observers. They write their observations without reading other observations from the pipeline, although they may of course read data from other media (such as the file system).

+ +

Definition at line 20 of file Source.h.

+

Constructor & Destructor Documentation

+ +

◆ ~Source()

+ +
+
+ + + + + +
+ + + + + + + +
virtual vulp::observation::Source::~Source ()
+
+inlinevirtual
+
+ +

Destructor is virtual to deallocate lists of observers properly.

+ +

Definition at line 23 of file Source.h.

+ +
+
+

Member Function Documentation

+ +

◆ prefix()

+ +
+
+ + + + + +
+ + + + + + + +
virtual std::string vulp::observation::Source::prefix () const
+
+inlinevirtualnoexcept
+
+ +

Prefix of output in the observation dictionary.

+

This prefix is looked up by the spine to feed observation(prefix) to the write function.

+ +

Reimplemented in vulp::observation::sources::Keyboard, vulp::observation::sources::Joystick, and vulp::observation::sources::CpuTemperature.

+ +

Definition at line 30 of file Source.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void vulp::observation::Source::write (Dictionary & observation)
+
+inlinevirtual
+
+ +

Write output to a dictionary.

+
Parameters
+ + +
[out]observationDictionary to write observations to.
+
+
+
Note
The base class writes nothing. We put an empty function here rather than making the class abstract to be able to instantiate vectors of it.
+ +

Reimplemented in vulp::observation::sources::Keyboard, vulp::observation::sources::Joystick, and vulp::observation::sources::CpuTemperature.

+ +

Definition at line 41 of file Source.h.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1Source.js b/classvulp_1_1observation_1_1Source.js new file mode 100644 index 00000000..e4c325d6 --- /dev/null +++ b/classvulp_1_1observation_1_1Source.js @@ -0,0 +1,6 @@ +var classvulp_1_1observation_1_1Source = +[ + [ "~Source", "classvulp_1_1observation_1_1Source.html#a9c713319a0579c85a702081364bbb2f1", null ], + [ "prefix", "classvulp_1_1observation_1_1Source.html#aff5c8426054622d7da7b6d023f77d40a", null ], + [ "write", "classvulp_1_1observation_1_1Source.html#a10a52aaca76bb4482c479d528748d037", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1sources_1_1CpuTemperature-members.html b/classvulp_1_1observation_1_1sources_1_1CpuTemperature-members.html new file mode 100644 index 00000000..5dbccbdb --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1CpuTemperature-members.html @@ -0,0 +1,108 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::sources::CpuTemperature Member List
+
+
+ +

This is the complete list of members for vulp::observation::sources::CpuTemperature, including all inherited members.

+ + + + + + + +
CpuTemperature(const char *temp_path="/sys/class/thermal/thermal_zone0/temp")vulp::observation::sources::CpuTemperature
is_disabled() constvulp::observation::sources::CpuTemperatureinline
prefix() const noexcept finalvulp::observation::sources::CpuTemperatureinlinevirtual
write(Dictionary &observation) finalvulp::observation::sources::CpuTemperaturevirtual
~CpuTemperature() overridevulp::observation::sources::CpuTemperature
~Source()vulp::observation::Sourceinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1CpuTemperature.html b/classvulp_1_1observation_1_1sources_1_1CpuTemperature.html new file mode 100644 index 00000000..d3ad532d --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1CpuTemperature.html @@ -0,0 +1,297 @@ + + + + + + + +vulp: vulp::observation::sources::CpuTemperature Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::sources::CpuTemperature Class Reference
+
+
+ +

Source for CPU temperature readings. + More...

+ +

#include <CpuTemperature.h>

+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 CpuTemperature (const char *temp_path="/sys/class/thermal/thermal_zone0/temp")
 Open file to query temperature from the kernel. More...
 
 ~CpuTemperature () override
 Close file. More...
 
std::string prefix () const noexcept final
 Prefix of output in the observation dictionary. More...
 
void write (Dictionary &observation) final
 Write output to a dictionary. More...
 
bool is_disabled () const
 Check if temperature observations are disabled. More...
 
- Public Member Functions inherited from vulp::observation::Source
virtual ~Source ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
+

Detailed Description

+

Source for CPU temperature readings.

+
Note
This source only works on Linux.
+ +

Definition at line 19 of file CpuTemperature.h.

+

Constructor & Destructor Documentation

+ +

◆ CpuTemperature()

+ +
+
+ + + + + + + + +
vulp::observation::sources::CpuTemperature::CpuTemperature (const char * temp_path = "/sys/class/thermal/thermal_zone0/temp")
+
+ +

Open file to query temperature from the kernel.

+
Parameters
+ + +
[in]temp_pathPath to thermal-zone special file from the Linux kernel.
+
+
+ +

Definition at line 8 of file CpuTemperature.cpp.

+ +
+
+ +

◆ ~CpuTemperature()

+ +
+
+ + + + + +
+ + + + + + + +
vulp::observation::sources::CpuTemperature::~CpuTemperature ()
+
+override
+
+ +

Close file.

+ +

Definition at line 13 of file CpuTemperature.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ is_disabled()

+ +
+
+ + + + + +
+ + + + + + + +
bool vulp::observation::sources::CpuTemperature::is_disabled () const
+
+inline
+
+ +

Check if temperature observations are disabled.

+ +

Definition at line 42 of file CpuTemperature.h.

+ +
+
+ +

◆ prefix()

+ +
+
+ + + + + +
+ + + + + + + +
std::string vulp::observation::sources::CpuTemperature::prefix () const
+
+inlinefinalvirtualnoexcept
+
+ +

Prefix of output in the observation dictionary.

+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 33 of file CpuTemperature.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::observation::sources::CpuTemperature::write (Dictionary & observation)
+
+finalvirtual
+
+ +

Write output to a dictionary.

+
Parameters
+ + +
[out]observationDictionary to write observations to.
+
+
+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 19 of file CpuTemperature.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1CpuTemperature.js b/classvulp_1_1observation_1_1sources_1_1CpuTemperature.js new file mode 100644 index 00000000..276fee79 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1CpuTemperature.js @@ -0,0 +1,8 @@ +var classvulp_1_1observation_1_1sources_1_1CpuTemperature = +[ + [ "CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63cc643a7be79d776747c14b245937fd", null ], + [ "~CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#ad9726f53ab1e7a3382db4e00279aa26a", null ], + [ "is_disabled", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#aa480657101c7adb0f59b873a57ad6cd7", null ], + [ "prefix", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a1f42b9ef3a86dd27c01d5df9c4a2d979", null ], + [ "write", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63df1f5c11f3d11d60dab2b7401defe1", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1sources_1_1Joystick-members.html b/classvulp_1_1observation_1_1sources_1_1Joystick-members.html new file mode 100644 index 00000000..96ddec8a --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Joystick-members.html @@ -0,0 +1,108 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::sources::Joystick Member List
+
+
+ +

This is the complete list of members for vulp::observation::sources::Joystick, including all inherited members.

+ + + + + + + +
Joystick(const std::string &device_path="/dev/input/js0")vulp::observation::sources::Joystick
prefix() const noexcept finalvulp::observation::sources::Joystickinlinevirtual
present() const noexceptvulp::observation::sources::Joystickinline
write(Dictionary &output) finalvulp::observation::sources::Joystickvirtual
~Joystick() overridevulp::observation::sources::Joystick
~Source()vulp::observation::Sourceinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1Joystick.html b/classvulp_1_1observation_1_1sources_1_1Joystick.html new file mode 100644 index 00000000..1aab9e98 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Joystick.html @@ -0,0 +1,298 @@ + + + + + + + +vulp: vulp::observation::sources::Joystick Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::sources::Joystick Class Reference
+
+
+ +

Source for a joystick controller. + More...

+ +

#include <Joystick.h>

+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Joystick (const std::string &device_path="/dev/input/js0")
 Open the device file. More...
 
 ~Joystick () override
 Close device file. More...
 
bool present () const noexcept
 Check if the device file was opened successfully. More...
 
std::string prefix () const noexcept final
 Prefix of output in the observation dictionary. More...
 
void write (Dictionary &output) final
 Write output to a dictionary. More...
 
- Public Member Functions inherited from vulp::observation::Source
virtual ~Source ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
+

Detailed Description

+

Source for a joystick controller.

+

Axes are the same for PS4 and Xbox controllers, but buttons differ slightly. See comments in read for the exact mapping.

+
Note
This source only works on Linux.
+ +

Definition at line 27 of file Joystick.h.

+

Constructor & Destructor Documentation

+ +

◆ Joystick()

+ +
+
+ + + + + + + + +
vulp::observation::sources::Joystick::Joystick (const std::string & device_path = "/dev/input/js0")
+
+ +

Open the device file.

+
Parameters
+ + +
[in]device_pathPath to the joystick device file.
+
+
+ +

Definition at line 8 of file Joystick.cpp.

+ +
+
+ +

◆ ~Joystick()

+ +
+
+ + + + + +
+ + + + + + + +
vulp::observation::sources::Joystick::~Joystick ()
+
+override
+
+ +

Close device file.

+ +

Definition at line 16 of file Joystick.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ prefix()

+ +
+
+ + + + + +
+ + + + + + + +
std::string vulp::observation::sources::Joystick::prefix () const
+
+inlinefinalvirtualnoexcept
+
+ +

Prefix of output in the observation dictionary.

+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 42 of file Joystick.h.

+ +
+
+ +

◆ present()

+ +
+
+ + + + + +
+ + + + + + + +
bool vulp::observation::sources::Joystick::present () const
+
+inlinenoexcept
+
+ +

Check if the device file was opened successfully.

+ +

Definition at line 39 of file Joystick.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::observation::sources::Joystick::write (Dictionary & output)
+
+finalvirtual
+
+ +

Write output to a dictionary.

+
Parameters
+ + +
[out]outputDictionary to write observations to.
+
+
+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 115 of file Joystick.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1Joystick.js b/classvulp_1_1observation_1_1sources_1_1Joystick.js new file mode 100644 index 00000000..cf64de17 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Joystick.js @@ -0,0 +1,8 @@ +var classvulp_1_1observation_1_1sources_1_1Joystick = +[ + [ "Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html#aa29b4d83c0c29179259151aeb891c0aa", null ], + [ "~Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html#a1d514247fd5f7ed3728a6a5b02c44b48", null ], + [ "prefix", "classvulp_1_1observation_1_1sources_1_1Joystick.html#a0af1bb65e8e8c27563bebdc2e80951a9", null ], + [ "present", "classvulp_1_1observation_1_1sources_1_1Joystick.html#a42caa70abe49b65862a960efaff0d624", null ], + [ "write", "classvulp_1_1observation_1_1sources_1_1Joystick.html#a8ce565ddf3ab79d790a0b231d5c9456d", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1observation_1_1sources_1_1Keyboard-members.html b/classvulp_1_1observation_1_1sources_1_1Keyboard-members.html new file mode 100644 index 00000000..7aa7f6f4 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Keyboard-members.html @@ -0,0 +1,107 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp::observation::sources::Keyboard Member List
+
+
+ +

This is the complete list of members for vulp::observation::sources::Keyboard, including all inherited members.

+ + + + + + +
Keyboard()vulp::observation::sources::Keyboard
prefix() const noexcept finalvulp::observation::sources::Keyboardinlinevirtual
write(Dictionary &output) finalvulp::observation::sources::Keyboardvirtual
~Keyboard() overridevulp::observation::sources::Keyboard
~Source()vulp::observation::Sourceinlinevirtual
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1Keyboard.html b/classvulp_1_1observation_1_1sources_1_1Keyboard.html new file mode 100644 index 00000000..10f9d4b2 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Keyboard.html @@ -0,0 +1,260 @@ + + + + + + + +vulp: vulp::observation::sources::Keyboard Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp::observation::sources::Keyboard Class Reference
+
+
+ +

Source for reading Keyboard inputs. + More...

+ +

#include <Keyboard.h>

+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Keyboard ()
 Constructor sets up the terminal in non-canonical mode where input is available immediately without waiting for a newline. More...
 
 ~Keyboard () override
 Destructor. More...
 
std::string prefix () const noexcept final
 Prefix of output in the observation dictionary. More...
 
void write (Dictionary &output) final
 Write output to a dictionary. More...
 
- Public Member Functions inherited from vulp::observation::Source
virtual ~Source ()
 Destructor is virtual to deallocate lists of observers properly. More...
 
+

Detailed Description

+

Source for reading Keyboard inputs.

+
Note
This source reads from the standard input, and does not listen to Keyboard events. It can only read one key at a time.
+
+Long key presses will yield an output boolean that goes to true, then false, then stays at true until the key is released. This behavior is tied to the key repetition delay of the keyboard: https://github.com/upkie/vulp/issues/49
+ +

Definition at line 71 of file Keyboard.h.

+

Constructor & Destructor Documentation

+ +

◆ Keyboard()

+ +
+
+ + + + + + + +
vulp::observation::sources::Keyboard::Keyboard ()
+
+ +

Constructor sets up the terminal in non-canonical mode where input is available immediately without waiting for a newline.

+ +

Definition at line 7 of file Keyboard.cpp.

+ +
+
+ +

◆ ~Keyboard()

+ +
+
+ + + + + +
+ + + + + + + +
vulp::observation::sources::Keyboard::~Keyboard ()
+
+override
+
+ +

Destructor.

+ +

Definition at line 20 of file Keyboard.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ prefix()

+ +
+
+ + + + + +
+ + + + + + + +
std::string vulp::observation::sources::Keyboard::prefix () const
+
+inlinefinalvirtualnoexcept
+
+ +

Prefix of output in the observation dictionary.

+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 82 of file Keyboard.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp::observation::sources::Keyboard::write (Dictionary & output)
+
+finalvirtual
+
+ +

Write output to a dictionary.

+
Parameters
+ + +
[out]outputDictionary to write observations to.
+
+
+ +

Reimplemented from vulp::observation::Source.

+ +

Definition at line 83 of file Keyboard.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1observation_1_1sources_1_1Keyboard.js b/classvulp_1_1observation_1_1sources_1_1Keyboard.js new file mode 100644 index 00000000..a0e418f6 --- /dev/null +++ b/classvulp_1_1observation_1_1sources_1_1Keyboard.js @@ -0,0 +1,7 @@ +var classvulp_1_1observation_1_1sources_1_1Keyboard = +[ + [ "Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html#a3a397c882016fbb734f2fb445c29d39b", null ], + [ "~Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html#a662c1d7cab92bf282a19463a84340c0f", null ], + [ "prefix", "classvulp_1_1observation_1_1sources_1_1Keyboard.html#a74f9aafe3336163bca381653b8db911e", null ], + [ "write", "classvulp_1_1observation_1_1sources_1_1Keyboard.html#a772779999809525853d22389b0ffba0e", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1spine_1_1AgentInterface-members.html b/classvulp_1_1spine_1_1AgentInterface-members.html new file mode 100644 index 00000000..b5430db0 --- /dev/null +++ b/classvulp_1_1spine_1_1AgentInterface-members.html @@ -0,0 +1,109 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine::AgentInterface Member List
+
+
+ +

This is the complete list of members for vulp.spine::AgentInterface, including all inherited members.

+ + + + + + + + +
AgentInterface(const std::string &name, size_t size)vulp.spine::AgentInterface
data() constvulp.spine::AgentInterfaceinline
request() constvulp.spine::AgentInterfaceinline
set_request(Request request)vulp.spine::AgentInterface
size() constvulp.spine::AgentInterfaceinline
write(char *data, size_t size)vulp.spine::AgentInterface
~AgentInterface()vulp.spine::AgentInterface
+
+ + + + diff --git a/classvulp_1_1spine_1_1AgentInterface.html b/classvulp_1_1spine_1_1AgentInterface.html new file mode 100644 index 00000000..57c952b1 --- /dev/null +++ b/classvulp_1_1spine_1_1AgentInterface.html @@ -0,0 +1,359 @@ + + + + + + + +vulp: vulp.spine::AgentInterface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.spine::AgentInterface Class Reference
+
+
+ +

Memory map to shared memory. + More...

+ +

#include <AgentInterface.h>

+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 AgentInterface (const std::string &name, size_t size)
 Open interface to the agent at a given shared-memory file. More...
 
 ~AgentInterface ()
 Unmap memory and unlink shared memory object. More...
 
void set_request (Request request)
 Set current request in shared memory. More...
 
void write (char *data, size_t size)
 Write data to the data buffer in shared memory. More...
 
Request request () const
 Get current request from shared memory. More...
 
uint32_t size () const
 Get size of current data buffer. More...
 
const char * data () const
 Get pointer to data buffer. More...
 
+

Detailed Description

+

Memory map to shared memory.

+

On memory mapping, shared memory and memory-mapped files: https://w3.cs.jmu.edu/kirkpams/OpenCSF/Books/csf/html/MMap.html

+ +

Definition at line 32 of file AgentInterface.h.

+

Constructor & Destructor Documentation

+ +

◆ AgentInterface()

+ +
+
+ + + + + + + + + + + + + + + + + + +
vulp.spine::AgentInterface::AgentInterface (const std::string & name,
size_t size 
)
+
+ +

Open interface to the agent at a given shared-memory file.

+
Parameters
+ + + +
[in]nameName of the shared memory file (e.g. "/vulp").
[in]sizeSize in bytes.
+
+
+

Shared memory objects are available as files in /dev/shm.

+ +

Definition at line 32 of file AgentInterface.cpp.

+ +
+
+ +

◆ ~AgentInterface()

+ +
+
+ + + + + + + +
vulp.spine::AgentInterface::~AgentInterface ()
+
+ +

Unmap memory and unlink shared memory object.

+ +

Definition at line 76 of file AgentInterface.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ data()

+ +
+
+ + + + + +
+ + + + + + + +
const char* vulp.spine::AgentInterface::data () const
+
+inline
+
+ +

Get pointer to data buffer.

+ +

Definition at line 66 of file AgentInterface.h.

+ +
+
+ +

◆ request()

+ +
+
+ + + + + +
+ + + + + + + +
Request vulp.spine::AgentInterface::request () const
+
+inline
+
+ +

Get current request from shared memory.

+ +

Definition at line 60 of file AgentInterface.h.

+ +
+
+ +

◆ set_request()

+ +
+
+ + + + + + + + +
void vulp.spine::AgentInterface::set_request (Request request)
+
+ +

Set current request in shared memory.

+
Parameters
+ + +
[in]requestNew request.
+
+
+ +

Definition at line 85 of file AgentInterface.cpp.

+ +
+
+ +

◆ size()

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t vulp.spine::AgentInterface::size () const
+
+inline
+
+ +

Get size of current data buffer.

+ +

Definition at line 63 of file AgentInterface.h.

+ +
+
+ +

◆ write()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void vulp.spine::AgentInterface::write (char * data,
size_t size 
)
+
+ +

Write data to the data buffer in shared memory.

+
Parameters
+ + + +
[in]dataData to write.
[in]sizeNumber of bytes to write.
+
+
+ +

Definition at line 89 of file AgentInterface.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1AgentInterface.js b/classvulp_1_1spine_1_1AgentInterface.js new file mode 100644 index 00000000..c8da459c --- /dev/null +++ b/classvulp_1_1spine_1_1AgentInterface.js @@ -0,0 +1,10 @@ +var classvulp_1_1spine_1_1AgentInterface = +[ + [ "AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html#ae188b4cdae97d1556b0f19cf3780cc6e", null ], + [ "~AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html#aa1f13c476e68abb4b9ac4c62269bdf50", null ], + [ "data", "classvulp_1_1spine_1_1AgentInterface.html#ae530d9f802a29ea464ec4c280a428f6a", null ], + [ "request", "classvulp_1_1spine_1_1AgentInterface.html#afbe5e2c09cd343f179dcc7a97a3228b3", null ], + [ "set_request", "classvulp_1_1spine_1_1AgentInterface.html#a03c363ea6525fc4a52a34690f30b6cf7", null ], + [ "size", "classvulp_1_1spine_1_1AgentInterface.html#a1c5ed95ec40decdc148a36f433112554", null ], + [ "write", "classvulp_1_1spine_1_1AgentInterface.html#a1996190b31a6bf6f9c530107f4cfce50", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1spine_1_1Spine-members.html b/classvulp_1_1spine_1_1Spine-members.html new file mode 100644 index 00000000..98677089 --- /dev/null +++ b/classvulp_1_1spine_1_1Spine-members.html @@ -0,0 +1,120 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine::Spine Member List
+
+
+ +

This is the complete list of members for vulp.spine::Spine, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
actuation_vulp.spine::Spineprotected
actuation_output_vulp.spine::Spineprotected
agent_interface_vulp.spine::Spineprotected
caught_interrupt_vulp.spine::Spineprotected
cycle()vulp.spine::Spine
frequency_vulp.spine::Spineprotected
ipc_buffer_vulp.spine::Spineprotected
latest_replies_vulp.spine::Spineprotected
logger_vulp.spine::Spineprotected
observer_pipeline_vulp.spine::Spineprotected
reset(const palimpsest::Dictionary &config)vulp.spine::Spine
run()vulp.spine::Spine
simulate(unsigned nb_substeps)vulp.spine::Spine
Spine(const Parameters &params, actuation::Interface &interface, observation::ObserverPipeline &observers)vulp.spine::Spine
state_cycle_beginning_vulp.spine::Spineprotected
state_cycle_end_vulp.spine::Spineprotected
state_machine_vulp.spine::Spineprotected
working_dict_vulp.spine::Spineprotected
+
+ + + + diff --git a/classvulp_1_1spine_1_1Spine.html b/classvulp_1_1spine_1_1Spine.html new file mode 100644 index 00000000..f1bd57db --- /dev/null +++ b/classvulp_1_1spine_1_1Spine.html @@ -0,0 +1,682 @@ + + + + + + + +vulp: vulp.spine::Spine Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.spine::Spine Class Reference
+
+
+ +

Loop transmitting actions to the actuation and observations to the agent. + More...

+ +

#include <Spine.h>

+ + + + + +

+Classes

struct  Parameters
 Spine parameters. More...
 
+ + + + + + + + + + + + + + + + +

+Public Member Functions

 Spine (const Parameters &params, actuation::Interface &interface, observation::ObserverPipeline &observers)
 Initialize spine. More...
 
void reset (const palimpsest::Dictionary &config)
 Reset the spine with a new configuration. More...
 
void run ()
 Run the spine loop until termination. More...
 
void cycle ()
 Spin one cycle of the spine loop. More...
 
void simulate (unsigned nb_substeps)
 Alternative to run where the actuation interface is cycled a fixed number of times, and communication cycles are not frequency-regulated. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

const unsigned frequency_
 Frequency of the spine loop in [Hz]. More...
 
actuation::Interfaceactuation_
 Interface that communicates with actuators. More...
 
AgentInterface agent_interface_
 Shared memory mapping for inter-process communication. More...
 
std::future< actuation::moteus::Output > actuation_output_
 Future used to wait for moteus replies. More...
 
std::vector< actuation::moteus::ServoReply > latest_replies_
 Latest servo replies. They are copied and thread-safe. More...
 
palimpsest::Dictionary working_dict_
 All data from observation to action goes to this dictionary. More...
 
observation::ObserverPipeline observer_pipeline_
 Pipeline of observers, executed in that order. More...
 
mpacklog::Logger logger_
 Logger for the working_dict_ produced at each cycle. More...
 
std::vector< char > ipc_buffer_
 Buffer used to serialize/deserialize dictionaries in IPC. More...
 
const bool & caught_interrupt_
 Boolean flag that becomes true when an interruption is caught. More...
 
StateMachine state_machine_
 Internal state machine. More...
 
State state_cycle_beginning_
 State after the last Event::kCycleBeginning. More...
 
State state_cycle_end_
 State after the last Event::kCycleEnd. More...
 
+

Detailed Description

+

Loop transmitting actions to the actuation and observations to the agent.

+

The spine acts as the intermediary between the actuation interface (e.g. moteus servos connected to the CAN-FD bus) and an agent communicating over shared memory (the agent interface). It packs observations to the agent from actuation replies and commands to the actuation from agent actions.

+

The spine processes requests at the beginning and end of each control cycle according to its StateMachine. The overall specification of the state machine is summarized in the following diagram:

+
+ +
+

See StateMachine for more details.

+ +

Definition at line 45 of file Spine.h.

+

Constructor & Destructor Documentation

+ +

◆ Spine()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
vulp.spine::Spine::Spine (const Parametersparams,
actuation::Interfaceinterface,
observation::ObserverPipelineobservers 
)
+
+ +

Initialize spine.

+
Parameters
+ + + + +
[in]paramsSpine parameters.
[in,out]interfaceInterface to actuators.
[in,out]observersPipeline of observers to run, in that order, at each cycle.
+
+
+ +

Definition at line 24 of file Spine.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ cycle()

+ +
+
+ + + + + + + +
void vulp.spine::Spine::cycle ()
+
+ +

Spin one cycle of the spine loop.

+ +

Definition at line 96 of file Spine.cpp.

+ +
+
+ +

◆ reset()

+ +
+
+ + + + + + + + +
void vulp.spine::Spine::reset (const palimpsest::Dictionary & config)
+
+ +

Reset the spine with a new configuration.

+
Parameters
+ + +
[in]configNew global configuration dictionary, used to derive the servo layout (which servo is on which bus, corresponds to which joint) and forwarded to other components (e.g. observers).
+
+
+ +

Definition at line 58 of file Spine.cpp.

+ +
+
+ +

◆ run()

+ +
+
+ + + + + + + +
void vulp.spine::Spine::run ()
+
+ +

Run the spine loop until termination.

+

Each iteration of the loop runs observers, computes the action and cycles the actuation interface. Additionally, this function collects debug values and logs everything.

+
Note
The spine will catch keyboard interrupts once this function is called.
+ +

Definition at line 80 of file Spine.cpp.

+ +
+
+ +

◆ simulate()

+ +
+
+ + + + + + + + +
void vulp.spine::Spine::simulate (unsigned nb_substeps)
+
+ +

Alternative to run where the actuation interface is cycled a fixed number of times, and communication cycles are not frequency-regulated.

+
Parameters
+ + +
[in]nb_substepsNumber of actuation cycles per action.
+
+
+

Thus function assumes the agent alternates acting and observing. Simulation steps are triggered at startup (to construct the initial observation) and at each action request.

+
Note
As its name suggests, do not use this function on a real robot.
+

Note that there is currently a delay of three substeps between observation and simulation. That is, the internal simulation state is always three substeps ahead compared to the values written to the observation dictionary in cycle_actuation. This decision is discussed in https://github.com/orgs/upkie/discussions/238#discussioncomment-8984290

+ +

Definition at line 102 of file Spine.cpp.

+ +
+
+

Member Data Documentation

+ +

◆ actuation_

+ +
+
+ + + + + +
+ + + + +
actuation::Interface& vulp.spine::Spine::actuation_
+
+protected
+
+ +

Interface that communicates with actuators.

+

The actuation interface communicates over the CAN-FD bus on real robots. Otherwise, it can be for instance a mock or a simulator interface.

+ +

Definition at line 146 of file Spine.h.

+ +
+
+ +

◆ actuation_output_

+ +
+
+ + + + + +
+ + + + +
std::future<actuation::moteus::Output> vulp.spine::Spine::actuation_output_
+
+protected
+
+ +

Future used to wait for moteus replies.

+ +

Definition at line 152 of file Spine.h.

+ +
+
+ +

◆ agent_interface_

+ +
+
+ + + + + +
+ + + + +
AgentInterface vulp.spine::Spine::agent_interface_
+
+protected
+
+ +

Shared memory mapping for inter-process communication.

+ +

Definition at line 149 of file Spine.h.

+ +
+
+ +

◆ caught_interrupt_

+ +
+
+ + + + + +
+ + + + +
const bool& vulp.spine::Spine::caught_interrupt_
+
+protected
+
+ +

Boolean flag that becomes true when an interruption is caught.

+ +

Definition at line 170 of file Spine.h.

+ +
+
+ +

◆ frequency_

+ +
+
+ + + + + +
+ + + + +
const unsigned vulp.spine::Spine::frequency_
+
+protected
+
+ +

Frequency of the spine loop in [Hz].

+ +

Definition at line 139 of file Spine.h.

+ +
+
+ +

◆ ipc_buffer_

+ +
+
+ + + + + +
+ + + + +
std::vector<char> vulp.spine::Spine::ipc_buffer_
+
+protected
+
+ +

Buffer used to serialize/deserialize dictionaries in IPC.

+ +

Definition at line 167 of file Spine.h.

+ +
+
+ +

◆ latest_replies_

+ +
+
+ + + + + +
+ + + + +
std::vector<actuation::moteus::ServoReply> vulp.spine::Spine::latest_replies_
+
+protected
+
+ +

Latest servo replies. They are copied and thread-safe.

+ +

Definition at line 155 of file Spine.h.

+ +
+
+ +

◆ logger_

+ +
+
+ + + + + +
+ + + + +
mpacklog::Logger vulp.spine::Spine::logger_
+
+protected
+
+ +

Logger for the working_dict_ produced at each cycle.

+ +

Definition at line 164 of file Spine.h.

+ +
+
+ +

◆ observer_pipeline_

+ +
+
+ + + + + +
+ + + + +
observation::ObserverPipeline vulp.spine::Spine::observer_pipeline_
+
+protected
+
+ +

Pipeline of observers, executed in that order.

+ +

Definition at line 161 of file Spine.h.

+ +
+
+ +

◆ state_cycle_beginning_

+ +
+
+ + + + + +
+ + + + +
State vulp.spine::Spine::state_cycle_beginning_
+
+protected
+
+ +

State after the last Event::kCycleBeginning.

+ +

Definition at line 176 of file Spine.h.

+ +
+
+ +

◆ state_cycle_end_

+ +
+
+ + + + + +
+ + + + +
State vulp.spine::Spine::state_cycle_end_
+
+protected
+
+ +

State after the last Event::kCycleEnd.

+ +

Definition at line 179 of file Spine.h.

+ +
+
+ +

◆ state_machine_

+ +
+
+ + + + + +
+ + + + +
StateMachine vulp.spine::Spine::state_machine_
+
+protected
+
+ +

Internal state machine.

+ +

Definition at line 173 of file Spine.h.

+ +
+
+ +

◆ working_dict_

+ +
+
+ + + + + +
+ + + + +
palimpsest::Dictionary vulp.spine::Spine::working_dict_
+
+protected
+
+ +

All data from observation to action goes to this dictionary.

+ +

Definition at line 158 of file Spine.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1Spine.js b/classvulp_1_1spine_1_1Spine.js new file mode 100644 index 00000000..5c08456e --- /dev/null +++ b/classvulp_1_1spine_1_1Spine.js @@ -0,0 +1,22 @@ +var classvulp_1_1spine_1_1Spine = +[ + [ "Parameters", "structvulp_1_1spine_1_1Spine_1_1Parameters.html", "structvulp_1_1spine_1_1Spine_1_1Parameters" ], + [ "Spine", "classvulp_1_1spine_1_1Spine.html#af3f09675c956d6c7eeb116210e3fa973", null ], + [ "cycle", "classvulp_1_1spine_1_1Spine.html#aa362cc84873d2ffa1359a73efd5441f9", null ], + [ "reset", "classvulp_1_1spine_1_1Spine.html#a422e9d2f95cf562a05dc994a9385c188", null ], + [ "run", "classvulp_1_1spine_1_1Spine.html#a31497eb1f54c8876a843a00268dce14c", null ], + [ "simulate", "classvulp_1_1spine_1_1Spine.html#a5dfa447b98c55c3caca1f06aed23a4dd", null ], + [ "actuation_", "classvulp_1_1spine_1_1Spine.html#ac5140f68adf3ad4a1db44aecf7e5b74b", null ], + [ "actuation_output_", "classvulp_1_1spine_1_1Spine.html#a0cdd75b5375864a16dc3acd7bc662e8a", null ], + [ "agent_interface_", "classvulp_1_1spine_1_1Spine.html#a00d150f97b2ede19b540f2b554dc2ded", null ], + [ "caught_interrupt_", "classvulp_1_1spine_1_1Spine.html#abba8605f39e2d5fec65425980bab7137", null ], + [ "frequency_", "classvulp_1_1spine_1_1Spine.html#a0f3f391aee9e28c9720703e78783d84d", null ], + [ "ipc_buffer_", "classvulp_1_1spine_1_1Spine.html#a74511847ef40db4668a8a26ddf6916c8", null ], + [ "latest_replies_", "classvulp_1_1spine_1_1Spine.html#a961c5ef602634734b6e75e667574e90c", null ], + [ "logger_", "classvulp_1_1spine_1_1Spine.html#a0060f951f291ff3f707393e7d2563e36", null ], + [ "observer_pipeline_", "classvulp_1_1spine_1_1Spine.html#a5aae68ebd2f703f2c2dfdeb54f99c0a5", null ], + [ "state_cycle_beginning_", "classvulp_1_1spine_1_1Spine.html#a3a39717160c48c39e6b13fab3f82f036", null ], + [ "state_cycle_end_", "classvulp_1_1spine_1_1Spine.html#a3cb0cc80e3ee3412f6c84c9cdc87f6aa", null ], + [ "state_machine_", "classvulp_1_1spine_1_1Spine.html#a54ac730b1f049078c57e578373b9d421", null ], + [ "working_dict_", "classvulp_1_1spine_1_1Spine.html#ad6b50ac8ebf63ef239bcff853125fc81", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1spine_1_1StateMachine-members.html b/classvulp_1_1spine_1_1StateMachine-members.html new file mode 100644 index 00000000..502064fb --- /dev/null +++ b/classvulp_1_1spine_1_1StateMachine-members.html @@ -0,0 +1,106 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine::StateMachine Member List
+
+
+ +

This is the complete list of members for vulp.spine::StateMachine, including all inherited members.

+ + + + + +
is_over_after_this_cycle() const noexceptvulp.spine::StateMachineinline
process_event(const Event &event) noexceptvulp.spine::StateMachine
state() const noexceptvulp.spine::StateMachineinline
StateMachine(AgentInterface &interface) noexceptvulp.spine::StateMachineexplicit
+
+ + + + diff --git a/classvulp_1_1spine_1_1StateMachine.html b/classvulp_1_1spine_1_1StateMachine.html new file mode 100644 index 00000000..d6b59840 --- /dev/null +++ b/classvulp_1_1spine_1_1StateMachine.html @@ -0,0 +1,291 @@ + + + + + + + +vulp: vulp.spine::StateMachine Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.spine::StateMachine Class Reference
+
+
+ +

Spine state machine. + More...

+ +

#include <StateMachine.h>

+ + + + + + + + + + + + + + +

+Public Member Functions

 StateMachine (AgentInterface &interface) noexcept
 Initialize state machine. More...
 
void process_event (const Event &event) noexcept
 Process a new event. More...
 
const Statestate () const noexcept
 Get current state. More...
 
bool is_over_after_this_cycle () const noexcept
 Whether we transition to the terminal state at the next end-cycle event. More...
 
+

Detailed Description

+

Spine state machine.

+

The overall specification of the state machine is summarized in the following diagram:

+
+ +
+

States have the following purposes:

+
    +
  • Stop: do nothing, send stop commands to servos
  • +
  • Reset: apply runtime configuration to actuation interface and observers
      +
    • The reset state is not time-critical, i.e., configuration can take time.
    • +
    +
  • +
  • Idle: do nothing
  • +
  • Observe: write observation from the actuation interface
  • +
  • Act: send action to the actuation interface
  • +
  • Shutdown: terminal state, exit the control loop
  • +
+

There are three possible events:

+
    +
  • begin: beginning of a control cycle,
  • +
  • end: end of a control cycle.
  • +
  • SIGINT: the process received an interrupt signal.
  • +
+

Guards, indicated between brackets, may involve two variables:

+
    +
  • req: the current request from the agent.
  • +
  • stop_cycles: the number of stop commands cycled in the current state (only available in "stop" and "shutdown" states).
  • +
+ +

Definition at line 88 of file StateMachine.h.

+

Constructor & Destructor Documentation

+ +

◆ StateMachine()

+ +
+
+ + + + + +
+ + + + + + + + +
vulp.spine::StateMachine::StateMachine (AgentInterfaceinterface)
+
+explicitnoexcept
+
+ +

Initialize state machine.

+
Parameters
+ + +
[in]interfaceInterface to communicate with the agent.
+
+
+ +

Definition at line 12 of file StateMachine.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ is_over_after_this_cycle()

+ +
+
+ + + + + +
+ + + + + + + +
bool vulp.spine::StateMachine::is_over_after_this_cycle () const
+
+inlinenoexcept
+
+ +

Whether we transition to the terminal state at the next end-cycle event.

+ +

Definition at line 106 of file StateMachine.h.

+ +
+
+ +

◆ process_event()

+ +
+
+ + + + + +
+ + + + + + + + +
void vulp.spine::StateMachine::process_event (const Eventevent)
+
+noexcept
+
+ +

Process a new event.

+
Parameters
+ + +
[in]eventNew event.
+
+
+ +

Definition at line 17 of file StateMachine.cpp.

+ +
+
+ +

◆ state()

+ +
+
+ + + + + +
+ + + + + + + +
const State& vulp.spine::StateMachine::state () const
+
+inlinenoexcept
+
+ +

Get current state.

+ +

Definition at line 103 of file StateMachine.h.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1StateMachine.js b/classvulp_1_1spine_1_1StateMachine.js new file mode 100644 index 00000000..99a15282 --- /dev/null +++ b/classvulp_1_1spine_1_1StateMachine.js @@ -0,0 +1,7 @@ +var classvulp_1_1spine_1_1StateMachine = +[ + [ "StateMachine", "classvulp_1_1spine_1_1StateMachine.html#acc1608eb36870a89aba2f563220819ee", null ], + [ "is_over_after_this_cycle", "classvulp_1_1spine_1_1StateMachine.html#ae3883e0306f844b7ce6e95fc931e75f3", null ], + [ "process_event", "classvulp_1_1spine_1_1StateMachine.html#a44d4c72635480d0f4c9574d4a9833e5c", null ], + [ "state", "classvulp_1_1spine_1_1StateMachine.html#ace23c634b58a586edc4ca244675e29ff", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html b/classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html new file mode 100644 index 00000000..cb920c8e --- /dev/null +++ b/classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html @@ -0,0 +1,110 @@ + + + + + + + +vulp: vulp.spine.exceptions.PerformanceIssue Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine.exceptions.PerformanceIssue Class Reference
+
+
+ +

Exception raised when a performance issue is detected. + More...

+

Detailed Description

+

Exception raised when a performance issue is detected.

+ +

Definition at line 15 of file exceptions.py.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1exceptions_1_1SpineError.html b/classvulp_1_1spine_1_1exceptions_1_1SpineError.html new file mode 100644 index 00000000..4e7c3bf8 --- /dev/null +++ b/classvulp_1_1spine_1_1exceptions_1_1SpineError.html @@ -0,0 +1,110 @@ + + + + + + + +vulp: vulp.spine.exceptions.SpineError Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine.exceptions.SpineError Class Reference
+
+
+ +

Exception raised when the spine sets an error flag in the request field of the shared memory map. + More...

+

Detailed Description

+

Exception raised when the spine sets an error flag in the request field of the shared memory map.

+ +

Definition at line 21 of file exceptions.py.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1exceptions_1_1VulpException.html b/classvulp_1_1spine_1_1exceptions_1_1VulpException.html new file mode 100644 index 00000000..334fd846 --- /dev/null +++ b/classvulp_1_1spine_1_1exceptions_1_1VulpException.html @@ -0,0 +1,110 @@ + + + + + + + +vulp: vulp.spine.exceptions.VulpException Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine.exceptions.VulpException Class Reference
+
+
+ +

Base class for exceptions raised by Vulp. + More...

+

Detailed Description

+

Base class for exceptions raised by Vulp.

+ +

Definition at line 9 of file exceptions.py.

+

The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1request_1_1Request-members.html b/classvulp_1_1spine_1_1request_1_1Request-members.html new file mode 100644 index 00000000..a0129168 --- /dev/null +++ b/classvulp_1_1spine_1_1request_1_1Request-members.html @@ -0,0 +1,108 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine.request.Request Member List
+
+
+ +

This is the complete list of members for vulp.spine.request.Request, including all inherited members.

+ + + + + + + +
kActionvulp.spine.request.Requeststatic
kErrorvulp.spine.request.Requeststatic
kNonevulp.spine.request.Requeststatic
kObservationvulp.spine.request.Requeststatic
kStartvulp.spine.request.Requeststatic
kStopvulp.spine.request.Requeststatic
+
+ + + + diff --git a/classvulp_1_1spine_1_1request_1_1Request.html b/classvulp_1_1spine_1_1request_1_1Request.html new file mode 100644 index 00000000..ec6fb7ca --- /dev/null +++ b/classvulp_1_1spine_1_1request_1_1Request.html @@ -0,0 +1,275 @@ + + + + + + + +vulp: vulp.spine.request.Request Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.spine.request.Request Class Reference
+
+
+ +

Flag set by the agent to request an operation from the spine. + More...

+ + + + + + + + + + + + + + +

+Static Public Attributes

int kNone = 0
 
int kObservation = 1
 
int kAction = 2
 
int kStart = 3
 
int kStop = 4
 
int kError = 5
 
+

Detailed Description

+

Flag set by the agent to request an operation from the spine.

+

Once the spine has processed the request, it resets the flag to kNone in shared memory.

+ +

Definition at line 10 of file request.py.

+

Member Data Documentation

+ +

◆ kAction

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kAction = 2
+
+static
+
+ +

Definition at line 21 of file request.py.

+ +
+
+ +

◆ kError

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kError = 5
+
+static
+
+ +

Definition at line 24 of file request.py.

+ +
+
+ +

◆ kNone

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kNone = 0
+
+static
+
+ +

Definition at line 19 of file request.py.

+ +
+
+ +

◆ kObservation

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kObservation = 1
+
+static
+
+ +

Definition at line 20 of file request.py.

+ +
+
+ +

◆ kStart

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kStart = 3
+
+static
+
+ +

Definition at line 22 of file request.py.

+ +
+
+ +

◆ kStop

+ +
+
+ + + + + +
+ + + + +
int vulp.spine.request.Request.kStop = 4
+
+static
+
+ +

Definition at line 23 of file request.py.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface-members.html b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface-members.html new file mode 100644 index 00000000..cd57eae8 --- /dev/null +++ b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface-members.html @@ -0,0 +1,109 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.spine.spine_interface.SpineInterface Member List
+
+
+ +

This is the complete list of members for vulp.spine.spine_interface.SpineInterface, including all inherited members.

+ + + + + + + + +
__del__(self)vulp.spine.spine_interface.SpineInterface
__init__(self, str shm_name="/vulp", int retries=1, bool perf_checks=True)vulp.spine.spine_interface.SpineInterface
get_first_observation(self)vulp.spine.spine_interface.SpineInterface
get_observation(self)vulp.spine.spine_interface.SpineInterface
set_action(self, dict action)vulp.spine.spine_interface.SpineInterface
start(self, dict config)vulp.spine.spine_interface.SpineInterface
stop(self)vulp.spine.spine_interface.SpineInterface
+
+ + + + diff --git a/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html new file mode 100644 index 00000000..bceb3dde --- /dev/null +++ b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html @@ -0,0 +1,351 @@ + + + + + + + +vulp: vulp.spine.spine_interface.SpineInterface Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.spine.spine_interface.SpineInterface Class Reference
+
+
+ +

Interface to interact with a spine from a Python agent. + More...

+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

def __init__ (self, str shm_name="/vulp", int retries=1, bool perf_checks=True)
 Connect to the spine shared memory. More...
 
def __del__ (self)
 Close memory mapping. More...
 
dict get_observation (self)
 Ask the spine to write the latest observation to shared memory. More...
 
dict get_first_observation (self)
 Get first observation after a reset. More...
 
None set_action (self, dict action)
 
None start (self, dict config)
 Reset the spine to a new configuration. More...
 
None stop (self)
 Tell the spine to stop all actuators. More...
 
+

Detailed Description

+

Interface to interact with a spine from a Python agent.

+ +

Definition at line 60 of file spine_interface.py.

+

Constructor & Destructor Documentation

+ +

◆ __init__()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
def vulp.spine.spine_interface.SpineInterface.__init__ ( self,
str  shm_name = "/vulp",
int  retries = 1,
bool  perf_checks = True 
)
+
+ +

Connect to the spine shared memory.

+
Parameters
+ + + + +
shm_nameName of the shared memory object.
retriesNumber of times to try opening the shared-memory file.
perf_checksIf true, run performance checks after construction.
+
+
+ +

Definition at line 68 of file spine_interface.py.

+ +
+
+ +

◆ __del__()

+ +
+
+ + + + + + + + +
def vulp.spine.spine_interface.SpineInterface.__del__ ( self)
+
+ +

Close memory mapping.

+

Note that the spine process will unlink the shared memory object, so we don't unlink it here.

+ +

Definition at line 97 of file spine_interface.py.

+ +
+
+

Member Function Documentation

+ +

◆ get_first_observation()

+ +
+
+ + + + + + + + +
dict vulp.spine.spine_interface.SpineInterface.get_first_observation ( self)
+
+ +

Get first observation after a reset.

+
Returns
Observation dictionary.
+ +

Definition at line 123 of file spine_interface.py.

+ +
+
+ +

◆ get_observation()

+ +
+
+ + + + + + + + +
dict vulp.spine.spine_interface.SpineInterface.get_observation ( self)
+
+ +

Ask the spine to write the latest observation to shared memory.

+
Returns
Observation dictionary.
+
Note
In simulation, the first observation after a reset was collected before that reset. Use get_first_observation in that case to skip to the first post-reset observation.
+ +

Definition at line 107 of file spine_interface.py.

+ +
+
+ +

◆ set_action()

+ +
+
+ + + + + + + + + + + + + + + + + + +
None vulp.spine.spine_interface.SpineInterface.set_action ( self,
dict action 
)
+
+ +

Definition at line 132 of file spine_interface.py.

+ +
+
+ +

◆ start()

+ +
+
+ + + + + + + + + + + + + + + + + + +
None vulp.spine.spine_interface.SpineInterface.start ( self,
dict config 
)
+
+ +

Reset the spine to a new configuration.

+
Parameters
+ + +
configConfiguration dictionary.
+
+
+ +

Definition at line 137 of file spine_interface.py.

+ +
+
+ +

◆ stop()

+ +
+
+ + + + + + + + +
None vulp.spine.spine_interface.SpineInterface.stop ( self)
+
+ +

Tell the spine to stop all actuators.

+ +

Definition at line 147 of file spine_interface.py.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ + + + diff --git a/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.js b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.js new file mode 100644 index 00000000..b0950682 --- /dev/null +++ b/classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.js @@ -0,0 +1,10 @@ +var classvulp_1_1spine_1_1spine__interface_1_1SpineInterface = +[ + [ "__init__", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a66b1bc70850b8e120c2a0df6cc1775a7", null ], + [ "__del__", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a63d8286efc24e65ba6a63667d7e54ecc", null ], + [ "get_first_observation", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aca235a9ef5bb357d939d133bc7a1ed43", null ], + [ "get_observation", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a38501b691c8efab6eae04853f88bd6a1", null ], + [ "set_action", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a2eb6a040f56937b3c7c0b5aa668fa95e", null ], + [ "start", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a62b07a000db69ac2ade003c34d728b02", null ], + [ "stop", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aec2e958f961ea163d1b1a78a155d3f2a", null ] +]; \ No newline at end of file diff --git a/classvulp_1_1utils_1_1SynchronousClock-members.html b/classvulp_1_1utils_1_1SynchronousClock-members.html new file mode 100644 index 00000000..439948f3 --- /dev/null +++ b/classvulp_1_1utils_1_1SynchronousClock-members.html @@ -0,0 +1,107 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp.utils::SynchronousClock Member List
+
+
+ +

This is the complete list of members for vulp.utils::SynchronousClock, including all inherited members.

+ + + + + + +
measured_period() const noexceptvulp.utils::SynchronousClockinline
skip_count() const noexceptvulp.utils::SynchronousClockinline
slack() const noexceptvulp.utils::SynchronousClockinline
SynchronousClock(double frequency)vulp.utils::SynchronousClockexplicit
wait_for_next_tick()vulp.utils::SynchronousClock
+
+ + + + diff --git a/classvulp_1_1utils_1_1SynchronousClock.html b/classvulp_1_1utils_1_1SynchronousClock.html new file mode 100644 index 00000000..c796925b --- /dev/null +++ b/classvulp_1_1utils_1_1SynchronousClock.html @@ -0,0 +1,285 @@ + + + + + + + +vulp: vulp.utils::SynchronousClock Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
vulp.utils::SynchronousClock Class Reference
+
+
+ +

Synchronous (blocking) clock. + More...

+ +

#include <SynchronousClock.h>

+ + + + + + + + + + + + + + + + + +

+Public Member Functions

 SynchronousClock (double frequency)
 Initialize clock. More...
 
void wait_for_next_tick ()
 Wait until the next tick of the internal clock. More...
 
double measured_period () const noexcept
 Get measured period in seconds. More...
 
int skip_count () const noexcept
 Get last number of clock cycles skipped. More...
 
double slack () const noexcept
 Get the last sleep duration duration in seconds. More...
 
+

Detailed Description

+

Synchronous (blocking) clock.

+

This clock ticks at a fixed frequency. It provides a method to wait for the next tick (which is always blocking, see below), and reports missed ticks if applicable.

+

The difference between a blocking clock and a rate limiter lies in the behavior when skipping cycles. A rate limiter does nothing if there is no time left, as the caller's rate does not need to be limited. On the contrary, a synchronous clock waits for the next tick, which is by definition in the future, so it always waits for a non-zero duration.

+

Internally all durations in this class are stored in microseconds.

+ +

Definition at line 26 of file SynchronousClock.h.

+

Constructor & Destructor Documentation

+ +

◆ SynchronousClock()

+ +
+
+ + + + + +
+ + + + + + + + +
vulp.utils::SynchronousClock::SynchronousClock (double frequency)
+
+explicit
+
+ +

Initialize clock.

+
Parameters
+ + +
frequencyDesired tick frequency in [Hz]. It should be an integer that divides one million.
+
+
+ +

Definition at line 20 of file SynchronousClock.cpp.

+ +
+
+

Member Function Documentation

+ +

◆ measured_period()

+ +
+
+ + + + + +
+ + + + + + + +
double vulp.utils::SynchronousClock::measured_period () const
+
+inlinenoexcept
+
+ +

Get measured period in seconds.

+ +

Definition at line 45 of file SynchronousClock.h.

+ +
+
+ +

◆ skip_count()

+ +
+
+ + + + + +
+ + + + + + + +
int vulp.utils::SynchronousClock::skip_count () const
+
+inlinenoexcept
+
+ +

Get last number of clock cycles skipped.

+ +

Definition at line 48 of file SynchronousClock.h.

+ +
+
+ +

◆ slack()

+ +
+
+ + + + + +
+ + + + + + + +
double vulp.utils::SynchronousClock::slack () const
+
+inlinenoexcept
+
+ +

Get the last sleep duration duration in seconds.

+ +

Definition at line 51 of file SynchronousClock.h.

+ +
+
+ +

◆ wait_for_next_tick()

+ +
+
+ + + + + + + +
void vulp.utils::SynchronousClock::wait_for_next_tick ()
+
+ +

Wait until the next tick of the internal clock.

+
Note
This function will always block and wait for the next tick into the future. It will warn if it detects some missed ticks since the last call.
+ +

Definition at line 39 of file SynchronousClock.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ + + + diff --git a/classvulp_1_1utils_1_1SynchronousClock.js b/classvulp_1_1utils_1_1SynchronousClock.js new file mode 100644 index 00000000..96c01491 --- /dev/null +++ b/classvulp_1_1utils_1_1SynchronousClock.js @@ -0,0 +1,8 @@ +var classvulp_1_1utils_1_1SynchronousClock = +[ + [ "SynchronousClock", "classvulp_1_1utils_1_1SynchronousClock.html#a68625e8c2ac5ce10018cd3e38f400ebe", null ], + [ "measured_period", "classvulp_1_1utils_1_1SynchronousClock.html#a38f9298dd6d373b8930416ae3146f4de", null ], + [ "skip_count", "classvulp_1_1utils_1_1SynchronousClock.html#a44480a4608ae3b5d5a74dcd97a7b8f75", null ], + [ "slack", "classvulp_1_1utils_1_1SynchronousClock.html#aca17e08b153c266fc0fd202822ea3194", null ], + [ "wait_for_next_tick", "classvulp_1_1utils_1_1SynchronousClock.html#a8b04ab90ec9ca81016bfed118a0b1a10", null ] +]; \ No newline at end of file diff --git a/closed.png b/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/closed.png differ diff --git a/default__action_8h.html b/default__action_8h.html new file mode 100644 index 00000000..7d2759ce --- /dev/null +++ b/default__action_8h.html @@ -0,0 +1,138 @@ + + + + + + + +vulp: vulp/actuation/default_action.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
default_action.h File Reference
+
+
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp::actuation
 Send actions to actuators or simulators.
 
 vulp::actuation::default_action
 
+ + + + + + + + + + + +

+Variables

constexpr double vulp::actuation::default_action::kFeedforwardTorque = 0.0
 
constexpr double vulp::actuation::default_action::kVelocity = 0.0
 
constexpr double vulp::actuation::default_action::kKpScale = 1.0
 
constexpr double vulp::actuation::default_action::kKdScale = 1.0
 
constexpr double vulp::actuation::default_action::kMaximumTorque = 1.0
 
+
+
+ + + + diff --git a/default__action_8h.js b/default__action_8h.js new file mode 100644 index 00000000..6f9cc45f --- /dev/null +++ b/default__action_8h.js @@ -0,0 +1,8 @@ +var default__action_8h = +[ + [ "kFeedforwardTorque", "default__action_8h.html#acd6b5f4fab30ca4fa011b072eb178db3", null ], + [ "kKdScale", "default__action_8h.html#a37fdf95f3ecb19b772ed1ed45b5864e9", null ], + [ "kKpScale", "default__action_8h.html#a9b7395da45f48d599f21ac8d53358a02", null ], + [ "kMaximumTorque", "default__action_8h.html#a162f94f351be65ad299e955232e415aa", null ], + [ "kVelocity", "default__action_8h.html#a1f6d1969f4382b8e086bb89c0514760d", null ] +]; \ No newline at end of file diff --git a/default__action_8h__dep__incl.map b/default__action_8h__dep__incl.map new file mode 100644 index 00000000..14790ca7 --- /dev/null +++ b/default__action_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/default__action_8h__dep__incl.md5 b/default__action_8h__dep__incl.md5 new file mode 100644 index 00000000..70cd9133 --- /dev/null +++ b/default__action_8h__dep__incl.md5 @@ -0,0 +1 @@ +030cd76e77f86a4c26c4ecbf11646a04 \ No newline at end of file diff --git a/default__action_8h__dep__incl.png b/default__action_8h__dep__incl.png new file mode 100644 index 00000000..8cd9313f Binary files /dev/null and b/default__action_8h__dep__incl.png differ diff --git a/default__action_8h_source.html b/default__action_8h_source.html new file mode 100644 index 00000000..60904f5d --- /dev/null +++ b/default__action_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/actuation/default_action.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
default_action.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2023 Inria
+
3 
+
4 #pragma once
+
5 
+
6 namespace vulp::actuation {
+
7 
+
8 namespace default_action {
+
9 
+
10 constexpr double kFeedforwardTorque = 0.0; // N.m
+
11 constexpr double kVelocity = 0.0; // rad/s
+
12 constexpr double kKpScale = 1.0; // no unit
+
13 constexpr double kKdScale = 1.0; // no unit
+
14 constexpr double kMaximumTorque = 1.0; // N.m
+
15 
+
16 } // namespace default_action
+
17 
+
18 } // namespace vulp::actuation
+ + + + +
constexpr double kFeedforwardTorque
+
Send actions to actuators or simulators.
Definition: bullet_utils.h:13
+
+
+ + + + diff --git a/dir_000001_000006.html b/dir_000001_000006.html new file mode 100644 index 00000000..59dd0c30 --- /dev/null +++ b/dir_000001_000006.html @@ -0,0 +1,96 @@ + + + + + + + +vulp: vulp/actuation -> utils Relation + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

actuation → utils Relation

File in vulp/actuationIncludes file in vulp/utils
Pi3HatInterface.hrealtime.h
+
+ + + + diff --git a/dir_000005_000001.html b/dir_000005_000001.html new file mode 100644 index 00000000..131943c0 --- /dev/null +++ b/dir_000005_000001.html @@ -0,0 +1,96 @@ + + + + + + + +vulp: vulp/spine -> actuation Relation + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

spine → actuation Relation

File in vulp/spineIncludes file in vulp/actuation
Spine.hInterface.h
+
+ + + + diff --git a/dir_000005_000003.html b/dir_000005_000003.html new file mode 100644 index 00000000..77b33134 --- /dev/null +++ b/dir_000005_000003.html @@ -0,0 +1,96 @@ + + + + + + + +vulp: vulp/spine -> observation Relation + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

spine → observation Relation

File in vulp/spineIncludes file in vulp/observation
Spine.hobserve_servos.h
Spine.hobserve_time.h
Spine.hObserverPipeline.h
+
+ + + + diff --git a/dir_000005_000006.html b/dir_000005_000006.html new file mode 100644 index 00000000..9f49eb21 --- /dev/null +++ b/dir_000005_000006.html @@ -0,0 +1,96 @@ + + + + + + + +vulp: vulp/spine -> utils Relation + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+

spine → utils Relation

File in vulp/spineIncludes file in vulp/utils
Spine.hhandle_interrupts.h
Spine.hrealtime.h
Spine.hSynchronousClock.h
StateMachine.cpphandle_interrupts.h
+
+ + + + diff --git a/dir_27fdad92f183d08847377ce77063c2a3.html b/dir_27fdad92f183d08847377ce77063c2a3.html new file mode 100644 index 00000000..34d64abc --- /dev/null +++ b/dir_27fdad92f183d08847377ce77063c2a3.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/utils Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
utils Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+Files

file  __init__.py [code]
 
file  handle_interrupts.cpp [code]
 
file  handle_interrupts.h [code]
 
file  low_pass_filter.h [code]
 
file  math.h [code]
 
file  random_string.h [code]
 
file  realtime.h [code]
 
file  serialize.py [code]
 
file  SynchronousClock.cpp [code]
 
file  SynchronousClock.h [code]
 
+
+
+ + + + diff --git a/dir_27fdad92f183d08847377ce77063c2a3.js b/dir_27fdad92f183d08847377ce77063c2a3.js new file mode 100644 index 00000000..a0fe67c6 --- /dev/null +++ b/dir_27fdad92f183d08847377ce77063c2a3.js @@ -0,0 +1,15 @@ +var dir_27fdad92f183d08847377ce77063c2a3 = +[ + [ "__init__.py", "utils_2____init_____8py.html", "utils_2____init_____8py" ], + [ "handle_interrupts.cpp", "handle__interrupts_8cpp.html", "handle__interrupts_8cpp" ], + [ "handle_interrupts.h", "handle__interrupts_8h.html", "handle__interrupts_8h" ], + [ "low_pass_filter.h", "low__pass__filter_8h.html", "low__pass__filter_8h" ], + [ "math.h", "math_8h.html", "math_8h" ], + [ "random_string.h", "random__string_8h.html", "random__string_8h" ], + [ "realtime.h", "realtime_8h.html", "realtime_8h" ], + [ "serialize.py", "serialize_8py.html", "serialize_8py" ], + [ "SynchronousClock.cpp", "SynchronousClock_8cpp.html", null ], + [ "SynchronousClock.h", "SynchronousClock_8h.html", [ + [ "SynchronousClock", "classvulp_1_1utils_1_1SynchronousClock.html", "classvulp_1_1utils_1_1SynchronousClock" ] + ] ] +]; \ No newline at end of file diff --git a/dir_2c90065d9b3e245ac0aba12bc2d37fee.html b/dir_2c90065d9b3e245ac0aba12bc2d37fee.html new file mode 100644 index 00000000..7aafc71f --- /dev/null +++ b/dir_2c90065d9b3e245ac0aba12bc2d37fee.html @@ -0,0 +1,125 @@ + + + + + + + +vulp: vulp/observation/sources Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
sources Directory Reference
+
+
+
+Directory dependency graph for sources:
+
+
vulp/observation/sources
+ + + + +
+ + + + + + + + + + + + + + +

+Files

file  CpuTemperature.cpp [code]
 
file  CpuTemperature.h [code]
 
file  Joystick.cpp [code]
 
file  Joystick.h [code]
 
file  Keyboard.cpp [code]
 
file  Keyboard.h [code]
 
+
+
+ + + + diff --git a/dir_2c90065d9b3e245ac0aba12bc2d37fee.js b/dir_2c90065d9b3e245ac0aba12bc2d37fee.js new file mode 100644 index 00000000..36001653 --- /dev/null +++ b/dir_2c90065d9b3e245ac0aba12bc2d37fee.js @@ -0,0 +1,9 @@ +var dir_2c90065d9b3e245ac0aba12bc2d37fee = +[ + [ "CpuTemperature.cpp", "CpuTemperature_8cpp.html", null ], + [ "CpuTemperature.h", "CpuTemperature_8h.html", "CpuTemperature_8h" ], + [ "Joystick.cpp", "Joystick_8cpp.html", null ], + [ "Joystick.h", "Joystick_8h.html", "Joystick_8h" ], + [ "Keyboard.cpp", "Keyboard_8cpp.html", null ], + [ "Keyboard.h", "Keyboard_8h.html", "Keyboard_8h" ] +]; \ No newline at end of file diff --git a/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.map b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.map new file mode 100644 index 00000000..e31494c8 --- /dev/null +++ b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.map @@ -0,0 +1,4 @@ + + + + diff --git a/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.md5 b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.md5 new file mode 100644 index 00000000..7eb92d4e --- /dev/null +++ b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.md5 @@ -0,0 +1 @@ +dd2879b6b139adad7661174f31346a66 \ No newline at end of file diff --git a/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.png b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.png new file mode 100644 index 00000000..b0ba39bf Binary files /dev/null and b/dir_2c90065d9b3e245ac0aba12bc2d37fee_dep.png differ diff --git a/dir_48b927d7dec9ed7311ba15ea585d91e7.html b/dir_48b927d7dec9ed7311ba15ea585d91e7.html new file mode 100644 index 00000000..1295b81d --- /dev/null +++ b/dir_48b927d7dec9ed7311ba15ea585d91e7.html @@ -0,0 +1,131 @@ + + + + + + + +vulp: vulp Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
vulp Directory Reference
+
+
+
+Directory dependency graph for vulp:
+
+
vulp
+ + + + + + + + + + + + +
+ + + + + + + + + + + + +

+Directories

directory  actuation
 
directory  control
 
directory  observation
 
directory  spine
 
directory  utils
 
+
+
+ + + + diff --git a/dir_48b927d7dec9ed7311ba15ea585d91e7.js b/dir_48b927d7dec9ed7311ba15ea585d91e7.js new file mode 100644 index 00000000..fd80e014 --- /dev/null +++ b/dir_48b927d7dec9ed7311ba15ea585d91e7.js @@ -0,0 +1,8 @@ +var dir_48b927d7dec9ed7311ba15ea585d91e7 = +[ + [ "actuation", "dir_9d5cff624cbb8b86e00f4d9f231f0448.html", "dir_9d5cff624cbb8b86e00f4d9f231f0448" ], + [ "control", "dir_ce63330e843d33999781c00720b60ac3.html", "dir_ce63330e843d33999781c00720b60ac3" ], + [ "observation", "dir_e7811e66c239a6f6f927707cc114be4f.html", "dir_e7811e66c239a6f6f927707cc114be4f" ], + [ "spine", "dir_8710f232fe2dd0ce2bee37e6570d7f32.html", "dir_8710f232fe2dd0ce2bee37e6570d7f32" ], + [ "utils", "dir_27fdad92f183d08847377ce77063c2a3.html", "dir_27fdad92f183d08847377ce77063c2a3" ] +]; \ No newline at end of file diff --git a/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.map b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.map new file mode 100644 index 00000000..01501178 --- /dev/null +++ b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.map @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.md5 b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.md5 new file mode 100644 index 00000000..3bf52237 --- /dev/null +++ b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.md5 @@ -0,0 +1 @@ +1d113d668fef4d382fa90353f914bfda \ No newline at end of file diff --git a/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.png b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.png new file mode 100644 index 00000000..c057f628 Binary files /dev/null and b/dir_48b927d7dec9ed7311ba15ea585d91e7_dep.png differ diff --git a/dir_8710f232fe2dd0ce2bee37e6570d7f32.html b/dir_8710f232fe2dd0ce2bee37e6570d7f32.html new file mode 100644 index 00000000..aeba0557 --- /dev/null +++ b/dir_8710f232fe2dd0ce2bee37e6570d7f32.html @@ -0,0 +1,142 @@ + + + + + + + +vulp: vulp/spine Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
spine Directory Reference
+
+
+
+Directory dependency graph for spine:
+
+
vulp/spine
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  __init__.py [code]
 
file  AgentInterface.cpp [code]
 
file  AgentInterface.h [code]
 
file  exceptions.py [code]
 
file  Request.h [code]
 
file  request.py [code]
 
file  Spine.cpp [code]
 
file  Spine.h [code]
 
file  spine_interface.py [code]
 
file  StateMachine.cpp [code]
 
file  StateMachine.h [code]
 
+
+
+ + + + diff --git a/dir_8710f232fe2dd0ce2bee37e6570d7f32.js b/dir_8710f232fe2dd0ce2bee37e6570d7f32.js new file mode 100644 index 00000000..2be2564a --- /dev/null +++ b/dir_8710f232fe2dd0ce2bee37e6570d7f32.js @@ -0,0 +1,22 @@ +var dir_8710f232fe2dd0ce2bee37e6570d7f32 = +[ + [ "__init__.py", "spine_2____init_____8py.html", "spine_2____init_____8py" ], + [ "AgentInterface.cpp", "AgentInterface_8cpp.html", "AgentInterface_8cpp" ], + [ "AgentInterface.h", "AgentInterface_8h.html", [ + [ "AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html", "classvulp_1_1spine_1_1AgentInterface" ] + ] ], + [ "exceptions.py", "exceptions_8py.html", [ + [ "VulpException", "classvulp_1_1spine_1_1exceptions_1_1VulpException.html", null ], + [ "PerformanceIssue", "classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html", null ], + [ "SpineError", "classvulp_1_1spine_1_1exceptions_1_1SpineError.html", null ] + ] ], + [ "Request.h", "Request_8h.html", "Request_8h" ], + [ "request.py", "request_8py.html", [ + [ "Request", "classvulp_1_1spine_1_1request_1_1Request.html", null ] + ] ], + [ "Spine.cpp", "Spine_8cpp.html", null ], + [ "Spine.h", "Spine_8h.html", "Spine_8h" ], + [ "spine_interface.py", "spine__interface_8py.html", "spine__interface_8py" ], + [ "StateMachine.cpp", "StateMachine_8cpp.html", null ], + [ "StateMachine.h", "StateMachine_8h.html", "StateMachine_8h" ] +]; \ No newline at end of file diff --git a/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.map b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.map new file mode 100644 index 00000000..4aedf1b7 --- /dev/null +++ b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.md5 b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.md5 new file mode 100644 index 00000000..4e4dc681 --- /dev/null +++ b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.md5 @@ -0,0 +1 @@ +d8c4c6c7729ea34b5a25ba9c0cc5695c \ No newline at end of file diff --git a/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.png b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.png new file mode 100644 index 00000000..2645c0c7 Binary files /dev/null and b/dir_8710f232fe2dd0ce2bee37e6570d7f32_dep.png differ diff --git a/dir_9d5cff624cbb8b86e00f4d9f231f0448.html b/dir_9d5cff624cbb8b86e00f4d9f231f0448.html new file mode 100644 index 00000000..383970f3 --- /dev/null +++ b/dir_9d5cff624cbb8b86e00f4d9f231f0448.html @@ -0,0 +1,147 @@ + + + + + + + +vulp: vulp/actuation Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
actuation Directory Reference
+
+
+
+Directory dependency graph for actuation:
+
+
vulp/actuation
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  bullet_utils.h [code]
 
file  BulletContactData.h [code]
 
file  BulletImuData.h [code]
 
file  BulletInterface.cpp [code]
 
file  BulletInterface.h [code]
 
file  BulletJointProperties.h [code]
 
file  default_action.h [code]
 
file  ImuData.h [code]
 
file  Interface.cpp [code]
 
file  Interface.h [code]
 
file  MockInterface.cpp [code]
 
file  MockInterface.h [code]
 
file  Pi3HatInterface.cpp [code]
 
file  Pi3HatInterface.h [code]
 
file  resolution.h [code]
 
file  ServoLayout.h [code]
 
+
+
+ + + + diff --git a/dir_9d5cff624cbb8b86e00f4d9f231f0448.js b/dir_9d5cff624cbb8b86e00f4d9f231f0448.js new file mode 100644 index 00000000..3d017cb0 --- /dev/null +++ b/dir_9d5cff624cbb8b86e00f4d9f231f0448.js @@ -0,0 +1,36 @@ +var dir_9d5cff624cbb8b86e00f4d9f231f0448 = +[ + [ "bullet_utils.h", "bullet__utils_8h.html", "bullet__utils_8h" ], + [ "BulletContactData.h", "BulletContactData_8h.html", [ + [ "BulletContactData", "structvulp_1_1actuation_1_1BulletContactData.html", "structvulp_1_1actuation_1_1BulletContactData" ] + ] ], + [ "BulletImuData.h", "BulletImuData_8h.html", [ + [ "BulletImuData", "structvulp_1_1actuation_1_1BulletImuData.html", "structvulp_1_1actuation_1_1BulletImuData" ] + ] ], + [ "BulletInterface.cpp", "BulletInterface_8cpp.html", "BulletInterface_8cpp" ], + [ "BulletInterface.h", "BulletInterface_8h.html", [ + [ "BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html", "classvulp_1_1actuation_1_1BulletInterface" ], + [ "Parameters", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters" ] + ] ], + [ "BulletJointProperties.h", "BulletJointProperties_8h.html", [ + [ "BulletJointProperties", "structvulp_1_1actuation_1_1BulletJointProperties.html", "structvulp_1_1actuation_1_1BulletJointProperties" ] + ] ], + [ "default_action.h", "default__action_8h.html", "default__action_8h" ], + [ "ImuData.h", "ImuData_8h.html", [ + [ "ImuData", "structvulp_1_1actuation_1_1ImuData.html", "structvulp_1_1actuation_1_1ImuData" ] + ] ], + [ "Interface.cpp", "Interface_8cpp.html", null ], + [ "Interface.h", "Interface_8h.html", [ + [ "Interface", "classvulp_1_1actuation_1_1Interface.html", "classvulp_1_1actuation_1_1Interface" ] + ] ], + [ "MockInterface.cpp", "MockInterface_8cpp.html", null ], + [ "MockInterface.h", "MockInterface_8h.html", [ + [ "MockInterface", "classvulp_1_1actuation_1_1MockInterface.html", "classvulp_1_1actuation_1_1MockInterface" ] + ] ], + [ "Pi3HatInterface.cpp", "Pi3HatInterface_8cpp.html", null ], + [ "Pi3HatInterface.h", "Pi3HatInterface_8h.html", "Pi3HatInterface_8h" ], + [ "resolution.h", "resolution_8h.html", "resolution_8h" ], + [ "ServoLayout.h", "ServoLayout_8h.html", [ + [ "ServoLayout", "classvulp_1_1actuation_1_1ServoLayout.html", "classvulp_1_1actuation_1_1ServoLayout" ] + ] ] +]; \ No newline at end of file diff --git a/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.map b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.map new file mode 100644 index 00000000..bc4b860d --- /dev/null +++ b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.md5 b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.md5 new file mode 100644 index 00000000..2ac6f2af --- /dev/null +++ b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.md5 @@ -0,0 +1 @@ +6d290c10df5b68bb61e95c9be6ecb2ea \ No newline at end of file diff --git a/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.png b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.png new file mode 100644 index 00000000..80ca3bc8 Binary files /dev/null and b/dir_9d5cff624cbb8b86e00f4d9f231f0448_dep.png differ diff --git a/dir_ce63330e843d33999781c00720b60ac3.html b/dir_ce63330e843d33999781c00720b60ac3.html new file mode 100644 index 00000000..38fa4b19 --- /dev/null +++ b/dir_ce63330e843d33999781c00720b60ac3.html @@ -0,0 +1,106 @@ + + + + + + + +vulp: vulp/control Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
control Directory Reference
+
+
+ + + + +

+Files

file  Controller.h [code]
 
+
+
+ + + + diff --git a/dir_ce63330e843d33999781c00720b60ac3.js b/dir_ce63330e843d33999781c00720b60ac3.js new file mode 100644 index 00000000..cc3efedb --- /dev/null +++ b/dir_ce63330e843d33999781c00720b60ac3.js @@ -0,0 +1,6 @@ +var dir_ce63330e843d33999781c00720b60ac3 = +[ + [ "Controller.h", "Controller_8h.html", [ + [ "Controller", "classvulp_1_1control_1_1Controller.html", "classvulp_1_1control_1_1Controller" ] + ] ] +]; \ No newline at end of file diff --git a/dir_e7811e66c239a6f6f927707cc114be4f.html b/dir_e7811e66c239a6f6f927707cc114be4f.html new file mode 100644 index 00000000..e6232791 --- /dev/null +++ b/dir_e7811e66c239a6f6f927707cc114be4f.html @@ -0,0 +1,135 @@ + + + + + + + +vulp: vulp/observation Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
observation Directory Reference
+
+
+
+Directory dependency graph for observation:
+
+
vulp/observation
+ + + + + +
+ + + + +

+Directories

directory  sources
 
+ + + + + + + + + + + + + + + + + +

+Files

file  HistoryObserver.h [code]
 
file  observe_servos.cpp [code]
 
file  observe_servos.h [code]
 
file  observe_time.h [code]
 
file  Observer.h [code]
 
file  ObserverPipeline.cpp [code]
 
file  ObserverPipeline.h [code]
 
file  Source.h [code]
 
+
+
+ + + + diff --git a/dir_e7811e66c239a6f6f927707cc114be4f.js b/dir_e7811e66c239a6f6f927707cc114be4f.js new file mode 100644 index 00000000..3fc70228 --- /dev/null +++ b/dir_e7811e66c239a6f6f927707cc114be4f.js @@ -0,0 +1,20 @@ +var dir_e7811e66c239a6f6f927707cc114be4f = +[ + [ "sources", "dir_2c90065d9b3e245ac0aba12bc2d37fee.html", "dir_2c90065d9b3e245ac0aba12bc2d37fee" ], + [ "HistoryObserver.h", "HistoryObserver_8h.html", [ + [ "HistoryObserver", "classvulp_1_1observation_1_1HistoryObserver.html", "classvulp_1_1observation_1_1HistoryObserver" ] + ] ], + [ "observe_servos.cpp", "observe__servos_8cpp.html", "observe__servos_8cpp" ], + [ "observe_servos.h", "observe__servos_8h.html", "observe__servos_8h" ], + [ "observe_time.h", "observe__time_8h.html", "observe__time_8h" ], + [ "Observer.h", "Observer_8h.html", [ + [ "Observer", "classvulp_1_1observation_1_1Observer.html", "classvulp_1_1observation_1_1Observer" ] + ] ], + [ "ObserverPipeline.cpp", "ObserverPipeline_8cpp.html", null ], + [ "ObserverPipeline.h", "ObserverPipeline_8h.html", [ + [ "ObserverPipeline", "classvulp_1_1observation_1_1ObserverPipeline.html", "classvulp_1_1observation_1_1ObserverPipeline" ] + ] ], + [ "Source.h", "Source_8h.html", [ + [ "Source", "classvulp_1_1observation_1_1Source.html", "classvulp_1_1observation_1_1Source" ] + ] ] +]; \ No newline at end of file diff --git a/dir_e7811e66c239a6f6f927707cc114be4f_dep.map b/dir_e7811e66c239a6f6f927707cc114be4f_dep.map new file mode 100644 index 00000000..c115d0cb --- /dev/null +++ b/dir_e7811e66c239a6f6f927707cc114be4f_dep.map @@ -0,0 +1,5 @@ + + + + + diff --git a/dir_e7811e66c239a6f6f927707cc114be4f_dep.md5 b/dir_e7811e66c239a6f6f927707cc114be4f_dep.md5 new file mode 100644 index 00000000..19865d7d --- /dev/null +++ b/dir_e7811e66c239a6f6f927707cc114be4f_dep.md5 @@ -0,0 +1 @@ +c9c44ec588e191abe18245f2fe81572d \ No newline at end of file diff --git a/dir_e7811e66c239a6f6f927707cc114be4f_dep.png b/dir_e7811e66c239a6f6f927707cc114be4f_dep.png new file mode 100644 index 00000000..f6feacbf Binary files /dev/null and b/dir_e7811e66c239a6f6f927707cc114be4f_dep.png differ diff --git a/doc.png b/doc.png new file mode 100644 index 00000000..17edabff Binary files /dev/null and b/doc.png differ diff --git a/doxygen-awesome.css b/doxygen-awesome.css new file mode 100644 index 00000000..5f420dc4 --- /dev/null +++ b/doxygen-awesome.css @@ -0,0 +1,2135 @@ +/** + +Doxygen Awesome +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +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. + +*/ + +html { + /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */ + --primary-color: #1779c4; + --primary-dark-color: #335c80; + --primary-light-color: #70b1e9; + + /* page base colors */ + --page-background-color: white; + --page-foreground-color: #2f4153; + --page-secondary-foreground-color: #637485; + + /* color for all separators on the website: hr, borders, ... */ + --separator-color: #dedede; + + /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */ + --border-radius-large: 8px; + --border-radius-small: 4px; + --border-radius-medium: 6px; + + /* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */ + --spacing-small: 5px; + --spacing-medium: 10px; + --spacing-large: 16px; + + /* default box shadow used for raising an element above the normal content. Used in dropdowns, Searchresult, ... */ + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075); + + --odd-color: rgba(0,0,0,.028); + + /* font-families. will affect all text on the website + * font-family: the normal font for text, headlines, menus + * font-family-monospace: used for preformatted text in memtitle, code, fragments + */ + --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif; + --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace; + + /* font sizes */ + --page-font-size: 15.6px; + --navigation-font-size: 14.4px; + --code-font-size: 14px; /* affects code, fragment */ + --title-font-size: 22px; + + /* content text properties. These only affect the page content, not the navigation or any other ui elements */ + --content-line-height: 27px; + /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/ + --content-maxwidth: 1000px; + + /* colors for various content boxes: @warning, @note, @deprecated @bug */ + --warning-color: #f8d1cc; + --warning-color-dark: #b61825; + --warning-color-darker: #75070f; + --note-color: #faf3d8; + --note-color-dark: #f3a600; + --note-color-darker: #5f4204; + --todo-color: #e4f3ff; + --todo-color-dark: #1879C4; + --todo-color-darker: #274a5c; + --deprecated-color: #ecf0f3; + --deprecated-color-dark: #5b6269; + --deprecated-color-darker: #43454a; + --bug-color: #e4dafd; + --bug-color-dark: #5b2bdd; + --bug-color-darker: #2a0d72; + --invariant-color: #d8f1e3; + --invariant-color-dark: #44b86f; + --invariant-color-darker: #265532; + + /* blockquote colors */ + --blockquote-background: #f8f9fa; + --blockquote-foreground: #636568; + + /* table colors */ + --tablehead-background: #f1f1f1; + --tablehead-foreground: var(--page-foreground-color); + + /* menu-display: block | none + * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible. + * `GENERATE_TREEVIEW` MUST be enabled! + */ + --menu-display: block; + + --menu-focus-foreground: var(--page-background-color); + --menu-focus-background: var(--primary-color); + --menu-selected-background: rgba(0,0,0,.05); + + + --header-background: var(--page-background-color); + --header-foreground: var(--page-foreground-color); + + /* searchbar colors */ + --searchbar-background: var(--side-nav-background); + --searchbar-foreground: var(--page-foreground-color); + + /* searchbar size + * (`searchbar-width` is only applied on screens >= 768px. + * on smaller screens the searchbar will always fill the entire screen width) */ + --searchbar-height: 33px; + --searchbar-width: 210px; + --searchbar-border-radius: var(--searchbar-height); + + /* code block colors */ + --code-background: #f5f5f5; + --code-foreground: var(--page-foreground-color); + + /* fragment colors */ + --fragment-background: #F8F9FA; + --fragment-foreground: #37474F; + --fragment-keyword: #bb6bb2; + --fragment-keywordtype: #8258b3; + --fragment-keywordflow: #d67c3b; + --fragment-token: #438a59; + --fragment-comment: #969696; + --fragment-link: #5383d6; + --fragment-preprocessor: #46aaa5; + --fragment-linenumber-color: #797979; + --fragment-linenumber-background: #f4f4f5; + --fragment-linenumber-border: #e3e5e7; + --fragment-lineheight: 20px; + + /* sidebar navigation (treeview) colors */ + --side-nav-background: #fbfbfb; + --side-nav-foreground: var(--page-foreground-color); + --side-nav-arrow-opacity: 0; + --side-nav-arrow-hover-opacity: 0.9; + + --toc-background: var(--side-nav-background); + --toc-foreground: var(--side-nav-foreground); + + /* height of an item in any tree / collapsable table */ + --tree-item-height: 30px; + + --memname-font-size: var(--code-font-size); + --memtitle-font-size: 18px; + + --webkit-scrollbar-size: 7px; + --webkit-scrollbar-padding: 4px; + --webkit-scrollbar-color: var(--separator-color); +} + +@media screen and (max-width: 767px) { + html { + --page-font-size: 16px; + --navigation-font-size: 16px; + --code-font-size: 15px; /* affects code, fragment */ + --title-font-size: 22px; + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; + } +} + +/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */ +html.dark-mode { + color-scheme: dark; + + --primary-color: #1982d2; + --primary-dark-color: #86a9c4; + --primary-light-color: #4779ac; + + --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30); + + --odd-color: rgba(100,100,100,.06); + + --menu-selected-background: rgba(0,0,0,.4); + + --page-background-color: #1C1D1F; + --page-foreground-color: #d2dbde; + --page-secondary-foreground-color: #859399; + --separator-color: #38393b; + --side-nav-background: #252628; + + --code-background: #2a2c2f; + + --tablehead-background: #2a2c2f; + + --blockquote-background: #222325; + --blockquote-foreground: #7e8c92; + + --warning-color: #2e1917; + --warning-color-dark: #ad2617; + --warning-color-darker: #f5b1aa; + --note-color: #3b2e04; + --note-color-dark: #f1b602; + --note-color-darker: #ceb670; + --todo-color: #163750; + --todo-color-dark: #1982D2; + --todo-color-darker: #dcf0fa; + --deprecated-color: #2e323b; + --deprecated-color-dark: #738396; + --deprecated-color-darker: #abb0bd; + --bug-color: #2a2536; + --bug-color-dark: #7661b3; + --bug-color-darker: #ae9ed6; + --invariant-color: #303a35; + --invariant-color-dark: #76ce96; + --invariant-color-darker: #cceed5; + + --fragment-background: #282c34; + --fragment-foreground: #dbe4eb; + --fragment-keyword: #cc99cd; + --fragment-keywordtype: #ab99cd; + --fragment-keywordflow: #e08000; + --fragment-token: #7ec699; + --fragment-comment: #999999; + --fragment-link: #98c0e3; + --fragment-preprocessor: #65cabe; + --fragment-linenumber-color: #cccccc; + --fragment-linenumber-background: #35393c; + --fragment-linenumber-border: #1f1f1f; +} + +body { + color: var(--page-foreground-color); + background-color: var(--page-background-color); + font-size: var(--page-font-size); +} + +body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover { + font-family: var(--font-family); +} + +h1, h2, h3, h4, h5 { + margin-top: .9em; + font-weight: 600; + line-height: initial; +} + +p, div, table, dl { + font-size: var(--page-font-size); +} + +a:link, a:visited, a:hover, a:focus, a:active { + color: var(--primary-color) !important; + font-weight: 500; +} + +a.anchor { + scroll-margin-top: var(--spacing-large); +} + +/* + Title and top navigation + */ + +#top { + background: var(--header-background); + border-bottom: 1px solid var(--separator-color); +} + +@media screen and (min-width: 768px) { + #top { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + } +} + +#main-nav { + flex-grow: 5; + padding: var(--spacing-small) var(--spacing-medium); +} + +#titlearea { + width: auto; + padding: var(--spacing-medium) var(--spacing-large); + background: none; + color: var(--header-foreground); + border-bottom: none; +} + +@media screen and (max-width: 767px) { + #titlearea { + padding-bottom: var(--spacing-small); + } +} + +#titlearea table tbody tr { + height: auto !important; +} + +#projectname { + font-size: var(--title-font-size); + font-weight: 600; +} + +#projectnumber { + font-family: inherit; + font-size: 60%; +} + +#projectbrief { + font-family: inherit; + font-size: 80%; +} + +#projectlogo { + vertical-align: middle; +} + +#projectlogo img { + max-height: calc(var(--title-font-size) * 2); + margin-right: var(--spacing-small); +} + +.sm-dox, .tabs, .tabs2, .tabs3 { + background: none; + padding: 0; +} + +.tabs, .tabs2, .tabs3 { + border-bottom: 1px solid var(--separator-color); + margin-bottom: -1px; +} + +@media screen and (max-width: 767px) { + .sm-dox a span.sub-arrow { + background: var(--code-background); + } + + #main-menu a.has-submenu span.sub-arrow { + color: var(--page-secondary-foreground-color); + border-radius: var(--border-radius-medium); + } + + #main-menu a.has-submenu:hover span.sub-arrow { + color: var(--page-foreground-color); + } +} + +@media screen and (min-width: 768px) { + .sm-dox li, .tablist li { + display: var(--menu-display); + } + + .sm-dox a span.sub-arrow { + border-color: var(--header-foreground) transparent transparent transparent; + } + + .sm-dox a:hover span.sub-arrow { + border-color: var(--menu-focus-foreground) transparent transparent transparent; + } + + .sm-dox ul a span.sub-arrow { + border-color: transparent transparent transparent var(--page-foreground-color); + } + + .sm-dox ul a:hover span.sub-arrow { + border-color: transparent transparent transparent var(--menu-focus-foreground); + } +} + +.sm-dox ul { + background: var(--page-background-color); + box-shadow: var(--box-shadow); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium) !important; + padding: var(--spacing-small); + animation: ease-out 150ms slideInMenu; +} + +@keyframes slideInMenu { + from { + opacity: 0; + transform: translate(0px, -2px); + } + + to { + opacity: 1; + transform: translate(0px, 0px); + } +} + +.sm-dox ul a { + color: var(--page-foreground-color) !important; + background: var(--page-background-color); + font-size: var(--navigation-font-size); +} + +.sm-dox>li>ul:after { + border-bottom-color: var(--page-background-color) !important; +} + +.sm-dox>li>ul:before { + border-bottom-color: var(--separator-color) !important; +} + +.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus { + font-size: var(--navigation-font-size) !important; + color: var(--menu-focus-foreground) !important; + text-shadow: none; + background-color: var(--menu-focus-background); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a { + text-shadow: none; + background: transparent; + background-image: none !important; + color: var(--header-foreground) !important; + font-weight: normal; + font-size: var(--navigation-font-size); + border-radius: var(--border-radius-small) !important; +} + +.sm-dox a:focus { + outline: auto; +} + +.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover { + text-shadow: none; + font-weight: normal; + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; + border-radius: var(--border-radius-small) !important; + font-size: var(--navigation-font-size); +} + +.tablist li.current { + border-radius: var(--border-radius-small); + background: var(--menu-selected-background); +} + +.tablist li { + margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small); +} + +.tablist a { + padding: 0 var(--spacing-large); +} + + +/* + Search box + */ + +#MSearchBox { + height: var(--searchbar-height); + background: var(--searchbar-background); + border-radius: var(--searchbar-border-radius); + border: 1px solid var(--separator-color); + overflow: hidden; + width: var(--searchbar-width); + position: relative; + box-shadow: none; + display: block; + margin-top: 0; +} + +.left #MSearchSelect { + left: 0; + user-select: none; +} + +.SelectionMark { + user-select: none; +} + +.tabs .left #MSearchSelect { + padding-left: 0; +} + +.tabs #MSearchBox { + position: absolute; + right: var(--spacing-medium); +} + +@media screen and (max-width: 767px) { + .tabs #MSearchBox { + position: relative; + right: 0; + margin-left: var(--spacing-medium); + margin-top: 0; + } +} + +#MSearchSelectWindow, #MSearchResultsWindow { + z-index: 9999; +} + +#MSearchBox.MSearchBoxActive { + border-color: var(--primary-color); + box-shadow: inset 0 0 0 1px var(--primary-color); +} + +#main-menu > li:last-child { + margin-right: 0; +} + +@media screen and (max-width: 767px) { + #main-menu > li:last-child { + height: 50px; + } +} + +#MSearchField { + font-size: var(--navigation-font-size); + height: calc(var(--searchbar-height) - 2px); + background: transparent; + width: calc(var(--searchbar-width) - 64px); +} + +.MSearchBoxActive #MSearchField { + color: var(--searchbar-foreground); +} + +#MSearchSelect { + top: calc(calc(var(--searchbar-height) / 2) - 11px); +} + +.left #MSearchSelect { + padding-left: 8px; +} + +#MSearchBox span.left, #MSearchBox span.right { + background: none; +} + +#MSearchBox span.right { + padding-top: calc(calc(var(--searchbar-height) / 2) - 12px); + position: absolute; + right: var(--spacing-small); +} + +.tabs #MSearchBox span.right { + top: calc(calc(var(--searchbar-height) / 2) - 12px); +} + +@keyframes slideInSearchResults { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } +} + +#MSearchResultsWindow { + left: auto !important; + right: var(--spacing-medium); + border-radius: var(--border-radius-large); + border: 1px solid var(--separator-color); + transform: translate(0, 20px); + box-shadow: var(--box-shadow); + animation: ease-out 280ms slideInSearchResults; + background: var(--page-background-color); +} + +iframe#MSearchResults { + margin: 4px; +} + +iframe { + color-scheme: normal; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) iframe#MSearchResults { + filter: invert() hue-rotate(180deg); + } +} + +html.dark-mode iframe#MSearchResults { + filter: invert() hue-rotate(180deg); +} + +#MSearchSelectWindow { + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + background: var(--page-background-color); + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); +} + +#MSearchSelectWindow a.SelectItem { + font-size: var(--navigation-font-size); + line-height: var(--content-line-height); + margin: 0 var(--spacing-small); + border-radius: var(--border-radius-small); + color: var(--page-foreground-color) !important; + font-weight: normal; +} + +#MSearchSelectWindow a.SelectItem:hover { + background: var(--menu-focus-background); + color: var(--menu-focus-foreground) !important; +} + +@media screen and (max-width: 767px) { + #MSearchBox { + margin-top: var(--spacing-medium); + margin-bottom: var(--spacing-medium); + width: calc(100vw - 30px); + } + + #main-menu > li:last-child { + float: none !important; + } + + #MSearchField { + width: calc(100vw - 110px); + } + + @keyframes slideInSearchResultsMobile { + from { + opacity: 0; + transform: translate(0, 15px); + } + + to { + opacity: 1; + transform: translate(0, 20px); + } + } + + #MSearchResultsWindow { + left: var(--spacing-medium) !important; + right: var(--spacing-medium); + overflow: auto; + transform: translate(0, 20px); + animation: ease-out 280ms slideInSearchResultsMobile; + } + + /* + * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2 + */ + label.main-menu-btn ~ #searchBoxPos1 { + top: 3px !important; + right: 6px !important; + left: 45px; + display: flex; + } + + label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox { + margin-top: 0; + margin-bottom: 0; + flex-grow: 2; + float: left; + } +} + +/* + Tree view + */ + +#side-nav { + padding: 0 !important; + background: var(--side-nav-background); +} + +@media screen and (max-width: 767px) { + #side-nav { + display: none; + } + + #doc-content { + margin-left: 0 !important; + } +} + +#nav-tree { + background: transparent; +} + +#nav-tree .label { + font-size: var(--navigation-font-size); +} + +#nav-tree .item { + height: var(--tree-item-height); + line-height: var(--tree-item-height); +} + +#nav-sync { + bottom: 12px; + right: 12px; + top: auto !important; + user-select: none; +} + +#nav-tree .selected { + text-shadow: none; + background-image: none; + background-color: transparent; + position: relative; +} + +#nav-tree .selected::after { + content: ""; + position: absolute; + top: 1px; + bottom: 1px; + left: 0; + width: 4px; + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + background: var(--primary-color); +} + + +#nav-tree a { + color: var(--side-nav-foreground) !important; + font-weight: normal; +} + +#nav-tree a:focus { + outline-style: auto; +} + +#nav-tree .arrow { + opacity: var(--side-nav-arrow-opacity); +} + +.arrow { + color: inherit; + cursor: pointer; + font-size: 45%; + vertical-align: middle; + margin-right: 2px; + font-family: serif; + height: auto; + text-align: right; +} + +#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow { + opacity: var(--side-nav-arrow-hover-opacity); +} + +#nav-tree .selected a { + color: var(--primary-color) !important; + font-weight: bolder; + font-weight: 600; +} + +.ui-resizable-e { + background: var(--separator-color); + width: 1px; +} + +/* + Contents + */ + +div.header { + border-bottom: 1px solid var(--separator-color); + background-color: var(--page-background-color); + background-image: none; +} + +div.contents, div.header .title, div.header .summary { + max-width: var(--content-maxwidth); +} + +div.contents, div.header .title { + line-height: initial; + margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto; +} + +div.header .summary { + margin: var(--spacing-medium) auto 0 auto; +} + +div.headertitle { + padding: 0; +} + +div.header .title { + font-weight: 600; + font-size: 210%; + padding: var(--spacing-medium) var(--spacing-large); + word-break: break-word; +} + +div.header .summary { + width: auto; + display: block; + float: none; + padding: 0 var(--spacing-large); +} + +td.memSeparator { + border-color: var(--separator-color); +} + +span.mlabel { + background: var(--primary-color); + border: none; + padding: 4px 9px; + border-radius: 12px; + margin-right: var(--spacing-medium); +} + +span.mlabel:last-of-type { + margin-right: 2px; +} + +div.contents { + padding: 0 var(--spacing-large); +} + +div.contents p, div.contents li { + line-height: var(--content-line-height); +} + +div.contents div.dyncontent { + margin: var(--spacing-medium) 0; +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) div.contents div.dyncontent img, + html:not(.light-mode) div.contents center img, + html:not(.light-mode) div.contents table img, + html:not(.light-mode) div.contents div.dyncontent iframe, + html:not(.light-mode) div.contents center iframe, + html:not(.light-mode) div.contents table iframe { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode div.contents div.dyncontent img, +html.dark-mode div.contents center img, +html.dark-mode div.contents table img, +html.dark-mode div.contents div.dyncontent iframe, +html.dark-mode div.contents center iframe, +html.dark-mode div.contents table iframe { + filter: hue-rotate(180deg) invert(); +} + +h2.groupheader { + border-bottom: 0px; + color: var(--page-foreground-color); + box-shadow: + 100px 0 var(--page-background-color), + -100px 0 var(--page-background-color), + 100px 0.75px var(--separator-color), + -100px 0.75px var(--separator-color), + 500px 0 var(--page-background-color), + -500px 0 var(--page-background-color), + 500px 0.75px var(--separator-color), + -500px 0.75px var(--separator-color), + 1500px 0 var(--page-background-color), + -1500px 0 var(--page-background-color), + 1500px 0.75px var(--separator-color), + -1500px 0.75px var(--separator-color), + 2000px 0 var(--page-background-color), + -2000px 0 var(--page-background-color), + 2000px 0.75px var(--separator-color), + -2000px 0.75px var(--separator-color); +} + +blockquote { + margin: 0 var(--spacing-medium) 0 var(--spacing-medium); + padding: var(--spacing-small) var(--spacing-large); + background: var(--blockquote-background); + color: var(--blockquote-foreground); + border-left: 0; + overflow: visible; + border-radius: var(--border-radius-medium); + overflow: visible; + position: relative; +} + +blockquote::before, blockquote::after { + font-weight: bold; + font-family: serif; + font-size: 360%; + opacity: .15; + position: absolute; +} + +blockquote::before { + content: "“"; + left: -10px; + top: 4px; +} + +blockquote::after { + content: "”"; + right: -8px; + bottom: -25px; +} + +blockquote p { + margin: var(--spacing-small) 0 var(--spacing-medium) 0; +} +.paramname { + font-weight: 600; + color: var(--primary-dark-color); +} + +.paramname > code { + border: 0; +} + +table.params .paramname { + font-weight: 600; + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + padding-right: var(--spacing-small); +} + +.glow { + text-shadow: 0 0 15px var(--primary-light-color) !important; +} + +.alphachar a { + color: var(--page-foreground-color); +} + +/* + Table of Contents + */ + +div.toc { + z-index: 10; + position: relative; + background-color: var(--toc-background); + border: 1px solid var(--separator-color); + border-radius: var(--border-radius-medium); + box-shadow: var(--box-shadow); + padding: 0 var(--spacing-large); + margin: 0 0 var(--spacing-medium) var(--spacing-medium); +} + +div.toc h3 { + color: var(--toc-foreground); + font-size: var(--navigation-font-size); + margin: var(--spacing-large) 0; +} + +div.toc li { + font-size: var(--navigation-font-size); + padding: 0; + background: none; +} + +div.toc li:before { + content: '↓'; + font-weight: 800; + font-family: var(--font-family); + margin-right: var(--spacing-small); + color: var(--toc-foreground); + opacity: .4; +} + +div.toc ul li.level1 { + margin: 0; +} + +div.toc ul li.level2, div.toc ul li.level3 { + margin-top: 0; +} + + +@media screen and (max-width: 767px) { + div.toc { + float: none; + width: auto; + margin: 0 0 var(--spacing-medium) 0; + } +} + +/* + Code & Fragments + */ + +code, div.fragment, pre.fragment { + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + overflow: hidden; +} + +code { + display: inline; + background: var(--code-background); + color: var(--code-foreground); + padding: 2px 6px; + word-break: break-word; +} + +div.fragment, pre.fragment { + margin: var(--spacing-medium) 0; + padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large); + background: var(--fragment-background); + color: var(--fragment-foreground); + overflow-x: auto; +} + +@media screen and (max-width: 767px) { + div.fragment, pre.fragment { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + + .contents > div.fragment, + .textblock > div.fragment, + .textblock > pre.fragment, + .contents > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > div.fragment, + .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + border-radius: 0; + border-left: 0; + } + + .textblock li > .fragment, + .textblock li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-large)); + } + + .memdoc li > .fragment, + .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + } + + .textblock ul, .memdoc ul { + overflow: initial; + } + + .memdoc > div.fragment, + .memdoc > pre.fragment, + dl dd > div.fragment, + dl dd pre.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment, + .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment, + dl dd > .doxygen-awesome-fragment-wrapper > div.fragment, + dl dd .doxygen-awesome-fragment-wrapper > pre.fragment { + margin: var(--spacing-medium) calc(0px - var(--spacing-medium)); + border-radius: 0; + border-left: 0; + } +} + +code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size) !important; +} + +div.line:after { + margin-right: var(--spacing-medium); +} + +div.fragment .line, pre.fragment { + white-space: pre; + word-wrap: initial; + line-height: var(--fragment-lineheight); +} + +div.fragment span.keyword { + color: var(--fragment-keyword); +} + +div.fragment span.keywordtype { + color: var(--fragment-keywordtype); +} + +div.fragment span.keywordflow { + color: var(--fragment-keywordflow); +} + +div.fragment span.stringliteral { + color: var(--fragment-token) +} + +div.fragment span.comment { + color: var(--fragment-comment); +} + +div.fragment a.code { + color: var(--fragment-link) !important; +} + +div.fragment span.preprocessor { + color: var(--fragment-preprocessor); +} + +div.fragment span.lineno { + display: inline-block; + width: 27px; + border-right: none; + background: var(--fragment-linenumber-background); + color: var(--fragment-linenumber-color); +} + +div.fragment span.lineno a { + background: none; + color: var(--fragment-link) !important; +} + +div.fragment .line:first-child .lineno { + box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border); +} + +/* + dl warning, attention, note, deprecated, bug, ... + */ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark { + padding: var(--spacing-medium); + margin: var(--spacing-medium) 0; + color: var(--page-background-color); + overflow: hidden; + margin-left: 0; + border-radius: var(--border-radius-small); +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color); + border-left: 8px solid var(--warning-color-dark); + color: var(--warning-color-darker); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-dark); +} + +dl.note, dl.remark { + background: var(--note-color); + border-left: 8px solid var(--note-color-dark); + color: var(--note-color-darker); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-dark); +} + +dl.todo { + background: var(--todo-color); + border-left: 8px solid var(--todo-color-dark); + color: var(--todo-color-darker); +} + +dl.todo dt { + color: var(--todo-color-dark); +} + +dl.bug dt a { + color: var(--todo-color-dark) !important; +} + +dl.bug { + background: var(--bug-color); + border-left: 8px solid var(--bug-color-dark); + color: var(--bug-color-darker); +} + +dl.bug dt a { + color: var(--bug-color-dark) !important; +} + +dl.deprecated { + background: var(--deprecated-color); + border-left: 8px solid var(--deprecated-color-dark); + color: var(--deprecated-color-darker); +} + +dl.deprecated dt a { + color: var(--deprecated-color-dark) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre { + background: var(--invariant-color); + border-left: 8px solid var(--invariant-color-dark); + color: var(--invariant-color-darker); +} + +dl.invariant dt, dl.pre dt { + color: var(--invariant-color-dark); +} + +/* + memitem + */ + +div.memdoc, div.memproto, h2.memtitle { + box-shadow: none; + background-image: none; + border: none; +} + +div.memdoc { + padding: 0 var(--spacing-medium); + background: var(--page-background-color); +} + +h2.memtitle, div.memitem { + border: 1px solid var(--separator-color); + box-shadow: var(--box-shadow); +} + +h2.memtitle { + box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow); +} + +div.memitem { + transition: none; +} + +div.memproto, h2.memtitle { + background: var(--fragment-background); + text-shadow: none; +} + +h2.memtitle { + font-weight: 500; + font-size: var(--memtitle-font-size); + font-family: var(--font-family-monospace); + border-bottom: none; + border-top-left-radius: var(--border-radius-medium); + border-top-right-radius: var(--border-radius-medium); + word-break: break-all; + position: relative; +} + +h2.memtitle:after { + content: ""; + display: block; + background: var(--fragment-background); + height: var(--spacing-medium); + bottom: calc(0px - var(--spacing-medium)); + left: 0; + right: -14px; + position: absolute; + border-top-right-radius: var(--border-radius-medium); +} + +h2.memtitle > span.permalink { + font-size: inherit; +} + +h2.memtitle > span.permalink > a { + text-decoration: none; + padding-left: 3px; + margin-right: -4px; + user-select: none; + display: inline-block; + margin-top: -6px; +} + +h2.memtitle > span.permalink > a:hover { + color: var(--primary-dark-color) !important; +} + +a:target + h2.memtitle, a:target + h2.memtitle + div.memitem { + border-color: var(--primary-light-color); +} + +div.memitem { + border-top-right-radius: var(--border-radius-medium); + border-bottom-right-radius: var(--border-radius-medium); + border-bottom-left-radius: var(--border-radius-medium); + overflow: hidden; + display: block !important; +} + +div.memdoc { + border-radius: 0; +} + +div.memproto { + border-radius: 0 var(--border-radius-small) 0 0; + overflow: auto; + border-bottom: 1px solid var(--separator-color); + padding: var(--spacing-medium); + margin-bottom: -1px; +} + +div.memtitle { + border-top-right-radius: var(--border-radius-medium); + border-top-left-radius: var(--border-radius-medium); +} + +div.memproto table.memname { + font-family: var(--font-family-monospace); + color: var(--page-foreground-color); + font-size: var(--memname-font-size); +} + +div.memproto div.memtemplate { + font-family: var(--font-family-monospace); + color: var(--primary-dark-color); + font-size: var(--memname-font-size); + margin-left: 2px; +} + +table.mlabels, table.mlabels > tbody { + display: block; +} + +td.mlabels-left { + width: auto; +} + +td.mlabels-right { + margin-top: 3px; + position: sticky; + left: 0; +} + +table.mlabels > tbody > tr:first-child { + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +.memname, .memitem span.mlabels { + margin: 0 +} + +/* + reflist + */ + +dl.reflist { + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-medium); + border: 1px solid var(--separator-color); + overflow: hidden; + padding: 0; +} + + +dl.reflist dt, dl.reflist dd { + box-shadow: none; + text-shadow: none; + background-image: none; + border: none; + padding: 12px; +} + + +dl.reflist dt { + font-weight: 500; + border-radius: 0; + background: var(--code-background); + border-bottom: 1px solid var(--separator-color); + color: var(--page-foreground-color) +} + + +dl.reflist dd { + background: none; +} + +/* + Table + */ + +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + display: inline-block; + max-width: 100%; + } + +.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); +} + +table.markdownTable, table.fieldtable { + border: none; + margin: var(--spacing-medium) 0; + box-shadow: 0 0 0 1px var(--separator-color); + border-radius: var(--border-radius-small); +} + +table.fieldtable { + width: 100%; +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background: var(--tablehead-background); + color: var(--tablehead-foreground); + font-weight: 600; + font-size: var(--page-font-size); +} + +th.markdownTableHeadLeft:first-child, th.markdownTableHeadRight:first-child, th.markdownTableHeadCenter:first-child, th.markdownTableHeadNone:first-child { + border-top-left-radius: var(--border-radius-small); +} + +th.markdownTableHeadLeft:last-child, th.markdownTableHeadRight:last-child, th.markdownTableHeadCenter:last-child, th.markdownTableHeadNone:last-child { + border-top-right-radius: var(--border-radius-small); +} + +table.markdownTable td, table.markdownTable th, table.fieldtable dt { + border: none; + border-right: 1px solid var(--separator-color); + padding: var(--spacing-small) var(--spacing-medium); +} + +table.markdownTable td:last-child, table.markdownTable th:last-child, table.fieldtable dt:last-child { + border: none; +} + +table.markdownTable tr, table.markdownTable tr { + border-bottom: 1px solid var(--separator-color); +} + +table.markdownTable tr:last-child, table.markdownTable tr:last-child { + border-bottom: none; +} + +table.fieldtable th { + font-size: var(--page-font-size); + font-weight: 600; + background-image: none; + background-color: var(--tablehead-background); + color: var(--tablehead-foreground); + border-bottom: 1px solid var(--separator-color); +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + border-bottom: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--separator-color); +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--primary-light-color); + box-shadow: 0 0 15px var(--primary-light-color); +} + +table.memberdecls { + display: block; +} + +table.memberdecls tr[class^='memitem'] { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); +} + +table.memberdecls tr[class^='memitem'] .memTemplParams { + font-family: var(--font-family-monospace); + font-size: var(--code-font-size); + color: var(--primary-dark-color); +} + +table.memberdecls .memItemLeft, +table.memberdecls .memItemRight, +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight, +table.memberdecls .memTemplParams { + transition: none; + padding-top: var(--spacing-small); + padding-bottom: var(--spacing-small); + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + background-color: var(--fragment-background); +} + +table.memberdecls .memTemplItemLeft, +table.memberdecls .memTemplItemRight { + padding-top: 2px; +} + +table.memberdecls .memTemplParams { + border-bottom: 0; + border-left: 1px solid var(--separator-color); + border-right: 1px solid var(--separator-color); + border-radius: var(--border-radius-small) var(--border-radius-small) 0 0; + padding-bottom: 0; +} + +table.memberdecls .memTemplItemLeft { + border-radius: 0 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memTemplItemRight { + border-radius: 0 0 var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + border-top: 0; +} + +table.memberdecls .memItemLeft { + border-radius: var(--border-radius-small) 0 0 var(--border-radius-small); + border-left: 1px solid var(--separator-color); + padding-left: var(--spacing-medium); + padding-right: 0; +} + +table.memberdecls .memItemRight { + border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0; + border-right: 1px solid var(--separator-color); + padding-right: var(--spacing-medium); + padding-left: 0; + +} + +table.memberdecls .mdescLeft, table.memberdecls .mdescRight { + background: none; + color: var(--page-foreground-color); + padding: var(--spacing-small) 0; +} + +table.memberdecls .memSeparator { + background: var(--page-background-color); + height: var(--spacing-large); + border: 0; + transition: none; +} + +table.memberdecls .groupheader { + margin-bottom: var(--spacing-large); +} + +table.memberdecls .inherit_header td { + padding: 0 0 var(--spacing-medium) 0; + text-indent: -12px; + line-height: 1.5em; + color: var(--page-secondary-foreground-color); +} + +@media screen and (max-width: 767px) { + + table.memberdecls .memItemLeft, + table.memberdecls .memItemRight, + table.memberdecls .mdescLeft, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemLeft, + table.memberdecls .memTemplItemRight, + table.memberdecls .memTemplParams { + display: block; + text-align: left; + padding-left: var(--spacing-large); + margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large)); + border-right: none; + border-left: none; + border-radius: 0; + } + + table.memberdecls .memItemLeft, + table.memberdecls .mdescLeft, + table.memberdecls .memTemplItemLeft { + border-bottom: 0; + padding-bottom: 0; + } + + table.memberdecls .memTemplItemLeft { + padding-top: 0; + } + + table.memberdecls .mdescLeft { + margin-top: calc(0px - var(--page-font-size)); + } + + table.memberdecls .memItemRight, + table.memberdecls .mdescRight, + table.memberdecls .memTemplItemRight { + border-top: 0; + padding-top: 0; + padding-right: var(--spacing-large); + overflow-x: auto; + } + + table.memberdecls tr[class^='memitem']:not(.inherit) { + display: block; + width: calc(100vw - 2 * var(--spacing-large)); + } + + table.memberdecls .mdescRight { + color: var(--page-foreground-color); + } + + table.memberdecls tr.inherit { + visibility: hidden; + } + + table.memberdecls tr[style="display: table-row;"] { + display: block !important; + visibility: visible; + width: calc(100vw - 2 * var(--spacing-large)); + animation: fade .5s; + } + + @keyframes fade { + 0% { + opacity: 0; + max-height: 0; + } + + 100% { + opacity: 1; + max-height: 200px; + } + } +} + + +/* + Horizontal Rule + */ + +hr { + margin-top: var(--spacing-large); + margin-bottom: var(--spacing-large); + height: 1px; + background-color: var(--separator-color); + border: 0; +} + +.contents hr { + box-shadow: 100px 0 0 var(--separator-color), + -100px 0 0 var(--separator-color), + 500px 0 0 var(--separator-color), + -500px 0 0 var(--separator-color), + 1500px 0 0 var(--separator-color), + -1500px 0 0 var(--separator-color), + 2000px 0 0 var(--separator-color), + -2000px 0 0 var(--separator-color); +} + +.contents img, .contents .center, .contents center, .contents div.image object { + max-width: 100%; + overflow: auto; +} + +@media screen and (max-width: 767px) { + .contents .dyncontent > .center, .contents > center { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + max-width: calc(100% + 2 * var(--spacing-large)); + } +} + +/* + Directories + */ +div.directory { + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + width: auto; +} + +table.directory { + font-family: var(--font-family); + font-size: var(--page-font-size); + font-weight: normal; + width: 100%; +} + +table.directory td.entry { + padding: var(--spacing-small); +} + +table.directory td.desc { + min-width: 250px; +} + +table.directory tr.even { + background-color: var(--odd-color); +} + +.icona { + width: auto; + height: auto; + margin: 0 var(--spacing-small); +} + +.icon { + background: var(--primary-color); + width: 18px; + height: 18px; + line-height: 18px; +} + +.iconfopen, .icondoc, .iconfclosed { + background-position: center; + margin-bottom: 0; +} + +.icondoc { + filter: saturate(0.2); +} + +@media screen and (max-width: 767px) { + div.directory { + margin-left: calc(0px - var(--spacing-large)); + margin-right: calc(0px - var(--spacing-large)); + } +} + +@media (prefers-color-scheme: dark) { + html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed { + filter: hue-rotate(180deg) invert(); + } +} + +html.dark-mode .iconfopen, html.dark-mode .iconfclosed { + filter: hue-rotate(180deg) invert(); +} + +/* + Class list + */ + +.classindex dl.odd { + background: var(--odd-color); + border-radius: var(--border-radius-small); +} + +/* + Class Index Doxygen 1.8 +*/ + +table.classindex { + margin-left: 0; + margin-right: 0; + width: 100%; +} + +table.classindex table div.ah { + background-image: none; + background-color: initial; + border-color: var(--separator-color); + color: var(--page-foreground-color); + box-shadow: var(--box-shadow); + border-radius: var(--border-radius-large); + padding: var(--spacing-small); +} + +div.qindex { + background-color: var(--odd-color); + border-radius: var(--border-radius-small); + border: 1px solid var(--separator-color); + padding: var(--spacing-small) 0; +} + +/* + Footer and nav-path + */ + +#nav-path { + width: 100%; +} + +#nav-path ul { + background-image: none; + background: var(--page-background-color); + border: none; + border-top: 1px solid var(--separator-color); + border-bottom: 1px solid var(--separator-color); + border-bottom: 0; + box-shadow: 0 0.75px 0 var(--separator-color); + font-size: var(--navigation-font-size); +} + +img.footer { + width: 60px; +} + +.navpath li.footer { + color: var(--page-secondary-foreground-color); +} + +address.footer { + color: var(--page-secondary-foreground-color); + margin-bottom: var(--spacing-large); +} + +#nav-path li.navelem { + background-image: none; + display: flex; + align-items: center; +} + +.navpath li.navelem a { + text-shadow: none; + display: inline-block; + color: var(--primary-color) !important; +} + +.navpath li.navelem b { + color: var(--primary-dark-color); + font-weight: 500; +} + +li.navelem { + padding: 0; + margin-left: -8px; +} + +li.navelem:first-child { + margin-left: var(--spacing-large); +} + +li.navelem:first-child:before { + display: none; +} + +#nav-path li.navelem:after { + content: ''; + border: 5px solid var(--page-background-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(4.2); + z-index: 10; + margin-left: 6px; +} + +#nav-path li.navelem:before { + content: ''; + border: 5px solid var(--separator-color); + border-bottom-color: transparent; + border-right-color: transparent; + border-top-color: transparent; + transform: translateY(-1px) scaleY(3.2); + margin-right: var(--spacing-small); +} + +.navpath li.navelem a:hover { + color: var(--primary-color); +} + +/* + Scrollbars for Webkit +*/ + +#nav-tree::-webkit-scrollbar, +div.fragment::-webkit-scrollbar, +pre.fragment::-webkit-scrollbar, +div.memproto::-webkit-scrollbar, +.contents center::-webkit-scrollbar, +.contents .center::-webkit-scrollbar, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar { + width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); +} + +#nav-tree::-webkit-scrollbar-thumb, +div.fragment::-webkit-scrollbar-thumb, +pre.fragment::-webkit-scrollbar-thumb, +div.memproto::-webkit-scrollbar-thumb, +.contents center::-webkit-scrollbar-thumb, +.contents .center::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-thumb { + background-color: transparent; + border: var(--webkit-scrollbar-padding) solid transparent; + border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding)); + background-clip: padding-box; +} + +#nav-tree:hover::-webkit-scrollbar-thumb, +div.fragment:hover::-webkit-scrollbar-thumb, +pre.fragment:hover::-webkit-scrollbar-thumb, +div.memproto:hover::-webkit-scrollbar-thumb, +.contents center:hover::-webkit-scrollbar-thumb, +.contents .center:hover::-webkit-scrollbar-thumb, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):hover::-webkit-scrollbar-thumb { + background-color: var(--webkit-scrollbar-color); +} + +#nav-tree::-webkit-scrollbar-track, +div.fragment::-webkit-scrollbar-track, +pre.fragment::-webkit-scrollbar-track, +div.memproto::-webkit-scrollbar-track, +.contents center::-webkit-scrollbar-track, +.contents .center::-webkit-scrollbar-track, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-track { + background: transparent; +} + +#nav-tree::-webkit-scrollbar-corner { + background-color: var(--side-nav-background); +} + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + overflow-x: auto; + overflow-x: overlay; +} + +#nav-tree { + overflow-x: auto; + overflow-y: auto; + overflow-y: overlay; +} + +/* + Scrollbars for Firefox +*/ + +#nav-tree, +div.fragment, +pre.fragment, +div.memproto, +.contents center, +.contents .center, +.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) { + scrollbar-width: thin; +} + +/* + Optional Dark mode toggle button +*/ + +doxygen-awesome-dark-mode-toggle { + display: inline-block; + margin: 0 0 0 var(--spacing-small); + padding: 0; + width: var(--searchbar-height); + height: var(--searchbar-height); + background: none; + border: none; + border-radius: var(--searchbar-height); + vertical-align: middle; + text-align: center; + line-height: var(--searchbar-height); + font-size: 22px; + display: flex; + align-items: center; + justify-content: center; + user-select: none; + cursor: pointer; +} + +doxygen-awesome-dark-mode-toggle > svg { + transition: transform .1s ease-in-out; +} + +doxygen-awesome-dark-mode-toggle:active > svg { + transform: scale(.5); +} + +doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.03); +} + +html.dark-mode doxygen-awesome-dark-mode-toggle:hover { + background-color: rgba(0,0,0,.18); +} + +/* + Optional fragment copy button +*/ +.doxygen-awesome-fragment-wrapper { + position: relative; +} + +doxygen-awesome-fragment-copy-button { + opacity: 0; + background: var(--fragment-background); + width: 28px; + height: 28px; + position: absolute; + right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5)); + border: 1px solid var(--fragment-foreground); + cursor: pointer; + border-radius: var(--border-radius-small); + display: flex; + justify-content: center; + align-items: center; +} + +.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success { + opacity: .28; +} + +doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success { + opacity: 1 !important; +} + +doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg { + transform: scale(.91); +} + +doxygen-awesome-fragment-copy-button svg { + fill: var(--fragment-foreground); + width: 18px; + height: 18px; +} + +doxygen-awesome-fragment-copy-button.success svg { + fill: rgb(14, 168, 14); +} + +doxygen-awesome-fragment-copy-button.success { + border-color: rgb(14, 168, 14); +} + +@media screen and (max-width: 767px) { + .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button, + dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button { + right: 0; + } +} + +/* + Optional paragraph link button +*/ + +a.anchorlink { + font-size: 90%; + margin-left: var(--spacing-small); + color: var(--page-foreground-color) !important; + text-decoration: none; + opacity: .15; + display: none; + transition: opacity .1s ease-in-out, color .1s ease-in-out; +} + +a.anchorlink svg { + fill: var(--page-foreground-color); +} + +h3 a.anchorlink svg, h4 a.anchorlink svg { + margin-bottom: -3px; + margin-top: -4px; +} + +a.anchorlink:hover { + opacity: .45; +} + +h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink { + display: inline-block; +} diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 00000000..ffbff022 --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 00000000..d42dad52 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 00000000..88f2c27e --- /dev/null +++ b/dynsections.js @@ -0,0 +1,128 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +vulp: vulp/spine/exceptions.py File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
exceptions.py File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + +

+Classes

class  vulp.spine.exceptions.VulpException
 Base class for exceptions raised by Vulp. More...
 
class  vulp.spine.exceptions.PerformanceIssue
 Exception raised when a performance issue is detected. More...
 
class  vulp.spine.exceptions.SpineError
 Exception raised when the spine sets an error flag in the request field of the shared memory map. More...
 
+ + + +

+Namespaces

 vulp.spine.exceptions
 
+
+
+ + + + diff --git a/exceptions_8py_source.html b/exceptions_8py_source.html new file mode 100644 index 00000000..167912ca --- /dev/null +++ b/exceptions_8py_source.html @@ -0,0 +1,128 @@ + + + + + + + +vulp: vulp/spine/exceptions.py Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
exceptions.py
+
+
+Go to the documentation of this file.
1 #!/usr/bin/env python3
+
2 # -*- coding: utf-8 -*-
+
3 #
+
4 # SPDX-License-Identifier: Apache-2.0
+
5 # Copyright 2022 Stéphane Caron
+
6 # Copyright 2023 Inria
+
7 
+
8 
+
9 class VulpException(Exception):
+
10  """!
+
11  Base class for exceptions raised by Vulp.
+
12  """
+
13 
+
14 
+ +
16  """!
+
17  Exception raised when a performance issue is detected.
+
18  """
+
19 
+
20 
+ +
22  """!
+
23  Exception raised when the spine sets an error flag in the request field of
+
24  the shared memory map.
+
25  """
+
Exception raised when a performance issue is detected.
Definition: exceptions.py:15
+
Exception raised when the spine sets an error flag in the request field of the shared memory map.
Definition: exceptions.py:21
+
Base class for exceptions raised by Vulp.
Definition: exceptions.py:9
+
+
+ + + + diff --git a/files.html b/files.html new file mode 100644 index 00000000..8ce3a862 --- /dev/null +++ b/files.html @@ -0,0 +1,162 @@ + + + + + + + +vulp: File List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+ +
+ + + + diff --git a/files_dup.js b/files_dup.js new file mode 100644 index 00000000..cab669b0 --- /dev/null +++ b/files_dup.js @@ -0,0 +1,4 @@ +var files_dup = +[ + [ "vulp", "dir_48b927d7dec9ed7311ba15ea585d91e7.html", "dir_48b927d7dec9ed7311ba15ea585d91e7" ] +]; \ No newline at end of file diff --git a/folderclosed.png b/folderclosed.png new file mode 100644 index 00000000..bb8ab35e Binary files /dev/null and b/folderclosed.png differ diff --git a/folderopen.png b/folderopen.png new file mode 100644 index 00000000..d6c7f676 Binary files /dev/null and b/folderopen.png differ diff --git a/functions.html b/functions.html new file mode 100644 index 00000000..e32b6038 --- /dev/null +++ b/functions.html @@ -0,0 +1,594 @@ + + + + + + + +vulp: Class Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- ~ -

+
+
+ + + + diff --git a/functions_func.html b/functions_func.html new file mode 100644 index 00000000..0b187ef4 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,446 @@ + + + + + + + +vulp: Class Members - Functions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- _ -

+ + +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- j -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+ + +

- ~ -

+
+
+ + + + diff --git a/functions_type.html b/functions_type.html new file mode 100644 index 00000000..ce7d044b --- /dev/null +++ b/functions_type.html @@ -0,0 +1,100 @@ + + + + + + + +vulp: Class Members - Typedefs + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..92882aba --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,308 @@ + + + + + + + +vulp: Class Members - Variables + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+  + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- k -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- w -

+
+
+ + + + diff --git a/globals.html b/globals.html new file mode 100644 index 00000000..8645c699 --- /dev/null +++ b/globals.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all file members with links to the files they belong to:
+
+
+ + + + diff --git a/globals_func.html b/globals_func.html new file mode 100644 index 00000000..5696f7ea --- /dev/null +++ b/globals_func.html @@ -0,0 +1,106 @@ + + + + + + + +vulp: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + diff --git a/globals_vars.html b/globals_vars.html new file mode 100644 index 00000000..74ca4e9f --- /dev/null +++ b/globals_vars.html @@ -0,0 +1,115 @@ + + + + + + + +vulp: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
+ + + + diff --git a/graph_legend.html b/graph_legend.html new file mode 100644 index 00000000..c61c7f94 --- /dev/null +++ b/graph_legend.html @@ -0,0 +1,159 @@ + + + + + + + +vulp: Graph Legend + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+
+ + + + diff --git a/graph_legend.md5 b/graph_legend.md5 new file mode 100644 index 00000000..8fcdccd1 --- /dev/null +++ b/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/graph_legend.png b/graph_legend.png new file mode 100644 index 00000000..7e2cbcfb Binary files /dev/null and b/graph_legend.png differ diff --git a/handle__interrupts_8cpp.html b/handle__interrupts_8cpp.html new file mode 100644 index 00000000..a6350095 --- /dev/null +++ b/handle__interrupts_8cpp.html @@ -0,0 +1,144 @@ + + + + + + + +vulp: vulp/utils/handle_interrupts.cpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
handle_interrupts.cpp File Reference
+
+
+
+Include dependency graph for handle_interrupts.cpp:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
 vulp::utils::internal
 
+ + + + + + + +

+Functions

void vulp::utils::internal::handle_interrupt (int _)
 Internal handler to set interrupt_flag. More...
 
const bool & vulp.utils::handle_interrupts ()
 Redirect interrupts to setting a global interrupt boolean. More...
 
+ + + + +

+Variables

bool vulp::utils::internal::interrupt_flag = false
 Internal interrupt flag. More...
 
+
+
+ + + + diff --git a/handle__interrupts_8cpp.js b/handle__interrupts_8cpp.js new file mode 100644 index 00000000..8066a25e --- /dev/null +++ b/handle__interrupts_8cpp.js @@ -0,0 +1,6 @@ +var handle__interrupts_8cpp = +[ + [ "handle_interrupt", "handle__interrupts_8cpp.html#a838e3878c7da2dc06db5168b5ef421b2", null ], + [ "handle_interrupts", "handle__interrupts_8cpp.html#a78519754b023e10a26052f84229732fa", null ], + [ "interrupt_flag", "handle__interrupts_8cpp.html#ac7a04e3bcce477cf05d12ecb651fab6d", null ] +]; \ No newline at end of file diff --git a/handle__interrupts_8cpp__incl.map b/handle__interrupts_8cpp__incl.map new file mode 100644 index 00000000..96e604c6 --- /dev/null +++ b/handle__interrupts_8cpp__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/handle__interrupts_8cpp__incl.md5 b/handle__interrupts_8cpp__incl.md5 new file mode 100644 index 00000000..4b713dfd --- /dev/null +++ b/handle__interrupts_8cpp__incl.md5 @@ -0,0 +1 @@ +d34de58f0270c51237b84a1b46e07dfa \ No newline at end of file diff --git a/handle__interrupts_8cpp__incl.png b/handle__interrupts_8cpp__incl.png new file mode 100644 index 00000000..79aab04b Binary files /dev/null and b/handle__interrupts_8cpp__incl.png differ diff --git a/handle__interrupts_8cpp_source.html b/handle__interrupts_8cpp_source.html new file mode 100644 index 00000000..b6ec3088 --- /dev/null +++ b/handle__interrupts_8cpp_source.html @@ -0,0 +1,130 @@ + + + + + + + +vulp: vulp/utils/handle_interrupts.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
handle_interrupts.cpp
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+ +
5 
+
6 namespace vulp::utils {
+
7 
+
8 namespace internal {
+
9 
+
10 bool interrupt_flag = false;
+
11 
+
12 void handle_interrupt(int _) { interrupt_flag = true; }
+
13 
+
14 } // namespace internal
+
15 
+
20 const bool& handle_interrupts() {
+
21  struct sigaction handler;
+
22  handler.sa_handler = internal::handle_interrupt;
+
23  sigemptyset(&handler.sa_mask);
+
24  handler.sa_flags = 0;
+
25  sigaction(SIGINT, &handler, NULL);
+ +
27 }
+
28 
+
29 } // namespace vulp::utils
+ +
void handle_interrupt(int _)
Internal handler to set interrupt_flag.
+
bool interrupt_flag
Internal interrupt flag.
+
Utility functions.
Definition: __init__.py:1
+
const bool & handle_interrupts()
Redirect interrupts to setting a global interrupt boolean.
+
+
+ + + + diff --git a/handle__interrupts_8h.html b/handle__interrupts_8h.html new file mode 100644 index 00000000..7b1b63aa --- /dev/null +++ b/handle__interrupts_8h.html @@ -0,0 +1,149 @@ + + + + + + + +vulp: vulp/utils/handle_interrupts.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
handle_interrupts.h File Reference
+
+
+
#include <signal.h>
+#include <cstddef>
+
+Include dependency graph for handle_interrupts.h:
+
+
+ + + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
 vulp::utils::internal
 
+ + + + + + + +

+Functions

void vulp::utils::internal::handle_interrupt (int _)
 Internal handler to set interrupt_flag. More...
 
const bool & vulp.utils::handle_interrupts ()
 Redirect interrupts to setting a global interrupt boolean. More...
 
+
+
+ + + + diff --git a/handle__interrupts_8h.js b/handle__interrupts_8h.js new file mode 100644 index 00000000..64fe5469 --- /dev/null +++ b/handle__interrupts_8h.js @@ -0,0 +1,5 @@ +var handle__interrupts_8h = +[ + [ "handle_interrupt", "handle__interrupts_8h.html#a838e3878c7da2dc06db5168b5ef421b2", null ], + [ "handle_interrupts", "handle__interrupts_8h.html#a78519754b023e10a26052f84229732fa", null ] +]; \ No newline at end of file diff --git a/handle__interrupts_8h__dep__incl.map b/handle__interrupts_8h__dep__incl.map new file mode 100644 index 00000000..0d271e04 --- /dev/null +++ b/handle__interrupts_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/handle__interrupts_8h__dep__incl.md5 b/handle__interrupts_8h__dep__incl.md5 new file mode 100644 index 00000000..c0457805 --- /dev/null +++ b/handle__interrupts_8h__dep__incl.md5 @@ -0,0 +1 @@ +5e9d054e28f29873806e07717c0ba1af \ No newline at end of file diff --git a/handle__interrupts_8h__dep__incl.png b/handle__interrupts_8h__dep__incl.png new file mode 100644 index 00000000..70eb3c16 Binary files /dev/null and b/handle__interrupts_8h__dep__incl.png differ diff --git a/handle__interrupts_8h__incl.map b/handle__interrupts_8h__incl.map new file mode 100644 index 00000000..1480f362 --- /dev/null +++ b/handle__interrupts_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/handle__interrupts_8h__incl.md5 b/handle__interrupts_8h__incl.md5 new file mode 100644 index 00000000..edc2e077 --- /dev/null +++ b/handle__interrupts_8h__incl.md5 @@ -0,0 +1 @@ +e8d191cc5bce9798df74bc44402ddd0c \ No newline at end of file diff --git a/handle__interrupts_8h__incl.png b/handle__interrupts_8h__incl.png new file mode 100644 index 00000000..15ed1ac5 Binary files /dev/null and b/handle__interrupts_8h__incl.png differ diff --git a/handle__interrupts_8h_source.html b/handle__interrupts_8h_source.html new file mode 100644 index 00000000..b16d1f27 --- /dev/null +++ b/handle__interrupts_8h_source.html @@ -0,0 +1,126 @@ + + + + + + + +vulp: vulp/utils/handle_interrupts.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
handle_interrupts.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <signal.h>
+
7 
+
8 #include <cstddef>
+
9 
+
10 namespace vulp::utils {
+
11 
+
12 namespace internal {
+
13 
+
15 extern bool interrupt_flag;
+
16 
+
18 void handle_interrupt(int _);
+
19 
+
20 } // namespace internal
+
21 
+
27 const bool& handle_interrupts();
+
28 
+
29 } // namespace vulp::utils
+
void handle_interrupt(int _)
Internal handler to set interrupt_flag.
+
bool interrupt_flag
Internal interrupt flag.
+
Utility functions.
Definition: __init__.py:1
+
const bool & handle_interrupts()
Redirect interrupts to setting a global interrupt boolean.
+
+
+ + + + diff --git a/hierarchy.html b/hierarchy.html new file mode 100644 index 00000000..d9573331 --- /dev/null +++ b/hierarchy.html @@ -0,0 +1,135 @@ + + + + + + + +vulp: Class Hierarchy + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Cvulp.spine::AgentInterfaceMemory map to shared memory
 Cvulp::actuation::BulletContactDataContact information for a single link
 Cvulp::actuation::BulletJointPropertiesProperties for robot joints in the Bullet simulation
 Cvulp::control::ControllerBase class for controllers
 CException
 Cvulp.spine.exceptions.VulpExceptionBase class for exceptions raised by Vulp
 Cvulp.spine.exceptions.PerformanceIssueException raised when a performance issue is detected
 Cvulp.spine.exceptions.SpineErrorException raised when the spine sets an error flag in the request field of the shared memory map
 Cvulp::actuation::ImuDataData filtered from an onboard IMU such as the pi3hat's
 Cvulp::actuation::BulletImuData
 Cvulp::actuation::InterfaceBase class for actuation interfaces
 Cvulp::actuation::BulletInterfaceActuation interface for the Bullet simulator
 Cvulp::actuation::MockInterface
 Cvulp::actuation::Pi3HatInterfaceInterface to moteus controllers
 Cvulp::observation::ObserverBase class for observers
 Cvulp::observation::HistoryObserver< T >Report high-frequency history vectors to lower-frequency agents
 Cvulp::observation::ObserverPipelineObserver pipeline
 Cvulp::actuation::BulletInterface::ParametersInterface parameters
 Cvulp.spine::Spine::ParametersSpine parameters
 Cvulp::actuation::ServoLayoutMap between servos, their busses and the joints they actuate
 Cvulp::observation::SourceBase class for sources
 Cvulp::observation::sources::CpuTemperatureSource for CPU temperature readings
 Cvulp::observation::sources::JoystickSource for a joystick controller
 Cvulp::observation::sources::KeyboardSource for reading Keyboard inputs
 Cvulp.spine::SpineLoop transmitting actions to the actuation and observations to the agent
 Cvulp.spine.spine_interface.SpineInterfaceInterface to interact with a spine from a Python agent
 Cvulp.spine::StateMachineSpine state machine
 Cvulp.utils::SynchronousClockSynchronous (blocking) clock
 CIntEnum
 Cvulp.spine.request.RequestFlag set by the agent to request an operation from the spine
+
+
+
+ + + + diff --git a/hierarchy.js b/hierarchy.js new file mode 100644 index 00000000..a50397fd --- /dev/null +++ b/hierarchy.js @@ -0,0 +1,40 @@ +var hierarchy = +[ + [ "vulp.spine::AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html", null ], + [ "vulp::actuation::BulletContactData", "structvulp_1_1actuation_1_1BulletContactData.html", null ], + [ "vulp::actuation::BulletJointProperties", "structvulp_1_1actuation_1_1BulletJointProperties.html", null ], + [ "vulp::control::Controller", "classvulp_1_1control_1_1Controller.html", null ], + [ "Exception", null, [ + [ "vulp.spine.exceptions.VulpException", "classvulp_1_1spine_1_1exceptions_1_1VulpException.html", [ + [ "vulp.spine.exceptions.PerformanceIssue", "classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html", null ], + [ "vulp.spine.exceptions.SpineError", "classvulp_1_1spine_1_1exceptions_1_1SpineError.html", null ] + ] ] + ] ], + [ "vulp::actuation::ImuData", "structvulp_1_1actuation_1_1ImuData.html", [ + [ "vulp::actuation::BulletImuData", "structvulp_1_1actuation_1_1BulletImuData.html", null ] + ] ], + [ "vulp::actuation::Interface", "classvulp_1_1actuation_1_1Interface.html", [ + [ "vulp::actuation::BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html", null ], + [ "vulp::actuation::MockInterface", "classvulp_1_1actuation_1_1MockInterface.html", null ], + [ "vulp::actuation::Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html", null ] + ] ], + [ "vulp::observation::Observer", "classvulp_1_1observation_1_1Observer.html", [ + [ "vulp::observation::HistoryObserver< T >", "classvulp_1_1observation_1_1HistoryObserver.html", null ] + ] ], + [ "vulp::observation::ObserverPipeline", "classvulp_1_1observation_1_1ObserverPipeline.html", null ], + [ "vulp::actuation::BulletInterface::Parameters", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html", null ], + [ "vulp.spine::Spine::Parameters", "structvulp_1_1spine_1_1Spine_1_1Parameters.html", null ], + [ "vulp::actuation::ServoLayout", "classvulp_1_1actuation_1_1ServoLayout.html", null ], + [ "vulp::observation::Source", "classvulp_1_1observation_1_1Source.html", [ + [ "vulp::observation::sources::CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html", null ], + [ "vulp::observation::sources::Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html", null ], + [ "vulp::observation::sources::Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html", null ] + ] ], + [ "vulp.spine::Spine", "classvulp_1_1spine_1_1Spine.html", null ], + [ "vulp.spine.spine_interface.SpineInterface", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html", null ], + [ "vulp.spine::StateMachine", "classvulp_1_1spine_1_1StateMachine.html", null ], + [ "vulp.utils::SynchronousClock", "classvulp_1_1utils_1_1SynchronousClock.html", null ], + [ "IntEnum", null, [ + [ "vulp.spine.request.Request", "classvulp_1_1spine_1_1request_1_1Request.html", null ] + ] ] +]; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..91094a9e --- /dev/null +++ b/index.html @@ -0,0 +1,190 @@ + + + + + + + +vulp: Vulp – Robot/simulation switch + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Vulp – Robot/simulation switch
+
+
+

CI Documentation Coverage C++ version Conda version PyPI version

+

Vulp provides an action-observation loop to control robots from a standalone "agent" process, like this:

+

+

Action-observation loop with Vulp

+

The agent can be a simple Python script with few dependencies.

+

Vulp is designed for robots built with the mjbots stack (moteus servo controllers and pi3hat communication board). It provides a robot/simulation switch to train or test agents in Bullet before running them on the real system.

+

Vulp supports Linux and macOS for development, and Raspberry Pi OS for robot deployment.

+

+Installation

+

+From conda-forge

+
conda install -c conda-forge vulp
+

+From PyPI

+
pip install vulp
+

+Example

+

Check out the upkie repository for an example where Vulp is used to implement simulation environments, real-robot spines, state observers and locomotion agents.

+

+Details

+

More accurately, Vulp is a tiny inter-process communication (IPC) protocol shipped with reference libraries (currently in Python and C++, other languages welcome). It is suitable for tasks that require real-time but not high-frequency performance. The main use case for this is balancing, as there is theoretical and empirical evidence suggesting that bipeds and quadrupeds can balance themselves as leisurely as 5–15 Hz, although balance control is frequently implemented at 200–1000 Hz. And if you are wondering whether Python is suitable for real-time applications, we were too! Until we tried it out.

+

In Vulp, a fast program, called a spine, talks to a slow program, called an agent, in a standard action-observation loop. Spine and agent run in separate processes and exchange action and observation dictionaries through shared memory. For instance, action can be a set of joint commands and observation a set of joint observations. Vulp provides a pipeline API to grow more complex spines with additional controllers (for higher-level actions) and observers (for richer observations). For example, a spine can run an inverse kinematics solver, or output its own ground contact estimation.

+

+Features and non-features

+

All design decisions have their pros and cons. Take a look at the features and non-features below to decide if Vulp is a fit to your use case.

+

+Features

+
    +
  • Run the same Python code on simulated and real robots
  • +
  • Interfaces with to the mjbots pi3hat and mjbots actuators
  • +
  • Interfaces with to the Bullet simulator
  • +
  • Observer pipeline to extend observations
  • +
  • 🏗️ Controller pipeline to extend actions
  • +
  • Soft real-time: spine-agent loop interactions are predictable and repeatable
  • +
  • Unit tested, and not only with end-to-end tests
  • +
+

+Non-features

+
    +
  • Low frequency: Vulp is designed for tasks that run in the 1–400 Hz range (like balancing bipeds or quadrupeds)
  • +
  • Soft, not hard real-time guarantee: the code is empirically reliable by a large margin, that's it
  • +
  • Weakly-typed IPC: typing is used within agents and spines, but the interface between them is only checked at runtime
  • +
+

+Alternatives

+

If any of the non-features is a no-go to you, you may also want to check out these existing alternatives:

+
    +
  • kodlab_mjbots_sdk - C++-only framework integrated with LCM for logging and remote I/O. Still a work in progress, only supports torque commands as of writing this note.
  • +
  • mc_rtc - C++ real-time control framework from which Vulp inherited, among others, the idea of running the same code on simulated and real robots. The choice of a weakly-typed dictionary-based IPC was also inspired by mc_rtc's data store. C++ controllers are bigger cathedrals to build but they can run at higher frequencies.
  • +
  • robot_interfaces - Similar IPC between non-realtime Python and real-time C++ processes. The main difference lies in the use of Python bindings and action/observation types (more overhead, more safeguards) where Vulp goes structureless (faster changes, faster blunders). Also, robot_interfaces enforces process synchronization with a time-series API while in Vulp this is up to the agent (most agents act greedily on the latest observation).
  • +
  • ros2_control - A C++ framework for real-time control using ROS2 (still a work in progress). Its barrier of entry is steeper than the other alternatives, making it a fit for production rather than prototyping, as it aims for compatibility with other ROS frameworks like MoveIt. A Vulp C++ spine is equivalent to a ROS ControllerInterface implementing the dictionary-based IPC protocol.
  • +
+

If your robot is built with some of the following open hardware components, you can also use their corresponding Python bindings directly:

+ +

Using control bindings directly is a simpler alternative if you don't need the action-observation loop and simulation/real-robot switch from Vulp.

+

+Q and A

+

+Performance

+

+How can motion control be real-time in Python, with garbage collection and all?

+

Python agents talk with Vulp spines via the SpineInterface, which can process both actions and observations in about 0.7 ± 0.3 ms. This leaves plenty of room to implement other control components in a low-frequency loop. You may also be surprised at how Python performance has improved in recent years (most "tricks" that were popular ten years ago have been optimized away in CPython 3.8+). To consider one data point, here are the cycle periods measured in a complete Python agent for Upkie (the Pink balancer from upkie) running on a Raspberry Pi 4 Model B (Quad core ARM Cortex-A72 @ 1.5GHz). It performs non-trivial tasks like balancing and whole-body inverse kinematics by quadratic programming:

+

+

Note that the aforementioned 0.7 ± 0.3 ms processing time happens on the Python side, and is thus included in the 5.0 ms cycles represented by the orange curve. Meanwhile the spine is set to a reference frequency of 1.0 kHz and its corresponding cycle period was measured here at 1.0 ± 0.05 ms.

+

+I just started a simulation spine but it's surprisingly slow, how come?

+

Make sure you switch Bazel's compilation mode to "opt" when running both robot experiments and simulations. The compilation mode is "fastbuild" by default. Note that it is totally fine to compile agents in "fastbuild" during development while testing them on a spine compiled in "opt" that keeps running in the background.

+

+I have a Bullet simulation where the robot balances fine, but the agent repeatedly warns it "Skipped X clock cycles". What could be causing this?

+

This happens when your CPU is not powerful enough to run the simulator in real-time along with your agent and spine. You can call Spine::simulate with nb_substeps = 1 instead of Spine::run, which will result in the correct simulation time from the agent's point of view but make the simulation slower than real-time from your point of view.

+

+I'm running a pi3hat spine, why are my timings more erratic than the ones plotted above?

+

Make sure you configure CPU isolation and set the scaling governor to performance for real-time performance on a Raspberry Pi.

+

+Design choices

+

+Why use dictionaries rather than an <a href="https://en.wikipedia.org/wiki/Interface_description_language">interface description language</a> like Protocol Buffers?

+

Interface description languages like Protocol Buffers are strongly typed: they formally specify a data exchange format that has to be written down and maintained, but brings benefits like versioning or breaking-change detection. Vulp, on the other hand, follows a weakly-typed, self-describing approach that is better suited to prototyping with rapidly-changing APIs: the spec is in the code. If an agent and spine communicate with incompatible/incomplete actions/observations, execution will break, begging for developers to fix it.

+

+Why the weakly-typed dictionary IPC rather than Python–C++ bindings?

+

Vulp is designed for prototyping: it strives to eliminate intermediaries when it can, and keep a low barrier of entry. Python bindings bring the benefits of typing and are a good choice in production contexts, but like interface description languages, they also add overhead in terms of developer training, bookkeeping code and compilation time. Vulp rather goes for a crash-early approach: fast changes, fast blunders (interface errors raise exceptions that end execution), fast fixes (know immediately when an error was introduced).

+

+Is it possible to run two agents at the same time?

+

That is not possible. One of the core assumptions in Vulp is that the agent and the spine are two respective processes communicating via one single shared-memory area. In this Vulp differs from e.g. ROS, which is multi-process by design. This design choice is discussed in #55.

+

+Why the name "Vulp"?

+

Vulp means "fox" in Romansh, a language spoken in the Swiss canton of the Grisons. Foxes are arguably quite reliable in their reaction times 🦊

+
+
+
+ + + + diff --git a/inherit_graph_0.map b/inherit_graph_0.map new file mode 100644 index 00000000..47be647a --- /dev/null +++ b/inherit_graph_0.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/inherit_graph_0.md5 b/inherit_graph_0.md5 new file mode 100644 index 00000000..7d9730a1 --- /dev/null +++ b/inherit_graph_0.md5 @@ -0,0 +1 @@ +478a82cd2e54dfdb87210dc8309c4aef \ No newline at end of file diff --git a/inherit_graph_0.png b/inherit_graph_0.png new file mode 100644 index 00000000..9981feb6 Binary files /dev/null and b/inherit_graph_0.png differ diff --git a/inherit_graph_1.map b/inherit_graph_1.map new file mode 100644 index 00000000..62f282a0 --- /dev/null +++ b/inherit_graph_1.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_1.md5 b/inherit_graph_1.md5 new file mode 100644 index 00000000..bde61045 --- /dev/null +++ b/inherit_graph_1.md5 @@ -0,0 +1 @@ +76b563e19cba7075db615db58439b731 \ No newline at end of file diff --git a/inherit_graph_1.png b/inherit_graph_1.png new file mode 100644 index 00000000..c6226113 Binary files /dev/null and b/inherit_graph_1.png differ diff --git a/inherit_graph_10.map b/inherit_graph_10.map new file mode 100644 index 00000000..5eeecab2 --- /dev/null +++ b/inherit_graph_10.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_10.md5 b/inherit_graph_10.md5 new file mode 100644 index 00000000..b8fa6a8a --- /dev/null +++ b/inherit_graph_10.md5 @@ -0,0 +1 @@ +dac7afa7689d4a0da5ddb4cbf29c87f0 \ No newline at end of file diff --git a/inherit_graph_10.png b/inherit_graph_10.png new file mode 100644 index 00000000..7b9ac2f4 Binary files /dev/null and b/inherit_graph_10.png differ diff --git a/inherit_graph_11.map b/inherit_graph_11.map new file mode 100644 index 00000000..b522a65b --- /dev/null +++ b/inherit_graph_11.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_11.md5 b/inherit_graph_11.md5 new file mode 100644 index 00000000..6966d376 --- /dev/null +++ b/inherit_graph_11.md5 @@ -0,0 +1 @@ +8b5f12309d8655ade3032d10ccd4b0cf \ No newline at end of file diff --git a/inherit_graph_11.png b/inherit_graph_11.png new file mode 100644 index 00000000..7fb23c40 Binary files /dev/null and b/inherit_graph_11.png differ diff --git a/inherit_graph_12.map b/inherit_graph_12.map new file mode 100644 index 00000000..7f8f5c5a --- /dev/null +++ b/inherit_graph_12.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/inherit_graph_12.md5 b/inherit_graph_12.md5 new file mode 100644 index 00000000..e2c6a171 --- /dev/null +++ b/inherit_graph_12.md5 @@ -0,0 +1 @@ +9aa3f35d052fce16d4418fe6223204bd \ No newline at end of file diff --git a/inherit_graph_12.png b/inherit_graph_12.png new file mode 100644 index 00000000..7304d5d4 Binary files /dev/null and b/inherit_graph_12.png differ diff --git a/inherit_graph_13.map b/inherit_graph_13.map new file mode 100644 index 00000000..9ae7fa34 --- /dev/null +++ b/inherit_graph_13.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_13.md5 b/inherit_graph_13.md5 new file mode 100644 index 00000000..d043d07a --- /dev/null +++ b/inherit_graph_13.md5 @@ -0,0 +1 @@ +45fad3a5bb0fb631023827e19385640f \ No newline at end of file diff --git a/inherit_graph_13.png b/inherit_graph_13.png new file mode 100644 index 00000000..a51455f4 Binary files /dev/null and b/inherit_graph_13.png differ diff --git a/inherit_graph_14.map b/inherit_graph_14.map new file mode 100644 index 00000000..8846f674 --- /dev/null +++ b/inherit_graph_14.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_14.md5 b/inherit_graph_14.md5 new file mode 100644 index 00000000..23819779 --- /dev/null +++ b/inherit_graph_14.md5 @@ -0,0 +1 @@ +03aa961050f67a3ca8efad858806bfac \ No newline at end of file diff --git a/inherit_graph_14.png b/inherit_graph_14.png new file mode 100644 index 00000000..bbb024d9 Binary files /dev/null and b/inherit_graph_14.png differ diff --git a/inherit_graph_15.map b/inherit_graph_15.map new file mode 100644 index 00000000..22001b63 --- /dev/null +++ b/inherit_graph_15.map @@ -0,0 +1,4 @@ + + + + diff --git a/inherit_graph_15.md5 b/inherit_graph_15.md5 new file mode 100644 index 00000000..f31f1ef2 --- /dev/null +++ b/inherit_graph_15.md5 @@ -0,0 +1 @@ +b1d46823829240d7b0f8f0b6220f3018 \ No newline at end of file diff --git a/inherit_graph_15.png b/inherit_graph_15.png new file mode 100644 index 00000000..a5447934 Binary files /dev/null and b/inherit_graph_15.png differ diff --git a/inherit_graph_16.map b/inherit_graph_16.map new file mode 100644 index 00000000..12581b36 --- /dev/null +++ b/inherit_graph_16.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_16.md5 b/inherit_graph_16.md5 new file mode 100644 index 00000000..64a24cb0 --- /dev/null +++ b/inherit_graph_16.md5 @@ -0,0 +1 @@ +71b9fb1722a5dc40499a162c14cdbdae \ No newline at end of file diff --git a/inherit_graph_16.png b/inherit_graph_16.png new file mode 100644 index 00000000..8cd209de Binary files /dev/null and b/inherit_graph_16.png differ diff --git a/inherit_graph_17.map b/inherit_graph_17.map new file mode 100644 index 00000000..f7fbea3d --- /dev/null +++ b/inherit_graph_17.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/inherit_graph_17.md5 b/inherit_graph_17.md5 new file mode 100644 index 00000000..fcaedbab --- /dev/null +++ b/inherit_graph_17.md5 @@ -0,0 +1 @@ +24a95f6e845152ce8b5321cc3a6d5ce0 \ No newline at end of file diff --git a/inherit_graph_17.png b/inherit_graph_17.png new file mode 100644 index 00000000..77e6834e Binary files /dev/null and b/inherit_graph_17.png differ diff --git a/inherit_graph_2.map b/inherit_graph_2.map new file mode 100644 index 00000000..70642792 --- /dev/null +++ b/inherit_graph_2.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_2.md5 b/inherit_graph_2.md5 new file mode 100644 index 00000000..6a58ebad --- /dev/null +++ b/inherit_graph_2.md5 @@ -0,0 +1 @@ +ca319b2e801181568d683de8049e31a9 \ No newline at end of file diff --git a/inherit_graph_2.png b/inherit_graph_2.png new file mode 100644 index 00000000..c63f8cd3 Binary files /dev/null and b/inherit_graph_2.png differ diff --git a/inherit_graph_3.map b/inherit_graph_3.map new file mode 100644 index 00000000..6d718e6b --- /dev/null +++ b/inherit_graph_3.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_3.md5 b/inherit_graph_3.md5 new file mode 100644 index 00000000..6ad434a8 --- /dev/null +++ b/inherit_graph_3.md5 @@ -0,0 +1 @@ +dc79b38f92cdf2bce0866cb633072e00 \ No newline at end of file diff --git a/inherit_graph_3.png b/inherit_graph_3.png new file mode 100644 index 00000000..2b4e549d Binary files /dev/null and b/inherit_graph_3.png differ diff --git a/inherit_graph_4.map b/inherit_graph_4.map new file mode 100644 index 00000000..000d6bbb --- /dev/null +++ b/inherit_graph_4.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_4.md5 b/inherit_graph_4.md5 new file mode 100644 index 00000000..31e026cb --- /dev/null +++ b/inherit_graph_4.md5 @@ -0,0 +1 @@ +b5de84ce4c919c8fac5211d0cb8031d3 \ No newline at end of file diff --git a/inherit_graph_4.png b/inherit_graph_4.png new file mode 100644 index 00000000..f54cf24b Binary files /dev/null and b/inherit_graph_4.png differ diff --git a/inherit_graph_5.map b/inherit_graph_5.map new file mode 100644 index 00000000..2cfe5e53 --- /dev/null +++ b/inherit_graph_5.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_5.md5 b/inherit_graph_5.md5 new file mode 100644 index 00000000..12867587 --- /dev/null +++ b/inherit_graph_5.md5 @@ -0,0 +1 @@ +925388437fee02e53bcc453b97c71504 \ No newline at end of file diff --git a/inherit_graph_5.png b/inherit_graph_5.png new file mode 100644 index 00000000..f1df3331 Binary files /dev/null and b/inherit_graph_5.png differ diff --git a/inherit_graph_6.map b/inherit_graph_6.map new file mode 100644 index 00000000..e6321a22 --- /dev/null +++ b/inherit_graph_6.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_6.md5 b/inherit_graph_6.md5 new file mode 100644 index 00000000..679ca5bf --- /dev/null +++ b/inherit_graph_6.md5 @@ -0,0 +1 @@ +d637c797f852c4c6a7dbf591a93740a6 \ No newline at end of file diff --git a/inherit_graph_6.png b/inherit_graph_6.png new file mode 100644 index 00000000..52fe3e43 Binary files /dev/null and b/inherit_graph_6.png differ diff --git a/inherit_graph_7.map b/inherit_graph_7.map new file mode 100644 index 00000000..37d97f53 --- /dev/null +++ b/inherit_graph_7.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_7.md5 b/inherit_graph_7.md5 new file mode 100644 index 00000000..e57c9f45 --- /dev/null +++ b/inherit_graph_7.md5 @@ -0,0 +1 @@ +a5863b6ba70917515f8afb887352cfc2 \ No newline at end of file diff --git a/inherit_graph_7.png b/inherit_graph_7.png new file mode 100644 index 00000000..6a908229 Binary files /dev/null and b/inherit_graph_7.png differ diff --git a/inherit_graph_8.map b/inherit_graph_8.map new file mode 100644 index 00000000..dc4d7b3d --- /dev/null +++ b/inherit_graph_8.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_8.md5 b/inherit_graph_8.md5 new file mode 100644 index 00000000..f93462df --- /dev/null +++ b/inherit_graph_8.md5 @@ -0,0 +1 @@ +5f3c7313f6bd204d9d2c2f28089672b2 \ No newline at end of file diff --git a/inherit_graph_8.png b/inherit_graph_8.png new file mode 100644 index 00000000..e391b12e Binary files /dev/null and b/inherit_graph_8.png differ diff --git a/inherit_graph_9.map b/inherit_graph_9.map new file mode 100644 index 00000000..c280b773 --- /dev/null +++ b/inherit_graph_9.map @@ -0,0 +1,3 @@ + + + diff --git a/inherit_graph_9.md5 b/inherit_graph_9.md5 new file mode 100644 index 00000000..9393c9b5 --- /dev/null +++ b/inherit_graph_9.md5 @@ -0,0 +1 @@ +e459c85b739c44e8eb8a7c39f37fb664 \ No newline at end of file diff --git a/inherit_graph_9.png b/inherit_graph_9.png new file mode 100644 index 00000000..11290d68 Binary files /dev/null and b/inherit_graph_9.png differ diff --git a/inherits.html b/inherits.html new file mode 100644 index 00000000..eaaf300d --- /dev/null +++ b/inherits.html @@ -0,0 +1,205 @@ + + + + + + + +vulp: Class Hierarchy + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ + + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +
+ + + + +
+ + + + + + +
+ + + +
+ + + +
+ + + + +
+ + + +
+ + + + + + +
+
+
+ + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 00000000..103c32d7 --- /dev/null +++ b/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/low__pass__filter_8h.html b/low__pass__filter_8h.html new file mode 100644 index 00000000..865a4aa1 --- /dev/null +++ b/low__pass__filter_8h.html @@ -0,0 +1,134 @@ + + + + + + + +vulp: vulp/utils/low_pass_filter.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
low_pass_filter.h File Reference
+
+
+
#include <stdexcept>
+#include <string>
+#include "vulp/exceptions/FilterError.h"
+
+Include dependency graph for low_pass_filter.h:
+
+
+ + + + + + +
+
+

Go to the source code of this file.

+ + + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
+ + + + +

+Functions

double vulp.utils::low_pass_filter (double prev_output, double cutoff_period, double new_input, double dt)
 Low-pass filter as an inline function. More...
 
+
+
+ + + + diff --git a/low__pass__filter_8h.js b/low__pass__filter_8h.js new file mode 100644 index 00000000..7104cce3 --- /dev/null +++ b/low__pass__filter_8h.js @@ -0,0 +1,4 @@ +var low__pass__filter_8h = +[ + [ "low_pass_filter", "low__pass__filter_8h.html#a82e8f66ca7a05a1fe40afeac8cfea205", null ] +]; \ No newline at end of file diff --git a/low__pass__filter_8h__incl.map b/low__pass__filter_8h__incl.map new file mode 100644 index 00000000..cd6f9c55 --- /dev/null +++ b/low__pass__filter_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/low__pass__filter_8h__incl.md5 b/low__pass__filter_8h__incl.md5 new file mode 100644 index 00000000..1fe3e33a --- /dev/null +++ b/low__pass__filter_8h__incl.md5 @@ -0,0 +1 @@ +7704a0807d696c7b68b5313c17982082 \ No newline at end of file diff --git a/low__pass__filter_8h__incl.png b/low__pass__filter_8h__incl.png new file mode 100644 index 00000000..b7d6052e Binary files /dev/null and b/low__pass__filter_8h__incl.png differ diff --git a/low__pass__filter_8h_source.html b/low__pass__filter_8h_source.html new file mode 100644 index 00000000..95fe64e2 --- /dev/null +++ b/low__pass__filter_8h_source.html @@ -0,0 +1,134 @@ + + + + + + + +vulp: vulp/utils/low_pass_filter.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
low_pass_filter.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <stdexcept>
+
7 #include <string>
+
8 
+
9 #include "vulp/exceptions/FilterError.h"
+
10 
+
11 namespace vulp::utils {
+
12 
+
13 using vulp::exceptions::FilterError;
+
14 
+
24 inline double low_pass_filter(double prev_output, double cutoff_period,
+
25  double new_input, double dt) {
+
26  // Make sure the cutoff period is not too small
+
27  if (cutoff_period <= 2.0 * dt) {
+
28  auto message =
+
29  std::string("[low_pass_filter] Cutoff period ") +
+
30  std::to_string(cutoff_period) +
+
31  " s is less than 2 * dt = " + std::to_string(2.0 * dt) +
+
32  " s, causing information loss (Nyquist–Shannon sampling theorem)";
+
33  throw FilterError(message);
+
34  }
+
35 
+
36  // Actual filtering ;)
+
37  const double alpha = dt / cutoff_period;
+
38  return prev_output + alpha * (new_input - prev_output);
+
39 }
+
40 
+
41 } // namespace vulp::utils
+
Utility functions.
Definition: __init__.py:1
+
double low_pass_filter(double prev_output, double cutoff_period, double new_input, double dt)
Low-pass filter as an inline function.
+
+
+ + + + diff --git a/math_8h.html b/math_8h.html new file mode 100644 index 00000000..aaa8093f --- /dev/null +++ b/math_8h.html @@ -0,0 +1,142 @@ + + + + + + + +vulp: vulp/utils/math.h File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
math.h File Reference
+
+
+
#include <cstdint>
+
+Include dependency graph for math.h:
+
+
+ + + + +
+
+This graph shows which files directly or indirectly include this file:
+
+
+ + + + +
+
+

Go to the source code of this file.

+ + + + + + + + + + +

+Namespaces

 vulp
 
 vulp.utils
 Utility functions.
 
 vulp::utils::math
 Mathematical functions.
 
+ + + + +

+Functions

bool vulp::utils::math::divides (uint32_t number, uint32_t divisor)
 True if and only if divisor divides number. More...
 
+
+
+ + + + diff --git a/math_8h.js b/math_8h.js new file mode 100644 index 00000000..83689005 --- /dev/null +++ b/math_8h.js @@ -0,0 +1,4 @@ +var math_8h = +[ + [ "divides", "math_8h.html#a8c590daf31618ab64f1f0f044ed81148", null ] +]; \ No newline at end of file diff --git a/math_8h__dep__incl.map b/math_8h__dep__incl.map new file mode 100644 index 00000000..3b2a6902 --- /dev/null +++ b/math_8h__dep__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/math_8h__dep__incl.md5 b/math_8h__dep__incl.md5 new file mode 100644 index 00000000..09d0865f --- /dev/null +++ b/math_8h__dep__incl.md5 @@ -0,0 +1 @@ +57c152e6d3f61f0c4a385119d48d9a88 \ No newline at end of file diff --git a/math_8h__dep__incl.png b/math_8h__dep__incl.png new file mode 100644 index 00000000..44cd98b3 Binary files /dev/null and b/math_8h__dep__incl.png differ diff --git a/math_8h__incl.map b/math_8h__incl.map new file mode 100644 index 00000000..1ba31b65 --- /dev/null +++ b/math_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/math_8h__incl.md5 b/math_8h__incl.md5 new file mode 100644 index 00000000..853d8d5b --- /dev/null +++ b/math_8h__incl.md5 @@ -0,0 +1 @@ +15f1a9916a2754146ef0d7d7b326482c \ No newline at end of file diff --git a/math_8h__incl.png b/math_8h__incl.png new file mode 100644 index 00000000..c4952177 Binary files /dev/null and b/math_8h__incl.png differ diff --git a/math_8h_source.html b/math_8h_source.html new file mode 100644 index 00000000..2c7fa4f7 --- /dev/null +++ b/math_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/utils/math.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
vulp +  2.4.0 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
math.h
+
+
+Go to the documentation of this file.
1 // SPDX-License-Identifier: Apache-2.0
+
2 // Copyright 2022 Stéphane Caron
+
3 
+
4 #pragma once
+
5 
+
6 #include <cstdint>
+
7 
+
9 namespace vulp::utils {
+
10 
+
12 namespace math {
+
13 
+
15 inline bool divides(uint32_t number, uint32_t divisor) {
+
16  if (divisor == 0) {
+
17  return false;
+
18  }
+
19  uint32_t k = number / divisor;
+
20  return (number == k * divisor);
+
21 }
+
22 
+
23 } // namespace math
+
24 
+
25 } // namespace vulp::utils
+
bool divides(uint32_t number, uint32_t divisor)
True if and only if divisor divides number.
Definition: math.h:15
+
Utility functions.
Definition: __init__.py:1
+
+
+ + + + diff --git a/menu.js b/menu.js new file mode 100644 index 00000000..2fe2214f --- /dev/null +++ b/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..f646ccde --- /dev/null +++ b/menudata.js @@ -0,0 +1,125 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"b",url:"namespacemembers.html#index_b"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"f",url:"namespacemembers.html#index_f"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"h",url:"namespacemembers.html#index_h"}, +{text:"i",url:"namespacemembers.html#index_i"}, +{text:"k",url:"namespacemembers.html#index_k"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"o",url:"namespacemembers.html#index_o"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"w",url:"namespacemembers.html#index_w"}]}, +{text:"Functions",url:"namespacemembers_func.html"}, +{text:"Variables",url:"namespacemembers_vars.html"}, +{text:"Typedefs",url:"namespacemembers_type.html"}, +{text:"Enumerations",url:"namespacemembers_enum.html"}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"k",url:"functions.html#index_k"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"j",url:"functions_func.html#index_j"}, +{text:"k",url:"functions_func.html#index_k"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"j",url:"functions_vars.html#index_j"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"w",url:"functions_vars.html#index_w"}]}, +{text:"Typedefs",url:"functions_type.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Functions",url:"globals_func.html"}, +{text:"Variables",url:"globals_vars.html"}]}]}]} diff --git a/namespacemembers.html b/namespacemembers.html new file mode 100644 index 00000000..8355f0de --- /dev/null +++ b/namespacemembers.html @@ -0,0 +1,267 @@ + + + + + + + +vulp: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - k -

    + + +

    - l -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - w -

    +
    +
    + + + + diff --git a/namespacemembers_enum.html b/namespacemembers_enum.html new file mode 100644 index 00000000..868ec6fe --- /dev/null +++ b/namespacemembers_enum.html @@ -0,0 +1,109 @@ + + + + + + + +vulp: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/namespacemembers_func.html b/namespacemembers_func.html new file mode 100644 index 00000000..18c6f270 --- /dev/null +++ b/namespacemembers_func.html @@ -0,0 +1,160 @@ + + + + + + + +vulp: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/namespacemembers_type.html b/namespacemembers_type.html new file mode 100644 index 00000000..5f4f9e44 --- /dev/null +++ b/namespacemembers_type.html @@ -0,0 +1,100 @@ + + + + + + + +vulp: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/namespacemembers_vars.html b/namespacemembers_vars.html new file mode 100644 index 00000000..a11c3b4b --- /dev/null +++ b/namespacemembers_vars.html @@ -0,0 +1,127 @@ + + + + + + + +vulp: Namespace Members + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    + + + + diff --git a/namespaces.html b/namespaces.html new file mode 100644 index 00000000..94ba7234 --- /dev/null +++ b/namespaces.html @@ -0,0 +1,145 @@ + + + + + + + +vulp: Namespace List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Namespace List
    +
    +
    +
    Here is a list of all namespaces with brief descriptions:
    +
    [detail level 1234]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Nvulp
     NactuationSend actions to actuators or simulators
     Ndefault_action
     CBulletContactDataContact information for a single link
     CBulletImuData
     CBulletInterfaceActuation interface for the Bullet simulator
     CParametersInterface parameters
     CBulletJointPropertiesProperties for robot joints in the Bullet simulation
     CImuDataData filtered from an onboard IMU such as the pi3hat's
     CInterfaceBase class for actuation interfaces
     CMockInterface
     CPi3HatInterfaceInterface to moteus controllers
     CServoLayoutMap between servos, their busses and the joints they actuate
     NcontrolWIP: Process higher-level actions down to joint commands
     CControllerBase class for controllers
     NobservationState observation
     Nsources
     CCpuTemperatureSource for CPU temperature readings
     CJoystickSource for a joystick controller
     CKeyboardSource for reading Keyboard inputs
     CHistoryObserverReport high-frequency history vectors to lower-frequency agents
     CObserverBase class for observers
     CObserverPipelineObserver pipeline
     CSourceBase class for sources
     NspineInter-process communication protocol with the spine
     Nexceptions
     CVulpExceptionBase class for exceptions raised by Vulp
     CPerformanceIssueException raised when a performance issue is detected
     CSpineErrorException raised when the spine sets an error flag in the request field of the shared memory map
     Nrequest
     CRequestFlag set by the agent to request an operation from the spine
     Nspine_interface
     CSpineInterfaceInterface to interact with a spine from a Python agent
     CAgentInterfaceMemory map to shared memory
     CSpineLoop transmitting actions to the actuation and observations to the agent
     CParametersSpine parameters
     CStateMachineSpine state machine
     NutilsUtility functions
     Ninternal
     NmathMathematical functions
     Nserialize
     CSynchronousClockSynchronous (blocking) clock
    +
    +
    +
    + + + + diff --git a/namespaces_dup.js b/namespaces_dup.js new file mode 100644 index 00000000..321122b5 --- /dev/null +++ b/namespaces_dup.js @@ -0,0 +1,4 @@ +var namespaces_dup = +[ + [ "vulp", "namespacevulp.html", "namespacevulp" ] +]; \ No newline at end of file diff --git a/namespacevulp.html b/namespacevulp.html new file mode 100644 index 00000000..d0276bec --- /dev/null +++ b/namespacevulp.html @@ -0,0 +1,121 @@ + + + + + + + +vulp: vulp Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp Namespace Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Namespaces

     actuation
     Send actions to actuators or simulators.
     
     control
     WIP: Process higher-level actions down to joint commands.
     
     observation
     State observation.
     
     spine
     Inter-process communication protocol with the spine.
     
     utils
     Utility functions.
     
    +
    +
    + + + + diff --git a/namespacevulp.js b/namespacevulp.js new file mode 100644 index 00000000..e432be9d --- /dev/null +++ b/namespacevulp.js @@ -0,0 +1,8 @@ +var namespacevulp = +[ + [ "actuation", "namespacevulp_1_1actuation.html", "namespacevulp_1_1actuation" ], + [ "control", "namespacevulp_1_1control.html", "namespacevulp_1_1control" ], + [ "observation", "namespacevulp_1_1observation.html", "namespacevulp_1_1observation" ], + [ "spine", "namespacevulp_1_1spine.html", "namespacevulp_1_1spine" ], + [ "utils", "namespacevulp_1_1utils.html", "namespacevulp_1_1utils" ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1actuation.html b/namespacevulp_1_1actuation.html new file mode 100644 index 00000000..3af1018e --- /dev/null +++ b/namespacevulp_1_1actuation.html @@ -0,0 +1,549 @@ + + + + + + + +vulp: vulp::actuation Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation Namespace Reference
    +
    +
    + +

    Send actions to actuators or simulators. +More...

    + + + + +

    +Namespaces

     default_action
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Classes

    struct  BulletContactData
     Contact information for a single link. More...
     
    struct  BulletImuData
     
    class  BulletInterface
     Actuation interface for the Bullet simulator. More...
     
    struct  BulletJointProperties
     Properties for robot joints in the Bullet simulation. More...
     
    struct  ImuData
     Data filtered from an onboard IMU such as the pi3hat's. More...
     
    class  Interface
     Base class for actuation interfaces. More...
     
    class  MockInterface
     
    class  Pi3HatInterface
     Interface to moteus controllers. More...
     
    class  ServoLayout
     Map between servos, their busses and the joints they actuate. More...
     
    + + + +

    +Typedefs

    using Pi3Hat = ::mjbots::pi3hat::Pi3Hat
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    btQuaternion bullet_from_eigen (const Eigen::Quaterniond &quat)
     Convert an Eigen quaternion to a Bullet one. More...
     
    btVector3 bullet_from_eigen (const Eigen::Vector3d &v)
     Convert an Eigen vector to a Bullet one. More...
     
    Eigen::Quaterniond eigen_from_bullet (const btQuaternion &quat)
     Convert a Bullet quaternion to an Eigen one. More...
     
    Eigen::Vector3d eigen_from_bullet (const btVector3 &v)
     Convert a Bullet vector to an Eigen one. More...
     
    int find_link_index (b3RobotSimulatorClientAPI &bullet, int robot, const std::string &link_name) noexcept
     Find the index of a link. More...
     
    void read_imu_data (BulletImuData &imu_data, b3RobotSimulatorClientAPI &bullet, int robot, const int imu_link_index, double dt)
     Compute IMU readings from the IMU link state. More...
     
    std::string find_plane_urdf (const std::string argv0)
     
    actuation::moteus::QueryCommand get_query_resolution ()
     Query resolution settings for all servo commands. More...
     
    actuation::moteus::PositionResolution get_position_resolution ()
     Resolution settings for all servo commands. More...
     
    +

    Detailed Description

    +

    Send actions to actuators or simulators.

    +

    Typedef Documentation

    + +

    ◆ Pi3Hat

    + +
    +
    + + + + +
    using vulp::actuation::Pi3Hat = typedef ::mjbots::pi3hat::Pi3Hat
    +
    + +

    Definition at line 36 of file Pi3HatInterface.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ bullet_from_eigen() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    btQuaternion vulp::actuation::bullet_from_eigen (const Eigen::Quaterniond & quat)
    +
    +inline
    +
    + +

    Convert an Eigen quaternion to a Bullet one.

    +
    Parameters
    + + +
    [in]quatEigen quaternion.
    +
    +
    +
    Returns
    Same quaternion for Bullet.
    + +

    Definition at line 21 of file bullet_utils.h.

    + +
    +
    + +

    ◆ bullet_from_eigen() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    btVector3 vulp::actuation::bullet_from_eigen (const Eigen::Vector3d & v)
    +
    +inline
    +
    + +

    Convert an Eigen vector to a Bullet one.

    +
    Parameters
    + + +
    [in]vEigen vector.
    +
    +
    +
    Returns
    Same vector for Bullet.
    + +

    Definition at line 31 of file bullet_utils.h.

    + +
    +
    + +

    ◆ eigen_from_bullet() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    Eigen::Quaterniond vulp::actuation::eigen_from_bullet (const btQuaternion & quat)
    +
    +inline
    +
    + +

    Convert a Bullet quaternion to an Eigen one.

    +
    Parameters
    + + +
    [in]quatBullet quaternion.
    +
    +
    +
    Returns
    Same vector for Eigen.
    + +

    Definition at line 41 of file bullet_utils.h.

    + +
    +
    + +

    ◆ eigen_from_bullet() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    Eigen::Vector3d vulp::actuation::eigen_from_bullet (const btVector3 & v)
    +
    +inline
    +
    + +

    Convert a Bullet vector to an Eigen one.

    +
    Parameters
    + + +
    [in]quatBullet vector.
    +
    +
    +
    Returns
    Same vector for Eigen.
    + +

    Definition at line 51 of file bullet_utils.h.

    + +
    +
    + +

    ◆ find_link_index()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int vulp::actuation::find_link_index (b3RobotSimulatorClientAPI & bullet,
    int robot,
    const std::string & link_name 
    )
    +
    +inlinenoexcept
    +
    + +

    Find the index of a link.

    +
    Parameters
    + + + + +
    [in]bulletBullet client.
    [in]robotIndex of the robot to search.
    [in]link_nameName of the searched link.
    +
    +
    +
    Returns
    Link index if found, -1 otherwise.
    + +

    Definition at line 63 of file bullet_utils.h.

    + +
    +
    + +

    ◆ find_plane_urdf()

    + +
    +
    + + + + + + + + +
    std::string vulp::actuation::find_plane_urdf (const std::string argv0)
    +
    + +

    Definition at line 17 of file BulletInterface.cpp.

    + +
    +
    + +

    ◆ get_position_resolution()

    + +
    +
    + + + + + +
    + + + + + + + +
    actuation::moteus::PositionResolution vulp::actuation::get_position_resolution ()
    +
    +inline
    +
    + +

    Resolution settings for all servo commands.

    +
    Returns
    Resolution settings.
    +

    For now these settings are common to all interfaces but we can easily turn them into parameters.

    + +

    Definition at line 41 of file resolution.h.

    + +
    +
    + +

    ◆ get_query_resolution()

    + +
    +
    + + + + + +
    + + + + + + + +
    actuation::moteus::QueryCommand vulp::actuation::get_query_resolution ()
    +
    +inline
    +
    + +

    Query resolution settings for all servo commands.

    +
    Returns
    Query resolution settings.
    +

    For now these settings are common to all interfaces but we can easily turn them into parameters.

    + +

    Definition at line 18 of file resolution.h.

    + +
    +
    + +

    ◆ read_imu_data()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void vulp::actuation::read_imu_data (BulletImuDataimu_data,
    b3RobotSimulatorClientAPI & bullet,
    int robot,
    const int imu_link_index,
    double dt 
    )
    +
    +inline
    +
    + +

    Compute IMU readings from the IMU link state.

    +
    Parameters
    + + + + + + +
    [out]imu_dataIMU data to update.
    [in]bulletBullet client.
    [in]robotBullet index of the robot model.
    [in]imu_link_indexIndex of the IMU link in the robot.
    [in]dtSimulation timestep in [s].
    +
    +
    + +

    Definition at line 84 of file bullet_utils.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1actuation.js b/namespacevulp_1_1actuation.js new file mode 100644 index 00000000..99702baf --- /dev/null +++ b/namespacevulp_1_1actuation.js @@ -0,0 +1,29 @@ +var namespacevulp_1_1actuation = +[ + [ "default_action", "namespacevulp_1_1actuation_1_1default__action.html", [ + [ "kFeedforwardTorque", "namespacevulp_1_1actuation_1_1default__action.html#acd6b5f4fab30ca4fa011b072eb178db3", null ], + [ "kKdScale", "namespacevulp_1_1actuation_1_1default__action.html#a37fdf95f3ecb19b772ed1ed45b5864e9", null ], + [ "kKpScale", "namespacevulp_1_1actuation_1_1default__action.html#a9b7395da45f48d599f21ac8d53358a02", null ], + [ "kMaximumTorque", "namespacevulp_1_1actuation_1_1default__action.html#a162f94f351be65ad299e955232e415aa", null ], + [ "kVelocity", "namespacevulp_1_1actuation_1_1default__action.html#a1f6d1969f4382b8e086bb89c0514760d", null ] + ] ], + [ "BulletContactData", "structvulp_1_1actuation_1_1BulletContactData.html", "structvulp_1_1actuation_1_1BulletContactData" ], + [ "BulletImuData", "structvulp_1_1actuation_1_1BulletImuData.html", "structvulp_1_1actuation_1_1BulletImuData" ], + [ "BulletInterface", "classvulp_1_1actuation_1_1BulletInterface.html", "classvulp_1_1actuation_1_1BulletInterface" ], + [ "BulletJointProperties", "structvulp_1_1actuation_1_1BulletJointProperties.html", "structvulp_1_1actuation_1_1BulletJointProperties" ], + [ "ImuData", "structvulp_1_1actuation_1_1ImuData.html", "structvulp_1_1actuation_1_1ImuData" ], + [ "Interface", "classvulp_1_1actuation_1_1Interface.html", "classvulp_1_1actuation_1_1Interface" ], + [ "MockInterface", "classvulp_1_1actuation_1_1MockInterface.html", "classvulp_1_1actuation_1_1MockInterface" ], + [ "Pi3HatInterface", "classvulp_1_1actuation_1_1Pi3HatInterface.html", "classvulp_1_1actuation_1_1Pi3HatInterface" ], + [ "ServoLayout", "classvulp_1_1actuation_1_1ServoLayout.html", "classvulp_1_1actuation_1_1ServoLayout" ], + [ "Pi3Hat", "namespacevulp_1_1actuation.html#ab2b376daf35eae21e48708f9b3f63460", null ], + [ "bullet_from_eigen", "namespacevulp_1_1actuation.html#ac2af057ce6d42297f974e1386b1b34b3", null ], + [ "bullet_from_eigen", "namespacevulp_1_1actuation.html#a225ab1b9ea7b3dd97f298768e432246a", null ], + [ "eigen_from_bullet", "namespacevulp_1_1actuation.html#a57658aadbd0ec10129a9692fe4c281f4", null ], + [ "eigen_from_bullet", "namespacevulp_1_1actuation.html#a3b0ac5d01ef820488834702e962bc765", null ], + [ "find_link_index", "namespacevulp_1_1actuation.html#ae3bf38e32e44b3a353850acb05bbd81a", null ], + [ "find_plane_urdf", "namespacevulp_1_1actuation.html#aabb66d6b3cd81c772937088266af0829", null ], + [ "get_position_resolution", "namespacevulp_1_1actuation.html#ac48c5992ecb62d9c23d2970d3408afdd", null ], + [ "get_query_resolution", "namespacevulp_1_1actuation.html#a5ee46598099be18d955806e127b76a38", null ], + [ "read_imu_data", "namespacevulp_1_1actuation.html#a17c7faa08c40ba9298774b4da1c86edb", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1actuation_1_1default__action.html b/namespacevulp_1_1actuation_1_1default__action.html new file mode 100644 index 00000000..d5bcd6f2 --- /dev/null +++ b/namespacevulp_1_1actuation_1_1default__action.html @@ -0,0 +1,237 @@ + + + + + + + +vulp: vulp::actuation::default_action Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::default_action Namespace Reference
    +
    +
    + + + + + + + + + + + + +

    +Variables

    constexpr double kFeedforwardTorque = 0.0
     
    constexpr double kVelocity = 0.0
     
    constexpr double kKpScale = 1.0
     
    constexpr double kKdScale = 1.0
     
    constexpr double kMaximumTorque = 1.0
     
    +

    Variable Documentation

    + +

    ◆ kFeedforwardTorque

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::actuation::default_action::kFeedforwardTorque = 0.0
    +
    +constexpr
    +
    + +

    Definition at line 10 of file default_action.h.

    + +
    +
    + +

    ◆ kKdScale

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::actuation::default_action::kKdScale = 1.0
    +
    +constexpr
    +
    + +

    Definition at line 13 of file default_action.h.

    + +
    +
    + +

    ◆ kKpScale

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::actuation::default_action::kKpScale = 1.0
    +
    +constexpr
    +
    + +

    Definition at line 12 of file default_action.h.

    + +
    +
    + +

    ◆ kMaximumTorque

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::actuation::default_action::kMaximumTorque = 1.0
    +
    +constexpr
    +
    + +

    Definition at line 14 of file default_action.h.

    + +
    +
    + +

    ◆ kVelocity

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::actuation::default_action::kVelocity = 0.0
    +
    +constexpr
    +
    + +

    Definition at line 11 of file default_action.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1control.html b/namespacevulp_1_1control.html new file mode 100644 index 00000000..c7ef9078 --- /dev/null +++ b/namespacevulp_1_1control.html @@ -0,0 +1,114 @@ + + + + + + + +vulp: vulp::control Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::control Namespace Reference
    +
    +
    + +

    WIP: Process higher-level actions down to joint commands. +More...

    + + + + + +

    +Classes

    class  Controller
     Base class for controllers. More...
     
    +

    Detailed Description

    +

    WIP: Process higher-level actions down to joint commands.

    +
    +
    + + + + diff --git a/namespacevulp_1_1control.js b/namespacevulp_1_1control.js new file mode 100644 index 00000000..baa7c184 --- /dev/null +++ b/namespacevulp_1_1control.js @@ -0,0 +1,4 @@ +var namespacevulp_1_1control = +[ + [ "Controller", "classvulp_1_1control_1_1Controller.html", "classvulp_1_1control_1_1Controller" ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1observation.html b/namespacevulp_1_1observation.html new file mode 100644 index 00000000..8c3da243 --- /dev/null +++ b/namespacevulp_1_1observation.html @@ -0,0 +1,258 @@ + + + + + + + +vulp: vulp::observation Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::observation Namespace Reference
    +
    +
    + +

    State observation. +More...

    + + + + +

    +Namespaces

     sources
     
    + + + + + + + + + + + + + +

    +Classes

    class  HistoryObserver
     Report high-frequency history vectors to lower-frequency agents. More...
     
    class  Observer
     Base class for observers. More...
     
    class  ObserverPipeline
     Observer pipeline. More...
     
    class  Source
     Base class for sources. More...
     
    + + + + + + + + + +

    +Functions

    void observe_servos (Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)
     
    void observe_servos (palimpsest::Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< actuation::moteus::ServoReply > &servo_replies)
     Observe servo measurements. More...
     
    void observe_time (Dictionary &observation)
     Observe time since the epoch. More...
     
    +

    Detailed Description

    +

    State observation.

    +

    Function Documentation

    + +

    ◆ observe_servos() [1/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void vulp::observation::observe_servos (Dictionary & observation,
    const std::map< int, std::string > & servo_joint_map,
    const std::vector< moteus::ServoReply > & servo_replies 
    )
    +
    + +

    Definition at line 16 of file observe_servos.cpp.

    + +
    +
    + +

    ◆ observe_servos() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void vulp::observation::observe_servos (palimpsest::Dictionary & observation,
    const std::map< int, std::string > & servo_joint_map,
    const std::vector< actuation::moteus::ServoReply > & servo_replies 
    )
    +
    + +

    Observe servo measurements.

    +
    Parameters
    + + + + +
    [out]observationDictionary to write observations to.
    [in]servo_joint_mapMap from servo ID to joint name.
    [in]servo_repliesList of servo replies from the CAN bus.
    +
    +
    + +
    +
    + +

    ◆ observe_time()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void vulp::observation::observe_time (Dictionary & observation)
    +
    +inline
    +
    + +

    Observe time since the epoch.

    +
    Parameters
    + + +
    [out]observationDictionary to write observations to.
    +
    +
    + +

    Definition at line 16 of file observe_time.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1observation.js b/namespacevulp_1_1observation.js new file mode 100644 index 00000000..d45fd86a --- /dev/null +++ b/namespacevulp_1_1observation.js @@ -0,0 +1,11 @@ +var namespacevulp_1_1observation = +[ + [ "sources", "namespacevulp_1_1observation_1_1sources.html", "namespacevulp_1_1observation_1_1sources" ], + [ "HistoryObserver", "classvulp_1_1observation_1_1HistoryObserver.html", "classvulp_1_1observation_1_1HistoryObserver" ], + [ "Observer", "classvulp_1_1observation_1_1Observer.html", "classvulp_1_1observation_1_1Observer" ], + [ "ObserverPipeline", "classvulp_1_1observation_1_1ObserverPipeline.html", "classvulp_1_1observation_1_1ObserverPipeline" ], + [ "Source", "classvulp_1_1observation_1_1Source.html", "classvulp_1_1observation_1_1Source" ], + [ "observe_servos", "namespacevulp_1_1observation.html#ad2218a79b5b3865746e23d5579f97585", null ], + [ "observe_servos", "namespacevulp_1_1observation.html#a0ae2b75955060fe39559b2b05f6997ed", null ], + [ "observe_time", "namespacevulp_1_1observation.html#a91251ac7479e0efd644cbd763d66d5ea", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1observation_1_1sources.html b/namespacevulp_1_1observation_1_1sources.html new file mode 100644 index 00000000..c7254abb --- /dev/null +++ b/namespacevulp_1_1observation_1_1sources.html @@ -0,0 +1,237 @@ + + + + + + + +vulp: vulp::observation::sources Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::observation::sources Namespace Reference
    +
    +
    + + + + + + + + + + + +

    +Classes

    class  CpuTemperature
     Source for CPU temperature readings. More...
     
    class  Joystick
     Source for a joystick controller. More...
     
    class  Keyboard
     Source for reading Keyboard inputs. More...
     
    + + + +

    +Enumerations

    enum class  Key {
    +  UP +, DOWN +, LEFT +, RIGHT +,
    +  W +, A +, S +, D +,
    +  X +, NONE +, UNKNOWN +
    + }
     
    + + + + + + + +

    +Variables

    constexpr unsigned kCpuTemperatureBufferSize = 12
     Characters required to read the temperature in [mC] from the kernel. More...
     
    constexpr double kJoystickDeadband = 0.1
     Deadband between 0.0 and 1.0. More...
     
    +

    Enumeration Type Documentation

    + +

    ◆ Key

    + +
    +
    + + + + + +
    + + + + +
    enum vulp::observation::sources::Key
    +
    +strong
    +
    + + + + + + + + + + + + +
    Enumerator
    UP 
    DOWN 
    LEFT 
    RIGHT 
    NONE 
    UNKNOWN 
    + +

    Definition at line 47 of file Keyboard.h.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ kCpuTemperatureBufferSize

    + +
    +
    + + + + + +
    + + + + +
    constexpr unsigned vulp::observation::sources::kCpuTemperatureBufferSize = 12
    +
    +constexpr
    +
    + +

    Characters required to read the temperature in [mC] from the kernel.

    + +

    Definition at line 13 of file CpuTemperature.h.

    + +
    +
    + +

    ◆ kJoystickDeadband

    + +
    +
    + + + + + +
    + + + + +
    constexpr double vulp::observation::sources::kJoystickDeadband = 0.1
    +
    +constexpr
    +
    + +

    Deadband between 0.0 and 1.0.

    + +

    Definition at line 18 of file Joystick.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1observation_1_1sources.js b/namespacevulp_1_1observation_1_1sources.js new file mode 100644 index 00000000..e090b233 --- /dev/null +++ b/namespacevulp_1_1observation_1_1sources.js @@ -0,0 +1,21 @@ +var namespacevulp_1_1observation_1_1sources = +[ + [ "CpuTemperature", "classvulp_1_1observation_1_1sources_1_1CpuTemperature.html", "classvulp_1_1observation_1_1sources_1_1CpuTemperature" ], + [ "Joystick", "classvulp_1_1observation_1_1sources_1_1Joystick.html", "classvulp_1_1observation_1_1sources_1_1Joystick" ], + [ "Keyboard", "classvulp_1_1observation_1_1sources_1_1Keyboard.html", "classvulp_1_1observation_1_1sources_1_1Keyboard" ], + [ "Key", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422", [ + [ "UP", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1", null ], + [ "DOWN", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f", null ], + [ "LEFT", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758", null ], + [ "RIGHT", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403", null ], + [ "W", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276", null ], + [ "A", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29", null ], + [ "S", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e", null ], + [ "D", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5", null ], + [ "X", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383", null ], + [ "NONE", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693", null ], + [ "UNKNOWN", "namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3", null ] + ] ], + [ "kCpuTemperatureBufferSize", "namespacevulp_1_1observation_1_1sources.html#a010055692ae8692090553ae85b6f66bc", null ], + [ "kJoystickDeadband", "namespacevulp_1_1observation_1_1sources.html#a7e19b63b7a414ab70c8b9468df93de44", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1spine.html b/namespacevulp_1_1spine.html new file mode 100644 index 00000000..959ee76f --- /dev/null +++ b/namespacevulp_1_1spine.html @@ -0,0 +1,410 @@ + + + + + + + +vulp: vulp.spine Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.spine Namespace Reference
    +
    +
    + +

    Inter-process communication protocol with the spine. +More...

    + + + + + + + + +

    +Namespaces

     exceptions
     
     request
     
     spine_interface
     
    + + + + + + + + + + +

    +Classes

    class  AgentInterface
     Memory map to shared memory. More...
     
    class  Spine
     Loop transmitting actions to the actuation and observations to the agent. More...
     
    class  StateMachine
     Spine state machine. More...
     
    + + + + + + + + + +

    +Enumerations

    enum class  Request : uint32_t {
    +  kNone = 0 +, kObservation = 1 +, kAction = 2 +, kStart = 3 +,
    +  kStop = 4 +, kError = 5 +
    + }
     
    enum class  State : uint32_t {
    +  kSendStops = 0 +, kReset = 1 +, kIdle = 2 +, kObserve = 3 +,
    +  kAct = 4 +, kShutdown = 5 +, kOver = 6 +
    + }
     States of the state machine. More...
     
    enum class  Event : uint32_t { kCycleBeginning = 0 +, kCycleEnd = 1 +, kInterrupt = 2 + }
     Events that may trigger transitions between states. More...
     
    + + + + + + + +

    +Functions

    void allocate_file (int file_descriptor, int bytes)
     Allocate file with some error handling. More...
     
    constexpr const char * state_name (const State &state) noexcept
     Name of a state. More...
     
    + + + + + + +

    +Variables

    constexpr size_t kMebibytes = 1 << 20
     
    constexpr unsigned kNbStopCycles = 5
     When sending stop cycles, send at least that many. More...
     
    +

    Detailed Description

    +

    Inter-process communication protocol with the spine.

    +

    Design notes: one alternative was a proper FSM with a clear distinction between states (what the spine is doing) and transitions (agent requests, spine replies, etc.). This could have allowed more granularity, such as the spine doing nothing (instead of sending stops) when it is idle, however at the cost of more complexity. We choose to go for the simpler (riskier) version where both agent and spine directly manipulate the agenda.

    +

    Enumeration Type Documentation

    + +

    ◆ Event

    + +
    +
    + + + + + +
    + + + + +
    enum vulp::spine::Event : uint32_t
    +
    +strong
    +
    + +

    Events that may trigger transitions between states.

    + + + + +
    Enumerator
    kCycleBeginning 
    kCycleEnd 
    kInterrupt 
    + +

    Definition at line 25 of file StateMachine.h.

    + +
    +
    + +

    ◆ Request

    + +
    +
    + + + + + +
    + + + + +
    enum vulp::spine::Request : uint32_t
    +
    +strong
    +
    + + + + + + + +
    Enumerator
    kNone 
    kObservation 
    kAction 
    kStart 
    kStop 
    kError 
    + +

    Definition at line 10 of file Request.h.

    + +
    +
    + +

    ◆ State

    + +
    +
    + + + + + +
    + + + + +
    enum vulp::spine::State : uint32_t
    +
    +strong
    +
    + +

    States of the state machine.

    + + + + + + + + +
    Enumerator
    kSendStops 
    kReset 
    kIdle 
    kObserve 
    kAct 
    kShutdown 
    kOver 
    + +

    Definition at line 14 of file StateMachine.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ allocate_file()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void vulp::spine::allocate_file (int file_descriptor,
    int bytes 
    )
    +
    + +

    Allocate file with some error handling.

    +
    Parameters
    + + + +
    [in]file_descriptorFile descriptor.
    [in]bytesNumber of bytes to allocate.
    +
    +
    + +

    Definition at line 16 of file AgentInterface.cpp.

    + +
    +
    + +

    ◆ state_name()

    + +
    +
    + + + + + +
    + + + + + + + + +
    constexpr const char* vulp::spine::state_name (const Statestate)
    +
    +constexprnoexcept
    +
    + +

    Name of a state.

    +
    Parameters
    + + +
    [in]stateState to name.
    +
    +
    + +

    Definition at line 35 of file StateMachine.h.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ kMebibytes

    + +
    +
    + + + + + +
    + + + + +
    constexpr size_t vulp::spine.kMebibytes = 1 << 20
    +
    +constexpr
    +
    + +

    Definition at line 27 of file Spine.h.

    + +
    +
    + +

    ◆ kNbStopCycles

    + +
    +
    + + + + + +
    + + + + +
    constexpr unsigned vulp::spine.kNbStopCycles = 5
    +
    +constexpr
    +
    + +

    When sending stop cycles, send at least that many.

    + +

    Definition at line 11 of file StateMachine.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1spine.js b/namespacevulp_1_1spine.js new file mode 100644 index 00000000..aa68d27d --- /dev/null +++ b/namespacevulp_1_1spine.js @@ -0,0 +1,36 @@ +var namespacevulp_1_1spine = +[ + [ "exceptions", "namespacevulp_1_1spine_1_1exceptions.html", "namespacevulp_1_1spine_1_1exceptions" ], + [ "request", "namespacevulp_1_1spine_1_1request.html", "namespacevulp_1_1spine_1_1request" ], + [ "spine_interface", "namespacevulp_1_1spine_1_1spine__interface.html", "namespacevulp_1_1spine_1_1spine__interface" ], + [ "AgentInterface", "classvulp_1_1spine_1_1AgentInterface.html", "classvulp_1_1spine_1_1AgentInterface" ], + [ "Spine", "classvulp_1_1spine_1_1Spine.html", "classvulp_1_1spine_1_1Spine" ], + [ "StateMachine", "classvulp_1_1spine_1_1StateMachine.html", "classvulp_1_1spine_1_1StateMachine" ], + [ "Event", "namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431", [ + [ "kCycleBeginning", "namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b", null ], + [ "kCycleEnd", "namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16", null ], + [ "kInterrupt", "namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae", null ] + ] ], + [ "Request", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1", [ + [ "kNone", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13", null ], + [ "kObservation", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28", null ], + [ "kAction", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4", null ], + [ "kStart", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d", null ], + [ "kStop", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b", null ], + [ "kError", "namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97", null ] + ] ], + [ "State", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673b", [ + [ "kSendStops", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe", null ], + [ "kReset", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b", null ], + [ "kIdle", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b", null ], + [ "kObserve", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94", null ], + [ "kAct", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb", null ], + [ "kShutdown", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb", null ], + [ "kOver", "namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961", null ] + ] ], + [ "allocate_file", "namespacevulp_1_1spine.html#a8f9f5a5899f507ebe75f4a033e9c1a8f", null ], + [ "state_name", "namespacevulp_1_1spine.html#afe7d438605444b816b7d2fb170c87240", null ], + [ "__all__", "namespacevulp_1_1spine.html#a8a3fa5d6802d99a9b3dbcb1425231bde", null ], + [ "kMebibytes", "namespacevulp_1_1spine.html#a6c2c8dbd236f8d35e2ecac79f165fa29", null ], + [ "kNbStopCycles", "namespacevulp_1_1spine.html#a5bc778508b13f1e9e7dd227025a32808", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1spine_1_1exceptions.html b/namespacevulp_1_1spine_1_1exceptions.html new file mode 100644 index 00000000..a4cabb6b --- /dev/null +++ b/namespacevulp_1_1spine_1_1exceptions.html @@ -0,0 +1,115 @@ + + + + + + + +vulp: vulp.spine.exceptions Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.spine.exceptions Namespace Reference
    +
    +
    + + + + + + + + + + + +

    +Classes

    class  VulpException
     Base class for exceptions raised by Vulp. More...
     
    class  PerformanceIssue
     Exception raised when a performance issue is detected. More...
     
    class  SpineError
     Exception raised when the spine sets an error flag in the request field of the shared memory map. More...
     
    +
    +
    + + + + diff --git a/namespacevulp_1_1spine_1_1exceptions.js b/namespacevulp_1_1spine_1_1exceptions.js new file mode 100644 index 00000000..09a062dd --- /dev/null +++ b/namespacevulp_1_1spine_1_1exceptions.js @@ -0,0 +1,6 @@ +var namespacevulp_1_1spine_1_1exceptions = +[ + [ "VulpException", "classvulp_1_1spine_1_1exceptions_1_1VulpException.html", null ], + [ "PerformanceIssue", "classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html", null ], + [ "SpineError", "classvulp_1_1spine_1_1exceptions_1_1SpineError.html", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1spine_1_1request.html b/namespacevulp_1_1spine_1_1request.html new file mode 100644 index 00000000..f710fc8e --- /dev/null +++ b/namespacevulp_1_1spine_1_1request.html @@ -0,0 +1,109 @@ + + + + + + + +vulp: vulp.spine.request Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.spine.request Namespace Reference
    +
    +
    + + + + + +

    +Classes

    class  Request
     Flag set by the agent to request an operation from the spine. More...
     
    +
    +
    + + + + diff --git a/namespacevulp_1_1spine_1_1request.js b/namespacevulp_1_1spine_1_1request.js new file mode 100644 index 00000000..0215f441 --- /dev/null +++ b/namespacevulp_1_1spine_1_1request.js @@ -0,0 +1,4 @@ +var namespacevulp_1_1spine_1_1request = +[ + [ "Request", "classvulp_1_1spine_1_1request_1_1Request.html", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1spine_1_1spine__interface.html b/namespacevulp_1_1spine_1_1spine__interface.html new file mode 100644 index 00000000..367b52a9 --- /dev/null +++ b/namespacevulp_1_1spine_1_1spine__interface.html @@ -0,0 +1,156 @@ + + + + + + + +vulp: vulp.spine.spine_interface Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.spine.spine_interface Namespace Reference
    +
    +
    + + + + + +

    +Classes

    class  SpineInterface
     Interface to interact with a spine from a Python agent. More...
     
    + + + + +

    +Functions

    SharedMemory wait_for_shared_memory (str shm_name, int retries)
     Connect to the spine shared memory. More...
     
    +

    Function Documentation

    + +

    ◆ wait_for_shared_memory()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    SharedMemory vulp.spine.spine_interface.wait_for_shared_memory (str shm_name,
    int retries 
    )
    +
    + +

    Connect to the spine shared memory.

    +
    Parameters
    + + + +
    shm_nameName of the shared memory object.
    retriesNumber of times to try opening the shared-memory file. @raise SpineError If the spine did not respond after the prescribed number of trials.
    +
    +
    + +

    Definition at line 24 of file spine_interface.py.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1spine_1_1spine__interface.js b/namespacevulp_1_1spine_1_1spine__interface.js new file mode 100644 index 00000000..7c7d3d33 --- /dev/null +++ b/namespacevulp_1_1spine_1_1spine__interface.js @@ -0,0 +1,5 @@ +var namespacevulp_1_1spine_1_1spine__interface = +[ + [ "SpineInterface", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface" ], + [ "wait_for_shared_memory", "namespacevulp_1_1spine_1_1spine__interface.html#a4c4005d1998a361e6be94accfccae083", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1utils.html b/namespacevulp_1_1utils.html new file mode 100644 index 00000000..6f127f3f --- /dev/null +++ b/namespacevulp_1_1utils.html @@ -0,0 +1,387 @@ + + + + + + + +vulp: vulp.utils Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.utils Namespace Reference
    +
    +
    + +

    Utility functions. +More...

    + + + + + + + + + +

    +Namespaces

     internal
     
     math
     Mathematical functions.
     
     serialize
     
    + + + + +

    +Classes

    class  SynchronousClock
     Synchronous (blocking) clock. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    const bool & handle_interrupts ()
     Redirect interrupts to setting a global interrupt boolean. More...
     
    double low_pass_filter (double prev_output, double cutoff_period, double new_input, double dt)
     Low-pass filter as an inline function. More...
     
    std::string random_string (unsigned length=16)
     Generate a random string. More...
     
    void configure_cpu (int cpu)
     Set the current thread to run on a given CPU core. More...
     
    void configure_scheduler (int priority)
     Configure the scheduler policy to round-robin for this thread. More...
     
    bool lock_memory ()
     Lock all memory to RAM so that the kernel doesn't page it to swap. More...
     
    +

    Detailed Description

    +

    Utility functions.

    +

    Function Documentation

    + +

    ◆ configure_cpu()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void vulp::utils::configure_cpu (int cpu)
    +
    +inline
    +
    + +

    Set the current thread to run on a given CPU core.

    +
    Parameters
    + + +
    cpuCPU core for this thread (on the Pi, CPUID in {0, 1, 2, 3}).
    +
    +
    +
    Exceptions
    + + +
    std::runtime_errorIf the operation failed.
    +
    +
    + +

    Definition at line 23 of file realtime.h.

    + +
    +
    + +

    ◆ configure_scheduler()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void vulp::utils::configure_scheduler (int priority)
    +
    +inline
    +
    + +

    Configure the scheduler policy to round-robin for this thread.

    +
    Parameters
    + + +
    priorityPriority of this thread for the scheduler, ranging from 1 (low) to 99 (high). See man sched. For agents, this priority should be lower than that of the spine.
    +
    +
    +
    Exceptions
    + + +
    std::runtime_errorIf the operation failed.
    +
    +
    + +

    Definition at line 45 of file realtime.h.

    + +
    +
    + +

    ◆ handle_interrupts()

    + +
    +
    + + + + + + + +
    const bool & vulp::utils::handle_interrupts ()
    +
    + +

    Redirect interrupts to setting a global interrupt boolean.

    +

    Direct interrupts (e.g.

    +
    Returns
    Reference to the interrupt boolean.
    +

    Ctrl-C) to a boolean flag.

    +
    Returns
    Reference to a boolean flag, which is initially false and becomes true the first time an interruption is caught.
    + +

    Definition at line 20 of file handle_interrupts.cpp.

    + +
    +
    + +

    ◆ lock_memory()

    + +
    +
    + + + + + +
    + + + + + + + +
    bool vulp::utils::lock_memory ()
    +
    +inline
    +
    + +

    Lock all memory to RAM so that the kernel doesn't page it to swap.

    +

    The Linux man pages have a great NOTES section on this. Worth a read!

    + +

    Definition at line 63 of file realtime.h.

    + +
    +
    + +

    ◆ low_pass_filter()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    double vulp::utils::low_pass_filter (double prev_output,
    double cutoff_period,
    double new_input,
    double dt 
    )
    +
    +inline
    +
    + +

    Low-pass filter as an inline function.

    +
    Parameters
    + + + + + +
    prev_outputPrevious filter output, or initial value.
    cutoff_periodCutoff period in [s].
    new_inputNew filter input.
    dtSampling period in [s].
    +
    +
    +
    Returns
    New filter output.
    + +

    Definition at line 24 of file low_pass_filter.h.

    + +
    +
    + +

    ◆ random_string()

    + +
    +
    + + + + + +
    + + + + + + + + +
    std::string vulp::utils::random_string (unsigned length = 16)
    +
    +inline
    +
    + +

    Generate a random string.

    +
    Parameters
    + + +
    [in]lengthString length.
    +
    +
    +
    Returns
    Random string.
    +

    The generated string contains only alphanumeric characters with no repetition.

    + +

    Definition at line 21 of file random_string.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1utils.js b/namespacevulp_1_1utils.js new file mode 100644 index 00000000..a7c44198 --- /dev/null +++ b/namespacevulp_1_1utils.js @@ -0,0 +1,21 @@ +var namespacevulp_1_1utils = +[ + [ "internal", "namespacevulp_1_1utils_1_1internal.html", [ + [ "handle_interrupt", "namespacevulp_1_1utils_1_1internal.html#a838e3878c7da2dc06db5168b5ef421b2", null ], + [ "interrupt_flag", "namespacevulp_1_1utils_1_1internal.html#ac7a04e3bcce477cf05d12ecb651fab6d", null ] + ] ], + [ "math", "namespacevulp_1_1utils_1_1math.html", [ + [ "divides", "namespacevulp_1_1utils_1_1math.html#a8c590daf31618ab64f1f0f044ed81148", null ] + ] ], + [ "serialize", "namespacevulp_1_1utils_1_1serialize.html", [ + [ "serialize", "namespacevulp_1_1utils_1_1serialize.html#a0cb702d04af978c6ba56320ecd0068f1", null ] + ] ], + [ "SynchronousClock", "classvulp_1_1utils_1_1SynchronousClock.html", "classvulp_1_1utils_1_1SynchronousClock" ], + [ "configure_cpu", "namespacevulp_1_1utils.html#a647a4a0c11b7b2a5a65c99c77ebd9a54", null ], + [ "configure_scheduler", "namespacevulp_1_1utils.html#a382e082bfa27731270dfa119bee29d9a", null ], + [ "handle_interrupts", "namespacevulp_1_1utils.html#a78519754b023e10a26052f84229732fa", null ], + [ "lock_memory", "namespacevulp_1_1utils.html#ae34f759b79aecb082475a33f8d67045e", null ], + [ "low_pass_filter", "namespacevulp_1_1utils.html#a82e8f66ca7a05a1fe40afeac8cfea205", null ], + [ "random_string", "namespacevulp_1_1utils.html#a6c6306957ebd97c6d0682112514a4fe7", null ], + [ "__all__", "namespacevulp_1_1utils.html#a65dbe76c6a061bce5651e1ddd7d00b13", null ] +]; \ No newline at end of file diff --git a/namespacevulp_1_1utils_1_1internal.html b/namespacevulp_1_1utils_1_1internal.html new file mode 100644 index 00000000..a90db214 --- /dev/null +++ b/namespacevulp_1_1utils_1_1internal.html @@ -0,0 +1,158 @@ + + + + + + + +vulp: vulp::utils::internal Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::utils::internal Namespace Reference
    +
    +
    + + + + + +

    +Functions

    void handle_interrupt (int _)
     Internal handler to set interrupt_flag. More...
     
    + + + + +

    +Variables

    bool interrupt_flag = false
     Internal interrupt flag. More...
     
    +

    Function Documentation

    + +

    ◆ handle_interrupt()

    + +
    +
    + + + + + + + + +
    void vulp::utils::internal::handle_interrupt (int _)
    +
    + +

    Internal handler to set interrupt_flag.

    + +

    Definition at line 12 of file handle_interrupts.cpp.

    + +
    +
    +

    Variable Documentation

    + +

    ◆ interrupt_flag

    + +
    +
    + + + + +
    bool vulp::utils::internal::interrupt_flag = false
    +
    + +

    Internal interrupt flag.

    + +

    Definition at line 10 of file handle_interrupts.cpp.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1utils_1_1math.html b/namespacevulp_1_1utils_1_1math.html new file mode 100644 index 00000000..903009ae --- /dev/null +++ b/namespacevulp_1_1utils_1_1math.html @@ -0,0 +1,155 @@ + + + + + + + +vulp: vulp::utils::math Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::utils::math Namespace Reference
    +
    +
    + +

    Mathematical functions. +More...

    + + + + + +

    +Functions

    bool divides (uint32_t number, uint32_t divisor)
     True if and only if divisor divides number. More...
     
    +

    Detailed Description

    +

    Mathematical functions.

    +

    Function Documentation

    + +

    ◆ divides()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + +
    bool vulp::utils::math::divides (uint32_t number,
    uint32_t divisor 
    )
    +
    +inline
    +
    + +

    True if and only if divisor divides number.

    + +

    Definition at line 15 of file math.h.

    + +
    +
    +
    +
    + + + + diff --git a/namespacevulp_1_1utils_1_1serialize.html b/namespacevulp_1_1utils_1_1serialize.html new file mode 100644 index 00000000..82f7bd21 --- /dev/null +++ b/namespacevulp_1_1utils_1_1serialize.html @@ -0,0 +1,147 @@ + + + + + + + +vulp: vulp.utils.serialize Namespace Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.utils.serialize Namespace Reference
    +
    +
    + + + + + +

    +Functions

    def serialize (obj)
     Serialize an object for message packing. More...
     
    +

    Function Documentation

    + +

    ◆ serialize()

    + +
    +
    + + + + + + + + +
    def vulp.utils.serialize.serialize ( obj)
    +
    + +

    Serialize an object for message packing.

    +
    Parameters
    + + +
    objObject to serialize.
    +
    +
    +
    Returns
    Serialized object.
    +
    Note
    Calling the numpy conversion is much faster than the default list constructor:
    +
    In [1]: x = random.random(6)
    +
    +
    In [2]: %timeit list(x)
    +
    789 ns ± 5.79 ns per loop (mean ± std. dev. of 7 runs, 1e6 loops each)
    +
    +
    In [3]: %timeit x.tolist()
    +
    117 ns ± 0.865 ns per loop (mean ± std. dev. of 7 runs, 1e7 loops each)
    +
    +

    Definition at line 9 of file serialize.py.

    + +
    +
    +
    +
    + + + + diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 00000000..72a58a52 Binary files /dev/null and b/nav_f.png differ diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/nav_g.png differ diff --git a/nav_h.png b/nav_h.png new file mode 100644 index 00000000..33389b10 Binary files /dev/null and b/nav_h.png differ diff --git a/navtree.css b/navtree.css new file mode 100644 index 00000000..33341a67 --- /dev/null +++ b/navtree.css @@ -0,0 +1,146 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; + outline:none; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:#fff; +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + background-color: #FAFAFF; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: 250px; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:url("splitbar.png"); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/navtree.js b/navtree.js new file mode 100644 index 00000000..1e272d31 --- /dev/null +++ b/navtree.js @@ -0,0 +1,546 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +var navTreeSubIndices = new Array(); +var arrowDown = '▼'; +var arrowRight = '►'; + +function getData(varName) +{ + var i = varName.lastIndexOf('/'); + var n = i>=0 ? varName.substring(i+1) : varName; + return eval(n.replace(/\-/g,'_')); +} + +function stripPath(uri) +{ + return uri.substring(uri.lastIndexOf('/')+1); +} + +function stripPath2(uri) +{ + var i = uri.lastIndexOf('/'); + var s = uri.substring(i+1); + var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; +} + +function hashValue() +{ + return $(location).attr('hash').substring(1).replace(/[^\w\-]/g,''); +} + +function hashUrl() +{ + return '#'+hashValue(); +} + +function pathName() +{ + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]/g, ''); +} + +function localStorageSupported() +{ + try { + return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem; + } + catch(e) { + return false; + } +} + +function storeLink(link) +{ + if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) { + window.localStorage.setItem('navpath',link); + } +} + +function deleteLink() +{ + if (localStorageSupported()) { + window.localStorage.setItem('navpath',''); + } +} + +function cachedLink() +{ + if (localStorageSupported()) { + return window.localStorage.getItem('navpath'); + } else { + return ''; + } +} + +function getScript(scriptName,func,show) +{ + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = func; + script.src = scriptName+'.js'; + head.appendChild(script); +} + +function createIndent(o,domNode,node,level) +{ + var level=-1; + var n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + var imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=arrowRight; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast"); + node.plus_img.innerHTML=arrowRight; + node.expanded = false; + } else { + expandNode(o, node, false, false); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + var span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } +} + +var animationInProgress = false; + +function gotoAnchor(anchor,aname,updateLocation) +{ + var pos, docContent = $('#doc-content'); + var ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || + ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || + ancParent.hasClass('fieldtype') || + ancParent.is(':header')) + { + pos = ancParent.position().top; + } else if (anchor.position()) { + pos = anchor.position().top; + } + if (pos) { + var dist = Math.abs(Math.min( + pos-docContent.offset().top, + docContent[0].scrollHeight- + docContent.height()-docContent.scrollTop())); + animationInProgress=true; + docContent.animate({ + scrollTop: pos + docContent.scrollTop() - docContent.offset().top + },Math.max(50,Math.min(500,dist)),function(){ + if (updateLocation) window.location.href=aname; + animationInProgress=false; + }); + } +} + +function newNode(o, po, text, link, childrenData, lastNode) +{ + var node = new Object(); + node.children = Array(); + node.childrenData = childrenData; + node.depth = po.depth + 1; + node.relpath = po.relpath; + node.isLast = lastNode; + + node.li = document.createElement("li"); + po.getChildrenUL().appendChild(node.li); + node.parentNode = po; + + node.itemDiv = document.createElement("div"); + node.itemDiv.className = "item"; + + node.labelSpan = document.createElement("span"); + node.labelSpan.className = "label"; + + createIndent(o,node.itemDiv,node,0); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + var a = document.createElement("a"); + node.labelSpan.appendChild(a); + node.label = document.createTextNode(text); + node.expanded = false; + a.appendChild(node.label); + if (link) { + var url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + var aname = '#'+link.split('#')[1]; + var srcPage = stripPath(pathName()); + var targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : "javascript:void(0)"; + a.onclick = function(){ + storeLink(link); + if (!$(a).parent().parent().hasClass('selected')) + { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + $(a).parent().parent().addClass('selected'); + $(a).parent().parent().attr('id','selected'); + } + var anchor = $(aname); + gotoAnchor(anchor,aname,true); + }; + } else { + a.href = url; + a.onclick = function() { storeLink(link); } + } + } else { + if (childrenData != null) + { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + } + + node.childrenUL = null; + node.getChildrenUL = function() { + if (!node.childrenUL) { + node.childrenUL = document.createElement("ul"); + node.childrenUL.className = "children_ul"; + node.childrenUL.style.display = "none"; + node.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }; + + return node; +} + +function showRoot() +{ + var headerHeight = $("#top").height(); + var footerHeight = $("#nav-path").height(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + (function (){ // retry until we can scroll to the selected item + try { + var navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); +} + +function expandNode(o, node, imm, showRoot) +{ + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + expandNode(o, node, imm, showRoot); + }, showRoot); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast"); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + } + } +} + +function glowEffect(n,duration) +{ + n.addClass('glow').delay(duration).queue(function(next){ + $(this).removeClass('glow');next(); + }); +} + +function highlightAnchor() +{ + var aname = hashUrl(); + var anchor = $(aname); + if (anchor.parent().attr('class')=='memItemLeft'){ + var rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname'){ + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype'){ + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } +} + +function selectAndHighlight(hash,n) +{ + var a; + if (hash) { + var link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + $('#nav-sync').css('top','30px'); + } else { + $('#nav-sync').css('top','5px'); + } + showRoot(); +} + +function showNode(o, node, index, hash) +{ + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + var varName = node.childrenData; + getScript(node.relpath+varName,function(){ + node.childrenData = getData(varName); + showNode(o,node,index,hash); + },true); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + node.plus_img.innerHTML = arrowDown; + node.expanded = true; + var n = node.children[o.breadcrumbs[index]]; + if (index+11) hash = '#'+parts[1].replace(/[^\w\-]/g,''); + else hash=''; + } + if (hash.match(/^#l\d+$/)) { + var anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + var url=root+hash; + var i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function(){ + navTreeSubIndices[i] = eval('NAVTREEINDEX'+i); + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + },true); + } +} + +function showSyncOff(n,relpath) +{ + n.html(''); +} + +function showSyncOn(n,relpath) +{ + n.html(''); +} + +function toggleSyncButton(relpath) +{ + var navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } +} + +var loadTriggered = false; +var readyTriggered = false; +var loadObject,loadToRoot,loadUrl,loadRelPath; + +$(window).on('load',function(){ + if (readyTriggered) { // ready first + navTo(loadObject,loadToRoot,loadUrl,loadRelPath); + showRoot(); + } + loadTriggered=true; +}); + +function initNavTree(toroot,relpath) +{ + var o = new Object(); + o.toroot = toroot; + o.node = new Object(); + o.node.li = document.getElementById("nav-tree-contents"); + o.node.childrenData = NAVTREE; + o.node.children = new Array(); + o.node.childrenUL = document.createElement("ul"); + o.node.getChildrenUL = function() { return o.node.childrenUL; }; + o.node.li.appendChild(o.node.childrenUL); + o.node.depth = 0; + o.node.relpath = relpath; + o.node.expanded = false; + o.node.isLast = true; + o.node.plus_img = document.createElement("span"); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = arrowRight; + + if (localStorageSupported()) { + var navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + navSync.click(function(){ toggleSyncButton(relpath); }); + } + + if (loadTriggered) { // load before ready + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + } else { // ready before load + loadObject = o; + loadToRoot = toroot; + loadUrl = hashUrl(); + loadRelPath = relpath; + readyTriggered=true; + } + + $(window).bind('hashchange', function(){ + if (window.location.hash && window.location.hash.length>1){ + var a; + if ($(location).attr('hash')){ + var clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/interface description language like Protocol Buffers?", "index.html#autotoc_md17", null ], + [ "Why the weakly-typed dictionary IPC rather than Python–C++ bindings?", "index.html#autotoc_md18", null ], + [ "Is it possible to run two agents at the same time?", "index.html#autotoc_md19", null ], + [ "Why the name \"Vulp\"?", "index.html#autotoc_md20", null ] + ] ] + ] ] + ] ], + [ "Namespaces", "namespaces.html", [ + [ "Namespace List", "namespaces.html", "namespaces_dup" ], + [ "Namespace Members", "namespacemembers.html", [ + [ "All", "namespacemembers.html", null ], + [ "Functions", "namespacemembers_func.html", null ], + [ "Variables", "namespacemembers_vars.html", null ], + [ "Typedefs", "namespacemembers_type.html", null ], + [ "Enumerations", "namespacemembers_enum.html", null ] + ] ] + ] ], + [ "Classes", "annotated.html", [ + [ "Class List", "annotated.html", "annotated_dup" ], + [ "Class Index", "classes.html", null ], + [ "Class Hierarchy", "hierarchy.html", "hierarchy" ], + [ "Class Members", "functions.html", [ + [ "All", "functions.html", null ], + [ "Functions", "functions_func.html", null ], + [ "Variables", "functions_vars.html", null ], + [ "Typedefs", "functions_type.html", null ] + ] ] + ] ], + [ "Files", "files.html", [ + [ "File List", "files.html", "files_dup" ], + [ "File Members", "globals.html", [ + [ "All", "globals.html", null ], + [ "Functions", "globals_func.html", null ], + [ "Variables", "globals_vars.html", null ] + ] ] + ] ] + ] ] +]; + +var NAVTREEINDEX = +[ +"AgentInterface_8cpp.html", +"classvulp_1_1spine_1_1StateMachine.html#acc1608eb36870a89aba2f563220819ee" +]; + +var SYNCONMSG = 'click to disable panel synchronisation'; +var SYNCOFFMSG = 'click to enable panel synchronisation'; \ No newline at end of file diff --git a/navtreeindex0.js b/navtreeindex0.js new file mode 100644 index 00000000..5f882cce --- /dev/null +++ b/navtreeindex0.js @@ -0,0 +1,253 @@ +var NAVTREEINDEX0 = +{ +"AgentInterface_8cpp.html":[3,0,0,3,1], +"AgentInterface_8cpp.html#a8f9f5a5899f507ebe75f4a033e9c1a8f":[3,0,0,3,1,0], +"AgentInterface_8cpp_source.html":[3,0,0,3,1], +"AgentInterface_8h.html":[3,0,0,3,2], +"AgentInterface_8h_source.html":[3,0,0,3,2], +"BulletContactData_8h.html":[3,0,0,0,1], +"BulletContactData_8h_source.html":[3,0,0,0,1], +"BulletImuData_8h.html":[3,0,0,0,2], +"BulletImuData_8h_source.html":[3,0,0,0,2], +"BulletInterface_8cpp.html":[3,0,0,0,3], +"BulletInterface_8cpp.html#aabb66d6b3cd81c772937088266af0829":[3,0,0,0,3,0], +"BulletInterface_8cpp_source.html":[3,0,0,0,3], +"BulletInterface_8h.html":[3,0,0,0,4], +"BulletInterface_8h_source.html":[3,0,0,0,4], +"BulletJointProperties_8h.html":[3,0,0,0,5], +"BulletJointProperties_8h_source.html":[3,0,0,0,5], +"Controller_8h.html":[3,0,0,1,0], +"Controller_8h_source.html":[3,0,0,1,0], +"CpuTemperature_8cpp.html":[3,0,0,2,0,0], +"CpuTemperature_8cpp_source.html":[3,0,0,2,0,0], +"CpuTemperature_8h.html":[3,0,0,2,0,1], +"CpuTemperature_8h.html#a010055692ae8692090553ae85b6f66bc":[3,0,0,2,0,1,1], +"CpuTemperature_8h_source.html":[3,0,0,2,0,1], +"HistoryObserver_8h.html":[3,0,0,2,1], +"HistoryObserver_8h_source.html":[3,0,0,2,1], +"ImuData_8h.html":[3,0,0,0,7], +"ImuData_8h_source.html":[3,0,0,0,7], +"Interface_8cpp.html":[3,0,0,0,8], +"Interface_8cpp_source.html":[3,0,0,0,8], +"Interface_8h.html":[3,0,0,0,9], +"Interface_8h_source.html":[3,0,0,0,9], +"Joystick_8cpp.html":[3,0,0,2,0,2], +"Joystick_8cpp_source.html":[3,0,0,2,0,2], +"Joystick_8h.html":[3,0,0,2,0,3], +"Joystick_8h.html#a7e19b63b7a414ab70c8b9468df93de44":[3,0,0,2,0,3,1], +"Joystick_8h_source.html":[3,0,0,2,0,3], +"Keyboard_8cpp.html":[3,0,0,2,0,4], +"Keyboard_8cpp_source.html":[3,0,0,2,0,4], +"Keyboard_8h.html":[3,0,0,2,0,5], +"Keyboard_8h.html#a1f200ef3dbbdfee1673df8bfa3e12901":[3,0,0,2,0,5,3], +"Keyboard_8h.html#a287b5932e75598bfa911b731d94a1ff2":[3,0,0,2,0,5,8], +"Keyboard_8h.html#a391c665c8ffd7ddd3a8fbca4aaf58225":[3,0,0,2,0,5,10], +"Keyboard_8h.html#a3e1a7b8e0852d8d31fd8b17e6d82d766":[3,0,0,2,0,5,5], +"Keyboard_8h.html#a436c4f03139123bc3fe3e764046213c3":[3,0,0,2,0,5,2], +"Keyboard_8h.html#aa61d4e7c4b5a2d4ad8fc70900fe17cf9":[3,0,0,2,0,5,4], +"Keyboard_8h.html#aad42040bb8f9fbb2a4e312fca9736ffa":[3,0,0,2,0,5,6], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422":[3,0,0,2,0,5,1], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383":[3,0,0,2,0,5,1,8], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403":[3,0,0,2,0,5,1,3], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e":[3,0,0,2,0,5,1,6], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276":[3,0,0,2,0,5,1,4], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758":[3,0,0,2,0,5,1,2], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3":[3,0,0,2,0,5,1,10], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29":[3,0,0,2,0,5,1,5], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693":[3,0,0,2,0,5,1,9], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f":[3,0,0,2,0,5,1,1], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5":[3,0,0,2,0,5,1,7], +"Keyboard_8h.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1":[3,0,0,2,0,5,1,0], +"Keyboard_8h.html#ac524932df3a0d0889f6ef63734eb9b96":[3,0,0,2,0,5,7], +"Keyboard_8h.html#adeec831a3176c6cfbd9eb8e8f982aa59":[3,0,0,2,0,5,9], +"Keyboard_8h_source.html":[3,0,0,2,0,5], +"MockInterface_8cpp.html":[3,0,0,0,10], +"MockInterface_8cpp_source.html":[3,0,0,0,10], +"MockInterface_8h.html":[3,0,0,0,11], +"MockInterface_8h_source.html":[3,0,0,0,11], +"ObserverPipeline_8cpp.html":[3,0,0,2,6], +"ObserverPipeline_8cpp_source.html":[3,0,0,2,6], +"ObserverPipeline_8h.html":[3,0,0,2,7], +"ObserverPipeline_8h_source.html":[3,0,0,2,7], +"Observer_8h.html":[3,0,0,2,5], +"Observer_8h_source.html":[3,0,0,2,5], +"Pi3HatInterface_8cpp.html":[3,0,0,0,12], +"Pi3HatInterface_8cpp_source.html":[3,0,0,0,12], +"Pi3HatInterface_8h.html":[3,0,0,0,13], +"Pi3HatInterface_8h.html#ab2b376daf35eae21e48708f9b3f63460":[3,0,0,0,13,1], +"Pi3HatInterface_8h_source.html":[3,0,0,0,13], +"Request_8h.html":[3,0,0,3,4], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1":[3,0,0,3,4,0], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d":[3,0,0,3,4,0,3], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13":[3,0,0,3,4,0,0], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28":[3,0,0,3,4,0,1], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b":[3,0,0,3,4,0,4], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97":[3,0,0,3,4,0,5], +"Request_8h.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4":[3,0,0,3,4,0,2], +"Request_8h_source.html":[3,0,0,3,4], +"ServoLayout_8h.html":[3,0,0,0,15], +"ServoLayout_8h_source.html":[3,0,0,0,15], +"Source_8h.html":[3,0,0,2,8], +"Source_8h_source.html":[3,0,0,2,8], +"Spine_8cpp.html":[3,0,0,3,6], +"Spine_8cpp_source.html":[3,0,0,3,6], +"Spine_8h.html":[3,0,0,3,7], +"Spine_8h.html#a6c2c8dbd236f8d35e2ecac79f165fa29":[3,0,0,3,7,2], +"Spine_8h_source.html":[3,0,0,3,7], +"StateMachine_8cpp.html":[3,0,0,3,9], +"StateMachine_8cpp_source.html":[3,0,0,3,9], +"StateMachine_8h.html":[3,0,0,3,10], +"StateMachine_8h.html#a5bc778508b13f1e9e7dd227025a32808":[3,0,0,3,10,4], +"StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431":[3,0,0,3,10,1], +"StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae":[3,0,0,3,10,1,2], +"StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b":[3,0,0,3,10,1,0], +"StateMachine_8h.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16":[3,0,0,3,10,1,1], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673b":[3,0,0,3,10,2], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb":[3,0,0,3,10,2,4], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961":[3,0,0,3,10,2,6], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94":[3,0,0,3,10,2,3], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe":[3,0,0,3,10,2,0], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b":[3,0,0,3,10,2,1], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb":[3,0,0,3,10,2,5], +"StateMachine_8h.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b":[3,0,0,3,10,2,2], +"StateMachine_8h.html#afe7d438605444b816b7d2fb170c87240":[3,0,0,3,10,3], +"StateMachine_8h_source.html":[3,0,0,3,10], +"SynchronousClock_8cpp.html":[3,0,0,4,8], +"SynchronousClock_8cpp_source.html":[3,0,0,4,8], +"SynchronousClock_8h.html":[3,0,0,4,9], +"SynchronousClock_8h_source.html":[3,0,0,4,9], +"annotated.html":[2,0], +"bullet__utils_8h.html":[3,0,0,0,0], +"bullet__utils_8h.html#a17c7faa08c40ba9298774b4da1c86edb":[3,0,0,0,0,5], +"bullet__utils_8h.html#a225ab1b9ea7b3dd97f298768e432246a":[3,0,0,0,0,1], +"bullet__utils_8h.html#a3b0ac5d01ef820488834702e962bc765":[3,0,0,0,0,3], +"bullet__utils_8h.html#a57658aadbd0ec10129a9692fe4c281f4":[3,0,0,0,0,2], +"bullet__utils_8h.html#ac2af057ce6d42297f974e1386b1b34b3":[3,0,0,0,0,0], +"bullet__utils_8h.html#ae3bf38e32e44b3a353850acb05bbd81a":[3,0,0,0,0,4], +"bullet__utils_8h_source.html":[3,0,0,0,0], +"classes.html":[2,1], +"classvulp_1_1actuation_1_1BulletInterface.html":[2,0,0,0,2], +"classvulp_1_1actuation_1_1BulletInterface.html#a0b08119f9cdb5b36d9ec995dc56df7a5":[2,0,0,0,2,5], +"classvulp_1_1actuation_1_1BulletInterface.html#a11efda56b80d0f7fa19616f825ba977e":[2,0,0,0,2,9], +"classvulp_1_1actuation_1_1BulletInterface.html#a1f7c35df51b913aa85333be81eec2430":[2,0,0,0,2,14], +"classvulp_1_1actuation_1_1BulletInterface.html#a22a4561f736e47fd10838e33e3eea76f":[2,0,0,0,2,3], +"classvulp_1_1actuation_1_1BulletInterface.html#a3e8cb3fe8ce7681bd903b6c64889824c":[2,0,0,0,2,12], +"classvulp_1_1actuation_1_1BulletInterface.html#a4c35888d4d83b4a011e2d3b866591a43":[2,0,0,0,2,13], +"classvulp_1_1actuation_1_1BulletInterface.html#a63ab50366c585f45de6ace6a05cd10d8":[2,0,0,0,2,2], +"classvulp_1_1actuation_1_1BulletInterface.html#a67388fea7cb1806923cae8db9fa32374":[2,0,0,0,2,11], +"classvulp_1_1actuation_1_1BulletInterface.html#a947d01df9ece4fb48e0a3f48f9d524b0":[2,0,0,0,2,4], +"classvulp_1_1actuation_1_1BulletInterface.html#aa6e175ab2ded82e0c2e4c0e849e67b51":[2,0,0,0,2,8], +"classvulp_1_1actuation_1_1BulletInterface.html#abca68c25b313ed573f05d7c8a0f0a74f":[2,0,0,0,2,15], +"classvulp_1_1actuation_1_1BulletInterface.html#abf3317db63b1cf38d7da86e0efd7b5e1":[2,0,0,0,2,7], +"classvulp_1_1actuation_1_1BulletInterface.html#ae714260782b6110a5e77030ac8016540":[2,0,0,0,2,1], +"classvulp_1_1actuation_1_1BulletInterface.html#ae739f74f3dcb9316ca97840f5e5cab1a":[2,0,0,0,2,10], +"classvulp_1_1actuation_1_1BulletInterface.html#aebf8c201d8d102e776fbef06283c2cad":[2,0,0,0,2,6], +"classvulp_1_1actuation_1_1Interface.html":[2,0,0,0,5], +"classvulp_1_1actuation_1_1Interface.html#a030c21ac2fe9fd6e037f1d8c8ab2a287":[2,0,0,0,5,9], +"classvulp_1_1actuation_1_1Interface.html#a03bc60526db123752c398595584af95d":[2,0,0,0,5,12], +"classvulp_1_1actuation_1_1Interface.html#a154834670d82002681360eebf3353279":[2,0,0,0,5,0], +"classvulp_1_1actuation_1_1Interface.html#a3bb031735c3cfa22259787b88d63b49b":[2,0,0,0,5,4], +"classvulp_1_1actuation_1_1Interface.html#a4699195a001a20220ba4606f0bb58274":[2,0,0,0,5,1], +"classvulp_1_1actuation_1_1Interface.html#a48f6e80769c28910d4d8affb66fc343e":[2,0,0,0,5,11], +"classvulp_1_1actuation_1_1Interface.html#a58633a8bc4024056e0512b23baa78cfa":[2,0,0,0,5,5], +"classvulp_1_1actuation_1_1Interface.html#a6a235100e7e6a7edc3b447ccdd86e71b":[2,0,0,0,5,8], +"classvulp_1_1actuation_1_1Interface.html#a8cde746cb50f95e7bfbf9dfe718fa443":[2,0,0,0,5,13], +"classvulp_1_1actuation_1_1Interface.html#ab9b6fe3cbfd5e58345a1297a97da5de9":[2,0,0,0,5,3], +"classvulp_1_1actuation_1_1Interface.html#ac2ef0cf7b5e03256826df43fdde67923":[2,0,0,0,5,7], +"classvulp_1_1actuation_1_1Interface.html#ac5f1fd525398a0a0d290ee2aed26c66f":[2,0,0,0,5,6], +"classvulp_1_1actuation_1_1Interface.html#ac60af36fb98a8bda3b21d8252c3a1453":[2,0,0,0,5,2], +"classvulp_1_1actuation_1_1Interface.html#ad8043504a3f4003d353919f664ad38aa":[2,0,0,0,5,10], +"classvulp_1_1actuation_1_1MockInterface.html":[2,0,0,0,6], +"classvulp_1_1actuation_1_1MockInterface.html#a0e5220c878595c959f26f51dbba9c078":[2,0,0,0,6,0], +"classvulp_1_1actuation_1_1MockInterface.html#a188d0479488241b3f5549c16a2f4daae":[2,0,0,0,6,1], +"classvulp_1_1actuation_1_1MockInterface.html#a2e52d2e397d8e0bab2af4f1851f447c3":[2,0,0,0,6,4], +"classvulp_1_1actuation_1_1MockInterface.html#a790e57ed6a6157044ae70c3e59d9967e":[2,0,0,0,6,3], +"classvulp_1_1actuation_1_1MockInterface.html#a9aaaa09396d4966948f02e5953d99677":[2,0,0,0,6,2], +"classvulp_1_1actuation_1_1Pi3HatInterface.html":[2,0,0,0,7], +"classvulp_1_1actuation_1_1Pi3HatInterface.html#a7240e06f6198aebe50f0764c4610c511":[2,0,0,0,7,1], +"classvulp_1_1actuation_1_1Pi3HatInterface.html#a7fba7d27e5486cfdefe177b1631989d3":[2,0,0,0,7,2], +"classvulp_1_1actuation_1_1Pi3HatInterface.html#a996e787fffa3e114248c62554a82ea6c":[2,0,0,0,7,0], +"classvulp_1_1actuation_1_1Pi3HatInterface.html#abdec83204cb8b1bd51333d5d62f89293":[2,0,0,0,7,3], +"classvulp_1_1actuation_1_1Pi3HatInterface.html#ae6868c0cb7bdcb5dd16bbcd6bd8a6214":[2,0,0,0,7,4], +"classvulp_1_1actuation_1_1ServoLayout.html":[2,0,0,0,8], +"classvulp_1_1actuation_1_1ServoLayout.html#a50a75e86d72f40263d8103e4e575ee84":[2,0,0,0,8,2], +"classvulp_1_1actuation_1_1ServoLayout.html#a5a77916f9ec8ffe722ce5b3fcacf2097":[2,0,0,0,8,0], +"classvulp_1_1actuation_1_1ServoLayout.html#aa8acd7e824f357e25101d8e27a96cbc0":[2,0,0,0,8,4], +"classvulp_1_1actuation_1_1ServoLayout.html#aa913aed179eea813eeb1e0a26e73079c":[2,0,0,0,8,5], +"classvulp_1_1actuation_1_1ServoLayout.html#aecd67b35fadbcd87c4528a7069f9ae71":[2,0,0,0,8,1], +"classvulp_1_1actuation_1_1ServoLayout.html#af5832e2cf2c38680ae5629437a6d8a5e":[2,0,0,0,8,3], +"classvulp_1_1control_1_1Controller.html":[2,0,0,1,0], +"classvulp_1_1control_1_1Controller.html#a67d54fc3c74f0464f1685d8d2640f9e0":[2,0,0,1,0,0], +"classvulp_1_1observation_1_1HistoryObserver.html":[2,0,0,2,1], +"classvulp_1_1observation_1_1HistoryObserver.html#a556211d9cb6719e3a044c20ddfd0bb27":[2,0,0,2,1,0], +"classvulp_1_1observation_1_1HistoryObserver.html#a9786400be17a5a9f6e1ca34016c27ad7":[2,0,0,2,1,1], +"classvulp_1_1observation_1_1HistoryObserver.html#ad14642b0057573baf2ef01db21b3eb42":[2,0,0,2,1,3], +"classvulp_1_1observation_1_1HistoryObserver.html#ad4b85e8cdf7f4b9b35e93ec062f2d712":[2,0,0,2,1,2], +"classvulp_1_1observation_1_1HistoryObserver.html#ad5cef6b330e2db7c80dcbaec7cf58892":[2,0,0,2,1,4], +"classvulp_1_1observation_1_1Observer.html":[2,0,0,2,2], +"classvulp_1_1observation_1_1Observer.html#a220adebd86175a8da2890f14e0fb3d65":[2,0,0,2,2,3], +"classvulp_1_1observation_1_1Observer.html#a3fd28e0a2aa049f4a6a1e3a7a447ab60":[2,0,0,2,2,1], +"classvulp_1_1observation_1_1Observer.html#a547821509ce1dffd57dccfca3e357b34":[2,0,0,2,2,2], +"classvulp_1_1observation_1_1Observer.html#ad1187770cd115152300db7ccbe0ad452":[2,0,0,2,2,4], +"classvulp_1_1observation_1_1Observer.html#aedcf4bafa7051d01e5711180738b2ba6":[2,0,0,2,2,0], +"classvulp_1_1observation_1_1ObserverPipeline.html":[2,0,0,2,3], +"classvulp_1_1observation_1_1ObserverPipeline.html#a1757b995b52d4061bde1f043ff92ac03":[2,0,0,2,3,8], +"classvulp_1_1observation_1_1ObserverPipeline.html#a411a57b496f55b29070781481b2fd34b":[2,0,0,2,3,6], +"classvulp_1_1observation_1_1ObserverPipeline.html#a5137ef162e96278c44a05b146115c17b":[2,0,0,2,3,5], +"classvulp_1_1observation_1_1ObserverPipeline.html#a56d8e82ec0322066ee77202c6a98f4be":[2,0,0,2,3,7], +"classvulp_1_1observation_1_1ObserverPipeline.html#a98385c29632eef6f1edc9e6e1ed58f36":[2,0,0,2,3,3], +"classvulp_1_1observation_1_1ObserverPipeline.html#aac2989ab99989a92a77d7e1125a0c152":[2,0,0,2,3,4], +"classvulp_1_1observation_1_1ObserverPipeline.html#ab9f3bed18ac04a0e441fd83422f010d4":[2,0,0,2,3,2], +"classvulp_1_1observation_1_1ObserverPipeline.html#ae2efd5d24271fca7cb053f9732df050f":[2,0,0,2,3,1], +"classvulp_1_1observation_1_1ObserverPipeline.html#af938c156ac8f8d3b4ad535c3073e2e15":[2,0,0,2,3,0], +"classvulp_1_1observation_1_1Source.html":[2,0,0,2,4], +"classvulp_1_1observation_1_1Source.html#a10a52aaca76bb4482c479d528748d037":[2,0,0,2,4,2], +"classvulp_1_1observation_1_1Source.html#a9c713319a0579c85a702081364bbb2f1":[2,0,0,2,4,0], +"classvulp_1_1observation_1_1Source.html#aff5c8426054622d7da7b6d023f77d40a":[2,0,0,2,4,1], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html":[2,0,0,2,0,0], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a1f42b9ef3a86dd27c01d5df9c4a2d979":[2,0,0,2,0,0,3], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63cc643a7be79d776747c14b245937fd":[2,0,0,2,0,0,0], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63df1f5c11f3d11d60dab2b7401defe1":[2,0,0,2,0,0,4], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#aa480657101c7adb0f59b873a57ad6cd7":[2,0,0,2,0,0,2], +"classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#ad9726f53ab1e7a3382db4e00279aa26a":[2,0,0,2,0,0,1], +"classvulp_1_1observation_1_1sources_1_1Joystick.html":[2,0,0,2,0,1], +"classvulp_1_1observation_1_1sources_1_1Joystick.html#a0af1bb65e8e8c27563bebdc2e80951a9":[2,0,0,2,0,1,2], +"classvulp_1_1observation_1_1sources_1_1Joystick.html#a1d514247fd5f7ed3728a6a5b02c44b48":[2,0,0,2,0,1,1], +"classvulp_1_1observation_1_1sources_1_1Joystick.html#a42caa70abe49b65862a960efaff0d624":[2,0,0,2,0,1,3], +"classvulp_1_1observation_1_1sources_1_1Joystick.html#a8ce565ddf3ab79d790a0b231d5c9456d":[2,0,0,2,0,1,4], +"classvulp_1_1observation_1_1sources_1_1Joystick.html#aa29b4d83c0c29179259151aeb891c0aa":[2,0,0,2,0,1,0], +"classvulp_1_1observation_1_1sources_1_1Keyboard.html":[2,0,0,2,0,2], +"classvulp_1_1observation_1_1sources_1_1Keyboard.html#a3a397c882016fbb734f2fb445c29d39b":[2,0,0,2,0,2,0], +"classvulp_1_1observation_1_1sources_1_1Keyboard.html#a662c1d7cab92bf282a19463a84340c0f":[2,0,0,2,0,2,1], +"classvulp_1_1observation_1_1sources_1_1Keyboard.html#a74f9aafe3336163bca381653b8db911e":[2,0,0,2,0,2,2], +"classvulp_1_1observation_1_1sources_1_1Keyboard.html#a772779999809525853d22389b0ffba0e":[2,0,0,2,0,2,3], +"classvulp_1_1spine_1_1AgentInterface.html":[2,0,0,3,3], +"classvulp_1_1spine_1_1AgentInterface.html#a03c363ea6525fc4a52a34690f30b6cf7":[2,0,0,3,3,4], +"classvulp_1_1spine_1_1AgentInterface.html#a1996190b31a6bf6f9c530107f4cfce50":[2,0,0,3,3,6], +"classvulp_1_1spine_1_1AgentInterface.html#a1c5ed95ec40decdc148a36f433112554":[2,0,0,3,3,5], +"classvulp_1_1spine_1_1AgentInterface.html#aa1f13c476e68abb4b9ac4c62269bdf50":[2,0,0,3,3,1], +"classvulp_1_1spine_1_1AgentInterface.html#ae188b4cdae97d1556b0f19cf3780cc6e":[2,0,0,3,3,0], +"classvulp_1_1spine_1_1AgentInterface.html#ae530d9f802a29ea464ec4c280a428f6a":[2,0,0,3,3,2], +"classvulp_1_1spine_1_1AgentInterface.html#afbe5e2c09cd343f179dcc7a97a3228b3":[2,0,0,3,3,3], +"classvulp_1_1spine_1_1Spine.html":[2,0,0,3,4], +"classvulp_1_1spine_1_1Spine.html#a0060f951f291ff3f707393e7d2563e36":[2,0,0,3,4,13], +"classvulp_1_1spine_1_1Spine.html#a00d150f97b2ede19b540f2b554dc2ded":[2,0,0,3,4,8], +"classvulp_1_1spine_1_1Spine.html#a0cdd75b5375864a16dc3acd7bc662e8a":[2,0,0,3,4,7], +"classvulp_1_1spine_1_1Spine.html#a0f3f391aee9e28c9720703e78783d84d":[2,0,0,3,4,10], +"classvulp_1_1spine_1_1Spine.html#a31497eb1f54c8876a843a00268dce14c":[2,0,0,3,4,4], +"classvulp_1_1spine_1_1Spine.html#a3a39717160c48c39e6b13fab3f82f036":[2,0,0,3,4,15], +"classvulp_1_1spine_1_1Spine.html#a3cb0cc80e3ee3412f6c84c9cdc87f6aa":[2,0,0,3,4,16], +"classvulp_1_1spine_1_1Spine.html#a422e9d2f95cf562a05dc994a9385c188":[2,0,0,3,4,3], +"classvulp_1_1spine_1_1Spine.html#a54ac730b1f049078c57e578373b9d421":[2,0,0,3,4,17], +"classvulp_1_1spine_1_1Spine.html#a5aae68ebd2f703f2c2dfdeb54f99c0a5":[2,0,0,3,4,14], +"classvulp_1_1spine_1_1Spine.html#a5dfa447b98c55c3caca1f06aed23a4dd":[2,0,0,3,4,5], +"classvulp_1_1spine_1_1Spine.html#a74511847ef40db4668a8a26ddf6916c8":[2,0,0,3,4,11], +"classvulp_1_1spine_1_1Spine.html#a961c5ef602634734b6e75e667574e90c":[2,0,0,3,4,12], +"classvulp_1_1spine_1_1Spine.html#aa362cc84873d2ffa1359a73efd5441f9":[2,0,0,3,4,2], +"classvulp_1_1spine_1_1Spine.html#abba8605f39e2d5fec65425980bab7137":[2,0,0,3,4,9], +"classvulp_1_1spine_1_1Spine.html#ac5140f68adf3ad4a1db44aecf7e5b74b":[2,0,0,3,4,6], +"classvulp_1_1spine_1_1Spine.html#ad6b50ac8ebf63ef239bcff853125fc81":[2,0,0,3,4,18], +"classvulp_1_1spine_1_1Spine.html#af3f09675c956d6c7eeb116210e3fa973":[2,0,0,3,4,1], +"classvulp_1_1spine_1_1StateMachine.html":[2,0,0,3,5], +"classvulp_1_1spine_1_1StateMachine.html#a44d4c72635480d0f4c9574d4a9833e5c":[2,0,0,3,5,2] +}; diff --git a/navtreeindex1.js b/navtreeindex1.js new file mode 100644 index 00000000..9a378763 --- /dev/null +++ b/navtreeindex1.js @@ -0,0 +1,247 @@ +var NAVTREEINDEX1 = +{ +"classvulp_1_1spine_1_1StateMachine.html#acc1608eb36870a89aba2f563220819ee":[2,0,0,3,5,0], +"classvulp_1_1spine_1_1StateMachine.html#ace23c634b58a586edc4ca244675e29ff":[2,0,0,3,5,3], +"classvulp_1_1spine_1_1StateMachine.html#ae3883e0306f844b7ce6e95fc931e75f3":[2,0,0,3,5,1], +"classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html":[2,0,0,3,0,1], +"classvulp_1_1spine_1_1exceptions_1_1SpineError.html":[2,0,0,3,0,2], +"classvulp_1_1spine_1_1exceptions_1_1VulpException.html":[2,0,0,3,0,0], +"classvulp_1_1spine_1_1request_1_1Request.html":[2,0,0,3,1,0], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html":[2,0,0,3,2,0], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a2eb6a040f56937b3c7c0b5aa668fa95e":[2,0,0,3,2,0,4], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a38501b691c8efab6eae04853f88bd6a1":[2,0,0,3,2,0,3], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a62b07a000db69ac2ade003c34d728b02":[2,0,0,3,2,0,5], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a63d8286efc24e65ba6a63667d7e54ecc":[2,0,0,3,2,0,1], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a66b1bc70850b8e120c2a0df6cc1775a7":[2,0,0,3,2,0,0], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aca235a9ef5bb357d939d133bc7a1ed43":[2,0,0,3,2,0,2], +"classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aec2e958f961ea163d1b1a78a155d3f2a":[2,0,0,3,2,0,6], +"classvulp_1_1utils_1_1SynchronousClock.html":[2,0,0,4,0], +"classvulp_1_1utils_1_1SynchronousClock.html#a38f9298dd6d373b8930416ae3146f4de":[2,0,0,4,0,1], +"classvulp_1_1utils_1_1SynchronousClock.html#a44480a4608ae3b5d5a74dcd97a7b8f75":[2,0,0,4,0,2], +"classvulp_1_1utils_1_1SynchronousClock.html#a68625e8c2ac5ce10018cd3e38f400ebe":[2,0,0,4,0,0], +"classvulp_1_1utils_1_1SynchronousClock.html#a8b04ab90ec9ca81016bfed118a0b1a10":[2,0,0,4,0,4], +"classvulp_1_1utils_1_1SynchronousClock.html#aca17e08b153c266fc0fd202822ea3194":[2,0,0,4,0,3], +"default__action_8h.html":[3,0,0,0,6], +"default__action_8h.html#a162f94f351be65ad299e955232e415aa":[3,0,0,0,6,3], +"default__action_8h.html#a1f6d1969f4382b8e086bb89c0514760d":[3,0,0,0,6,4], +"default__action_8h.html#a37fdf95f3ecb19b772ed1ed45b5864e9":[3,0,0,0,6,1], +"default__action_8h.html#a9b7395da45f48d599f21ac8d53358a02":[3,0,0,0,6,2], +"default__action_8h.html#acd6b5f4fab30ca4fa011b072eb178db3":[3,0,0,0,6,0], +"default__action_8h_source.html":[3,0,0,0,6], +"dir_27fdad92f183d08847377ce77063c2a3.html":[3,0,0,4], +"dir_2c90065d9b3e245ac0aba12bc2d37fee.html":[3,0,0,2,0], +"dir_48b927d7dec9ed7311ba15ea585d91e7.html":[3,0,0], +"dir_8710f232fe2dd0ce2bee37e6570d7f32.html":[3,0,0,3], +"dir_9d5cff624cbb8b86e00f4d9f231f0448.html":[3,0,0,0], +"dir_ce63330e843d33999781c00720b60ac3.html":[3,0,0,1], +"dir_e7811e66c239a6f6f927707cc114be4f.html":[3,0,0,2], +"exceptions_8py.html":[3,0,0,3,3], +"exceptions_8py_source.html":[3,0,0,3,3], +"files.html":[3,0], +"functions.html":[2,3,0], +"functions_func.html":[2,3,1], +"functions_type.html":[2,3,3], +"functions_vars.html":[2,3,2], +"globals.html":[3,1,0], +"globals_func.html":[3,1,1], +"globals_vars.html":[3,1,2], +"handle__interrupts_8cpp.html":[3,0,0,4,1], +"handle__interrupts_8cpp.html#a78519754b023e10a26052f84229732fa":[3,0,0,4,1,1], +"handle__interrupts_8cpp.html#a838e3878c7da2dc06db5168b5ef421b2":[3,0,0,4,1,0], +"handle__interrupts_8cpp.html#ac7a04e3bcce477cf05d12ecb651fab6d":[3,0,0,4,1,2], +"handle__interrupts_8cpp_source.html":[3,0,0,4,1], +"handle__interrupts_8h.html":[3,0,0,4,2], +"handle__interrupts_8h.html#a78519754b023e10a26052f84229732fa":[3,0,0,4,2,1], +"handle__interrupts_8h.html#a838e3878c7da2dc06db5168b5ef421b2":[3,0,0,4,2,0], +"handle__interrupts_8h_source.html":[3,0,0,4,2], +"hierarchy.html":[2,2], +"index.html":[], +"index.html":[0], +"index.html#autotoc_md1":[0,0], +"index.html#autotoc_md10":[0,3], +"index.html#autotoc_md11":[0,3,0], +"index.html#autotoc_md12":[0,3,0,0], +"index.html#autotoc_md13":[0,3,0,1], +"index.html#autotoc_md14":[0,3,0,2], +"index.html#autotoc_md15":[0,3,0,3], +"index.html#autotoc_md16":[0,3,1], +"index.html#autotoc_md17":[0,3,1,0], +"index.html#autotoc_md18":[0,3,1,1], +"index.html#autotoc_md19":[0,3,1,2], +"index.html#autotoc_md2":[0,0,0], +"index.html#autotoc_md20":[0,3,1,3], +"index.html#autotoc_md3":[0,0,1], +"index.html#autotoc_md4":[0,1], +"index.html#autotoc_md5":[0,2], +"index.html#autotoc_md6":[0,2,0], +"index.html#autotoc_md7":[0,2,0,0], +"index.html#autotoc_md8":[0,2,0,1], +"index.html#autotoc_md9":[0,2,1], +"low__pass__filter_8h.html":[3,0,0,4,3], +"low__pass__filter_8h.html#a82e8f66ca7a05a1fe40afeac8cfea205":[3,0,0,4,3,0], +"low__pass__filter_8h_source.html":[3,0,0,4,3], +"math_8h.html":[3,0,0,4,4], +"math_8h.html#a8c590daf31618ab64f1f0f044ed81148":[3,0,0,4,4,0], +"math_8h_source.html":[3,0,0,4,4], +"namespacemembers.html":[1,1,0], +"namespacemembers_enum.html":[1,1,4], +"namespacemembers_func.html":[1,1,1], +"namespacemembers_type.html":[1,1,3], +"namespacemembers_vars.html":[1,1,2], +"namespaces.html":[1,0], +"namespacevulp.html":[1,0,0], +"namespacevulp_1_1actuation.html":[1,0,0,0], +"namespacevulp_1_1actuation.html#a17c7faa08c40ba9298774b4da1c86edb":[1,0,0,0,19], +"namespacevulp_1_1actuation.html#a225ab1b9ea7b3dd97f298768e432246a":[1,0,0,0,12], +"namespacevulp_1_1actuation.html#a3b0ac5d01ef820488834702e962bc765":[1,0,0,0,14], +"namespacevulp_1_1actuation.html#a57658aadbd0ec10129a9692fe4c281f4":[1,0,0,0,13], +"namespacevulp_1_1actuation.html#a5ee46598099be18d955806e127b76a38":[1,0,0,0,18], +"namespacevulp_1_1actuation.html#aabb66d6b3cd81c772937088266af0829":[1,0,0,0,16], +"namespacevulp_1_1actuation.html#ab2b376daf35eae21e48708f9b3f63460":[1,0,0,0,10], +"namespacevulp_1_1actuation.html#ac2af057ce6d42297f974e1386b1b34b3":[1,0,0,0,11], +"namespacevulp_1_1actuation.html#ac48c5992ecb62d9c23d2970d3408afdd":[1,0,0,0,17], +"namespacevulp_1_1actuation.html#ae3bf38e32e44b3a353850acb05bbd81a":[1,0,0,0,15], +"namespacevulp_1_1actuation_1_1default__action.html":[1,0,0,0,0], +"namespacevulp_1_1actuation_1_1default__action.html#a162f94f351be65ad299e955232e415aa":[1,0,0,0,0,3], +"namespacevulp_1_1actuation_1_1default__action.html#a1f6d1969f4382b8e086bb89c0514760d":[1,0,0,0,0,4], +"namespacevulp_1_1actuation_1_1default__action.html#a37fdf95f3ecb19b772ed1ed45b5864e9":[1,0,0,0,0,1], +"namespacevulp_1_1actuation_1_1default__action.html#a9b7395da45f48d599f21ac8d53358a02":[1,0,0,0,0,2], +"namespacevulp_1_1actuation_1_1default__action.html#acd6b5f4fab30ca4fa011b072eb178db3":[1,0,0,0,0,0], +"namespacevulp_1_1control.html":[1,0,0,1], +"namespacevulp_1_1observation.html":[1,0,0,2], +"namespacevulp_1_1observation.html#a0ae2b75955060fe39559b2b05f6997ed":[1,0,0,2,6], +"namespacevulp_1_1observation.html#a91251ac7479e0efd644cbd763d66d5ea":[1,0,0,2,7], +"namespacevulp_1_1observation.html#ad2218a79b5b3865746e23d5579f97585":[1,0,0,2,5], +"namespacevulp_1_1observation_1_1sources.html":[1,0,0,2,0], +"namespacevulp_1_1observation_1_1sources.html#a010055692ae8692090553ae85b6f66bc":[1,0,0,2,0,4], +"namespacevulp_1_1observation_1_1sources.html#a7e19b63b7a414ab70c8b9468df93de44":[1,0,0,2,0,5], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422":[1,0,0,2,0,3], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383":[1,0,0,2,0,3,8], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403":[1,0,0,2,0,3,3], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e":[1,0,0,2,0,3,6], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276":[1,0,0,2,0,3,4], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758":[1,0,0,2,0,3,2], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3":[1,0,0,2,0,3,10], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29":[1,0,0,2,0,3,5], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693":[1,0,0,2,0,3,9], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f":[1,0,0,2,0,3,1], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5":[1,0,0,2,0,3,7], +"namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1":[1,0,0,2,0,3,0], +"namespacevulp_1_1spine.html":[1,0,0,3], +"namespacevulp_1_1spine.html#a5bc778508b13f1e9e7dd227025a32808":[1,0,0,3,13], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1":[1,0,0,3,7], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d":[1,0,0,3,7,3], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13":[1,0,0,3,7,0], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28":[1,0,0,3,7,1], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b":[1,0,0,3,7,4], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97":[1,0,0,3,7,5], +"namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4":[1,0,0,3,7,2], +"namespacevulp_1_1spine.html#a6c2c8dbd236f8d35e2ecac79f165fa29":[1,0,0,3,12], +"namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431":[1,0,0,3,6], +"namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae":[1,0,0,3,6,2], +"namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b":[1,0,0,3,6,0], +"namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16":[1,0,0,3,6,1], +"namespacevulp_1_1spine.html#a8a3fa5d6802d99a9b3dbcb1425231bde":[1,0,0,3,11], +"namespacevulp_1_1spine.html#a8f9f5a5899f507ebe75f4a033e9c1a8f":[1,0,0,3,9], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673b":[1,0,0,3,8], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb":[1,0,0,3,8,4], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961":[1,0,0,3,8,6], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94":[1,0,0,3,8,3], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe":[1,0,0,3,8,0], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b":[1,0,0,3,8,1], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb":[1,0,0,3,8,5], +"namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b":[1,0,0,3,8,2], +"namespacevulp_1_1spine.html#afe7d438605444b816b7d2fb170c87240":[1,0,0,3,10], +"namespacevulp_1_1spine_1_1exceptions.html":[1,0,0,3,0], +"namespacevulp_1_1spine_1_1request.html":[1,0,0,3,1], +"namespacevulp_1_1spine_1_1spine__interface.html":[1,0,0,3,2], +"namespacevulp_1_1spine_1_1spine__interface.html#a4c4005d1998a361e6be94accfccae083":[1,0,0,3,2,1], +"namespacevulp_1_1utils.html":[1,0,0,4], +"namespacevulp_1_1utils.html#a382e082bfa27731270dfa119bee29d9a":[1,0,0,4,5], +"namespacevulp_1_1utils.html#a647a4a0c11b7b2a5a65c99c77ebd9a54":[1,0,0,4,4], +"namespacevulp_1_1utils.html#a65dbe76c6a061bce5651e1ddd7d00b13":[1,0,0,4,10], +"namespacevulp_1_1utils.html#a6c6306957ebd97c6d0682112514a4fe7":[1,0,0,4,9], +"namespacevulp_1_1utils.html#a78519754b023e10a26052f84229732fa":[1,0,0,4,6], +"namespacevulp_1_1utils.html#a82e8f66ca7a05a1fe40afeac8cfea205":[1,0,0,4,8], +"namespacevulp_1_1utils.html#ae34f759b79aecb082475a33f8d67045e":[1,0,0,4,7], +"namespacevulp_1_1utils_1_1internal.html":[1,0,0,4,0], +"namespacevulp_1_1utils_1_1internal.html#a838e3878c7da2dc06db5168b5ef421b2":[1,0,0,4,0,0], +"namespacevulp_1_1utils_1_1internal.html#ac7a04e3bcce477cf05d12ecb651fab6d":[1,0,0,4,0,1], +"namespacevulp_1_1utils_1_1math.html":[1,0,0,4,1], +"namespacevulp_1_1utils_1_1math.html#a8c590daf31618ab64f1f0f044ed81148":[1,0,0,4,1,0], +"namespacevulp_1_1utils_1_1serialize.html":[1,0,0,4,2], +"namespacevulp_1_1utils_1_1serialize.html#a0cb702d04af978c6ba56320ecd0068f1":[1,0,0,4,2,0], +"observe__servos_8cpp.html":[3,0,0,2,2], +"observe__servos_8cpp.html#ad2218a79b5b3865746e23d5579f97585":[3,0,0,2,2,0], +"observe__servos_8cpp_source.html":[3,0,0,2,2], +"observe__servos_8h.html":[3,0,0,2,3], +"observe__servos_8h.html#a0ae2b75955060fe39559b2b05f6997ed":[3,0,0,2,3,0], +"observe__servos_8h_source.html":[3,0,0,2,3], +"observe__time_8h.html":[3,0,0,2,4], +"observe__time_8h.html#a91251ac7479e0efd644cbd763d66d5ea":[3,0,0,2,4,0], +"observe__time_8h_source.html":[3,0,0,2,4], +"pages.html":[], +"random__string_8h.html":[3,0,0,4,5], +"random__string_8h.html#a6c6306957ebd97c6d0682112514a4fe7":[3,0,0,4,5,0], +"random__string_8h_source.html":[3,0,0,4,5], +"realtime_8h.html":[3,0,0,4,6], +"realtime_8h.html#a382e082bfa27731270dfa119bee29d9a":[3,0,0,4,6,1], +"realtime_8h.html#a647a4a0c11b7b2a5a65c99c77ebd9a54":[3,0,0,4,6,0], +"realtime_8h.html#ae34f759b79aecb082475a33f8d67045e":[3,0,0,4,6,2], +"realtime_8h_source.html":[3,0,0,4,6], +"request_8py.html":[3,0,0,3,5], +"request_8py_source.html":[3,0,0,3,5], +"resolution_8h.html":[3,0,0,0,14], +"resolution_8h.html#a5ee46598099be18d955806e127b76a38":[3,0,0,0,14,1], +"resolution_8h.html#ac48c5992ecb62d9c23d2970d3408afdd":[3,0,0,0,14,0], +"resolution_8h_source.html":[3,0,0,0,14], +"serialize_8py.html":[3,0,0,4,7], +"serialize_8py.html#a0cb702d04af978c6ba56320ecd0068f1":[3,0,0,4,7,0], +"serialize_8py_source.html":[3,0,0,4,7], +"spine_2____init_____8py.html":[3,0,0,3,0], +"spine_2____init_____8py.html#a8a3fa5d6802d99a9b3dbcb1425231bde":[3,0,0,3,0,0], +"spine_2____init_____8py_source.html":[3,0,0,3,0], +"spine__interface_8py.html":[3,0,0,3,8], +"spine__interface_8py.html#a4c4005d1998a361e6be94accfccae083":[3,0,0,3,8,1], +"spine__interface_8py_source.html":[3,0,0,3,8], +"structvulp_1_1actuation_1_1BulletContactData.html":[2,0,0,0,0], +"structvulp_1_1actuation_1_1BulletContactData.html#ad28b8a81095edc4f3975e7b44ccd67a3":[2,0,0,0,0,0], +"structvulp_1_1actuation_1_1BulletImuData.html":[2,0,0,0,1], +"structvulp_1_1actuation_1_1BulletImuData.html#a7f574fca8e18c6351fd502aa700240cc":[2,0,0,0,1,0], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html":[2,0,0,0,2,0], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a149f12313d0d349d14c084174b4eea5f":[2,0,0,0,2,0,16], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a3dd3900c6fc0d5e0f9d1eaed35888e5a":[2,0,0,0,2,0,9], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5569419c2647379d927567fe26253cc7":[2,0,0,0,2,0,5], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5f8872bb8b7c460ccd28796fda7428c3":[2,0,0,0,2,0,10], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a71e309bd3ceb8c7c19bcef4fcdd40cab":[2,0,0,0,2,0,1], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a7bfc34eaf6e26490704ed26a8e8eefa9":[2,0,0,0,2,0,17], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a9e842b4a697299725aa500a6e038238b":[2,0,0,0,2,0,7], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aa84c7bf26a08e22a0cd3de02eab3b011":[2,0,0,0,2,0,11], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aae8ee9b622e192f083fa7cc10d869ff6":[2,0,0,0,2,0,13], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab1ddd659af5fd3c87bd623663dabbd2d":[2,0,0,0,2,0,12], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab4144bd528ea4d7fce753a80f8f2a998":[2,0,0,0,2,0,0], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab6c2a786fa1a05366e2478920f91503a":[2,0,0,0,2,0,14], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab780b0fcbc751d13b2d5ad7ede7287c8":[2,0,0,0,2,0,3], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#abdb2f8b2389319f7f266df01007c995d":[2,0,0,0,2,0,15], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#acba555f40d7d6dbd77f3643b84573fb1":[2,0,0,0,2,0,6], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ada0f9a2c0ee7a3a7fca7308ac3cf12a1":[2,0,0,0,2,0,4], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aeeda8f2c234ee17f55c2aa485ef47d6f":[2,0,0,0,2,0,2], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af2f8b2aca20f8dea3f9001c961543d1c":[2,0,0,0,2,0,18], +"structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af5c2135bac4715f7e17f3834f9940d4d":[2,0,0,0,2,0,8], +"structvulp_1_1actuation_1_1BulletJointProperties.html":[2,0,0,0,3], +"structvulp_1_1actuation_1_1BulletJointProperties.html#a3af3193c4278dbdb8f9983239ef67b9d":[2,0,0,0,3,1], +"structvulp_1_1actuation_1_1BulletJointProperties.html#ac61ae286b06ef66415212bf8c97bbc56":[2,0,0,0,3,0], +"structvulp_1_1actuation_1_1ImuData.html":[2,0,0,0,4], +"structvulp_1_1actuation_1_1ImuData.html#a044618ce2e107e6c3b9372da39b69efe":[2,0,0,0,4,2], +"structvulp_1_1actuation_1_1ImuData.html#ab7f284df90fd038642a2cdcf55165104":[2,0,0,0,4,1], +"structvulp_1_1actuation_1_1ImuData.html#af0388ff114c843cc5daf4b8d0f902947":[2,0,0,0,4,0], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html":[2,0,0,3,4,0], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html#a0639895ce6ca39911eaa55b303582258":[2,0,0,3,4,0,4], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html#a4a6d1c2214abf52d3a6d2714fc4526d4":[2,0,0,3,4,0,3], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html#a5401e120945e5d09eb569d83833c5c44":[2,0,0,3,4,0,1], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html#a64da4f7a8bd34717145d7ac821ddd20d":[2,0,0,3,4,0,0], +"structvulp_1_1spine_1_1Spine_1_1Parameters.html#adac3276df5a55e141b0820d13d30118f":[2,0,0,3,4,0,2], +"utils_2____init_____8py.html":[3,0,0,4,0], +"utils_2____init_____8py.html#a65dbe76c6a061bce5651e1ddd7d00b13":[3,0,0,4,0,0], +"utils_2____init_____8py_source.html":[3,0,0,4,0] +}; diff --git a/observe__servos_8cpp.html b/observe__servos_8cpp.html new file mode 100644 index 00000000..04c51465 --- /dev/null +++ b/observe__servos_8cpp.html @@ -0,0 +1,137 @@ + + + + + + + +vulp: vulp/observation/observe_servos.cpp File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    observe_servos.cpp File Reference
    +
    +
    +
    #include "vulp/observation/observe_servos.h"
    +#include <map>
    +#include <string>
    +#include <vector>
    +
    +Include dependency graph for observe_servos.cpp:
    +
    +
    + + + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp::observation
     State observation.
     
    + + + +

    +Functions

    void vulp::observation::observe_servos (Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)
     
    +
    +
    + + + + diff --git a/observe__servos_8cpp.js b/observe__servos_8cpp.js new file mode 100644 index 00000000..87758e93 --- /dev/null +++ b/observe__servos_8cpp.js @@ -0,0 +1,4 @@ +var observe__servos_8cpp = +[ + [ "observe_servos", "observe__servos_8cpp.html#ad2218a79b5b3865746e23d5579f97585", null ] +]; \ No newline at end of file diff --git a/observe__servos_8cpp__incl.map b/observe__servos_8cpp__incl.map new file mode 100644 index 00000000..04cbe761 --- /dev/null +++ b/observe__servos_8cpp__incl.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/observe__servos_8cpp__incl.md5 b/observe__servos_8cpp__incl.md5 new file mode 100644 index 00000000..1655f925 --- /dev/null +++ b/observe__servos_8cpp__incl.md5 @@ -0,0 +1 @@ +d6f98b0aef781ee1af82eb07d174c35c \ No newline at end of file diff --git a/observe__servos_8cpp__incl.png b/observe__servos_8cpp__incl.png new file mode 100644 index 00000000..6bbcf579 Binary files /dev/null and b/observe__servos_8cpp__incl.png differ diff --git a/observe__servos_8cpp_source.html b/observe__servos_8cpp_source.html new file mode 100644 index 00000000..46a9edd6 --- /dev/null +++ b/observe__servos_8cpp_source.html @@ -0,0 +1,152 @@ + + + + + + + +vulp: vulp/observation/observe_servos.cpp Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    observe_servos.cpp
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    + +
    5 
    +
    6 #include <map>
    +
    7 #include <string>
    +
    8 #include <vector>
    +
    9 
    +
    10 namespace moteus = vulp::actuation::moteus;
    +
    11 
    +
    12 using palimpsest::Dictionary;
    +
    13 
    +
    14 namespace vulp::observation {
    +
    15 
    +
    16 void observe_servos(Dictionary& observation,
    +
    17  const std::map<int, std::string>& servo_joint_map,
    +
    18  const std::vector<moteus::ServoReply>& servo_replies) {
    +
    19  for (const auto& reply : servo_replies) {
    +
    20  const int servo_id = reply.id;
    +
    21  auto it = servo_joint_map.find(servo_id);
    +
    22  if (it == servo_joint_map.end()) {
    +
    23  spdlog::error("Unknown servo ID {} in CAN reply", servo_id);
    +
    24  continue;
    +
    25  }
    +
    26  const auto& joint = it->second;
    +
    27 
    +
    28  // The moteus convention is that positive angles correspond to clockwise
    +
    29  // rotations when looking at the rotor / back of the moteus board. See:
    +
    30  // https://jpieper.com/2021/04/30/moteus-direction-configuration/
    +
    31  double position_rev = reply.result.position;
    +
    32  double velocity_rev_s = reply.result.velocity;
    +
    33  double position_rad = (2.0 * M_PI) * position_rev;
    +
    34  double velocity_rad_s = (2.0 * M_PI) * velocity_rev_s;
    +
    35 
    +
    36  auto& servo = observation("servo")(joint);
    +
    37  servo("d_current") = reply.result.d_current;
    +
    38  servo("fault") = reply.result.fault;
    +
    39  servo("mode") = static_cast<unsigned>(reply.result.mode);
    +
    40  servo("position") = position_rad;
    +
    41  servo("q_current") = reply.result.q_current;
    +
    42  servo("temperature") = reply.result.temperature;
    +
    43  servo("torque") = reply.result.torque;
    +
    44  servo("velocity") = velocity_rad_s;
    +
    45  servo("voltage") = reply.result.voltage;
    +
    46  }
    +
    47 }
    +
    48 
    +
    49 } // namespace vulp::observation
    +
    State observation.
    +
    void observe_servos(Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)
    + +
    +
    + + + + diff --git a/observe__servos_8h.html b/observe__servos_8h.html new file mode 100644 index 00000000..d76fa080 --- /dev/null +++ b/observe__servos_8h.html @@ -0,0 +1,149 @@ + + + + + + + +vulp: vulp/observation/observe_servos.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    observe_servos.h File Reference
    +
    +
    +
    #include <palimpsest/Dictionary.h>
    +#include <map>
    +#include <string>
    +#include <vector>
    +#include "vulp/actuation/moteus/protocol.h"
    +
    +Include dependency graph for observe_servos.h:
    +
    +
    + + + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp::observation
     State observation.
     
    + + + + +

    +Functions

    void vulp::observation::observe_servos (palimpsest::Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< actuation::moteus::ServoReply > &servo_replies)
     Observe servo measurements. More...
     
    +
    +
    + + + + diff --git a/observe__servos_8h.js b/observe__servos_8h.js new file mode 100644 index 00000000..f91362f9 --- /dev/null +++ b/observe__servos_8h.js @@ -0,0 +1,4 @@ +var observe__servos_8h = +[ + [ "observe_servos", "observe__servos_8h.html#a0ae2b75955060fe39559b2b05f6997ed", null ] +]; \ No newline at end of file diff --git a/observe__servos_8h__dep__incl.map b/observe__servos_8h__dep__incl.map new file mode 100644 index 00000000..192d059d --- /dev/null +++ b/observe__servos_8h__dep__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/observe__servos_8h__dep__incl.md5 b/observe__servos_8h__dep__incl.md5 new file mode 100644 index 00000000..d91032c2 --- /dev/null +++ b/observe__servos_8h__dep__incl.md5 @@ -0,0 +1 @@ +482d2864c4a28f8bbd5924ac532b40f4 \ No newline at end of file diff --git a/observe__servos_8h__dep__incl.png b/observe__servos_8h__dep__incl.png new file mode 100644 index 00000000..67099375 Binary files /dev/null and b/observe__servos_8h__dep__incl.png differ diff --git a/observe__servos_8h__incl.map b/observe__servos_8h__incl.map new file mode 100644 index 00000000..e22a4e10 --- /dev/null +++ b/observe__servos_8h__incl.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/observe__servos_8h__incl.md5 b/observe__servos_8h__incl.md5 new file mode 100644 index 00000000..db96508a --- /dev/null +++ b/observe__servos_8h__incl.md5 @@ -0,0 +1 @@ +2159233af2d78b9349ecf7cbe5f2893a \ No newline at end of file diff --git a/observe__servos_8h__incl.png b/observe__servos_8h__incl.png new file mode 100644 index 00000000..95232c77 Binary files /dev/null and b/observe__servos_8h__incl.png differ diff --git a/observe__servos_8h_source.html b/observe__servos_8h_source.html new file mode 100644 index 00000000..fd928703 --- /dev/null +++ b/observe__servos_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +vulp: vulp/observation/observe_servos.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    observe_servos.h
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    +
    4 #pragma once
    +
    5 
    +
    6 #include <palimpsest/Dictionary.h>
    +
    7 
    +
    8 #include <map>
    +
    9 #include <string>
    +
    10 #include <vector>
    +
    11 
    +
    12 #include "vulp/actuation/moteus/protocol.h"
    +
    13 
    +
    14 namespace vulp::observation {
    +
    15 
    + +
    23  palimpsest::Dictionary& observation,
    +
    24  const std::map<int, std::string>& servo_joint_map,
    +
    25  const std::vector<actuation::moteus::ServoReply>& servo_replies);
    +
    26 
    +
    27 } // namespace vulp::observation
    +
    State observation.
    +
    void observe_servos(Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)
    +
    +
    + + + + diff --git a/observe__time_8h.html b/observe__time_8h.html new file mode 100644 index 00000000..7673dea7 --- /dev/null +++ b/observe__time_8h.html @@ -0,0 +1,140 @@ + + + + + + + +vulp: vulp/observation/observe_time.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    observe_time.h File Reference
    +
    +
    +
    #include <palimpsest/Dictionary.h>
    +
    +Include dependency graph for observe_time.h:
    +
    +
    + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp::observation
     State observation.
     
    + + + + +

    +Functions

    void vulp::observation::observe_time (Dictionary &observation)
     Observe time since the epoch. More...
     
    +
    +
    + + + + diff --git a/observe__time_8h.js b/observe__time_8h.js new file mode 100644 index 00000000..e7e4caee --- /dev/null +++ b/observe__time_8h.js @@ -0,0 +1,4 @@ +var observe__time_8h = +[ + [ "observe_time", "observe__time_8h.html#a91251ac7479e0efd644cbd763d66d5ea", null ] +]; \ No newline at end of file diff --git a/observe__time_8h__dep__incl.map b/observe__time_8h__dep__incl.map new file mode 100644 index 00000000..ebcf151b --- /dev/null +++ b/observe__time_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/observe__time_8h__dep__incl.md5 b/observe__time_8h__dep__incl.md5 new file mode 100644 index 00000000..337a5944 --- /dev/null +++ b/observe__time_8h__dep__incl.md5 @@ -0,0 +1 @@ +78b5ed9b0831d856a4f3f84f65c12bcc \ No newline at end of file diff --git a/observe__time_8h__dep__incl.png b/observe__time_8h__dep__incl.png new file mode 100644 index 00000000..6f825a27 Binary files /dev/null and b/observe__time_8h__dep__incl.png differ diff --git a/observe__time_8h__incl.map b/observe__time_8h__incl.map new file mode 100644 index 00000000..ab9609b2 --- /dev/null +++ b/observe__time_8h__incl.map @@ -0,0 +1,4 @@ + + + + diff --git a/observe__time_8h__incl.md5 b/observe__time_8h__incl.md5 new file mode 100644 index 00000000..31ca50e3 --- /dev/null +++ b/observe__time_8h__incl.md5 @@ -0,0 +1 @@ +6cfedb4e4769f43af49e83c30be352a9 \ No newline at end of file diff --git a/observe__time_8h__incl.png b/observe__time_8h__incl.png new file mode 100644 index 00000000..e636163e Binary files /dev/null and b/observe__time_8h__incl.png differ diff --git a/observe__time_8h_source.html b/observe__time_8h_source.html new file mode 100644 index 00000000..537907a5 --- /dev/null +++ b/observe__time_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +vulp: vulp/observation/observe_time.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    observe_time.h
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    +
    4 #pragma once
    +
    5 
    +
    6 #include <palimpsest/Dictionary.h>
    +
    7 
    +
    8 namespace vulp::observation {
    +
    9 
    +
    10 using palimpsest::Dictionary;
    +
    11 
    +
    16 inline void observe_time(Dictionary& observation) {
    +
    17  using std::chrono::duration_cast;
    +
    18  using std::chrono::microseconds;
    +
    19  const auto now = std::chrono::system_clock::now();
    +
    20  const auto time_since_epoch = now.time_since_epoch();
    +
    21  const auto nb_us = duration_cast<microseconds>(time_since_epoch).count();
    +
    22  observation("time") = static_cast<double>(nb_us) / 1e6;
    +
    23 }
    +
    24 
    +
    25 } // namespace vulp::observation
    +
    State observation.
    +
    void observe_time(Dictionary &observation)
    Observe time since the epoch.
    Definition: observe_time.h:16
    +
    +
    + + + + diff --git a/open.png b/open.png new file mode 100644 index 00000000..30f75c7e Binary files /dev/null and b/open.png differ diff --git a/random__string_8h.html b/random__string_8h.html new file mode 100644 index 00000000..6ef12d58 --- /dev/null +++ b/random__string_8h.html @@ -0,0 +1,134 @@ + + + + + + + +vulp: vulp/utils/random_string.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    random_string.h File Reference
    +
    +
    +
    #include <algorithm>
    +#include <random>
    +#include <string>
    +
    +Include dependency graph for random_string.h:
    +
    +
    + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp.utils
     Utility functions.
     
    + + + + +

    +Functions

    std::string vulp.utils::random_string (unsigned length=16)
     Generate a random string. More...
     
    +
    +
    + + + + diff --git a/random__string_8h.js b/random__string_8h.js new file mode 100644 index 00000000..e236a96e --- /dev/null +++ b/random__string_8h.js @@ -0,0 +1,4 @@ +var random__string_8h = +[ + [ "random_string", "random__string_8h.html#a6c6306957ebd97c6d0682112514a4fe7", null ] +]; \ No newline at end of file diff --git a/random__string_8h__incl.map b/random__string_8h__incl.map new file mode 100644 index 00000000..04c84225 --- /dev/null +++ b/random__string_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/random__string_8h__incl.md5 b/random__string_8h__incl.md5 new file mode 100644 index 00000000..a099e087 --- /dev/null +++ b/random__string_8h__incl.md5 @@ -0,0 +1 @@ +3b8a0cce1f00bd44dcf084574751f3df \ No newline at end of file diff --git a/random__string_8h__incl.png b/random__string_8h__incl.png new file mode 100644 index 00000000..b845d4d2 Binary files /dev/null and b/random__string_8h__incl.png differ diff --git a/random__string_8h_source.html b/random__string_8h_source.html new file mode 100644 index 00000000..1c67343f --- /dev/null +++ b/random__string_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/utils/random_string.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    random_string.h
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    +
    4 #pragma once
    +
    5 
    +
    6 #include <algorithm>
    +
    7 #include <random>
    +
    8 #include <string>
    +
    9 
    +
    10 namespace vulp::utils {
    +
    11 
    +
    21 inline std::string random_string(unsigned length = 16) {
    +
    22  std::string alphanum(
    +
    23  "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
    +
    24  length = (length <= 62) ? length : 62; // 62 == alphanum.size()
    +
    25  std::random_device device;
    +
    26  std::mt19937 generator(device());
    +
    27  std::shuffle(alphanum.begin(), alphanum.end(), generator);
    +
    28  return alphanum.substr(0, length);
    +
    29 }
    +
    30 
    +
    31 } // namespace vulp::utils
    +
    Utility functions.
    Definition: __init__.py:1
    +
    std::string random_string(unsigned length=16)
    Generate a random string.
    Definition: random_string.h:21
    +
    +
    + + + + diff --git a/realtime_8h.html b/realtime_8h.html new file mode 100644 index 00000000..5280282c --- /dev/null +++ b/realtime_8h.html @@ -0,0 +1,152 @@ + + + + + + + +vulp: vulp/utils/realtime.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    realtime.h File Reference
    +
    +
    +
    #include <sched.h>
    +#include <sys/mman.h>
    +#include <stdexcept>
    +
    +Include dependency graph for realtime.h:
    +
    +
    + + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp.utils
     Utility functions.
     
    + + + + + + + + + + +

    +Functions

    void vulp.utils::configure_cpu (int cpu)
     Set the current thread to run on a given CPU core. More...
     
    void vulp.utils::configure_scheduler (int priority)
     Configure the scheduler policy to round-robin for this thread. More...
     
    bool vulp.utils::lock_memory ()
     Lock all memory to RAM so that the kernel doesn't page it to swap. More...
     
    +
    +
    + + + + diff --git a/realtime_8h.js b/realtime_8h.js new file mode 100644 index 00000000..cad63632 --- /dev/null +++ b/realtime_8h.js @@ -0,0 +1,6 @@ +var realtime_8h = +[ + [ "configure_cpu", "realtime_8h.html#a647a4a0c11b7b2a5a65c99c77ebd9a54", null ], + [ "configure_scheduler", "realtime_8h.html#a382e082bfa27731270dfa119bee29d9a", null ], + [ "lock_memory", "realtime_8h.html#ae34f759b79aecb082475a33f8d67045e", null ] +]; \ No newline at end of file diff --git a/realtime_8h__dep__incl.map b/realtime_8h__dep__incl.map new file mode 100644 index 00000000..f9017c3c --- /dev/null +++ b/realtime_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/realtime_8h__dep__incl.md5 b/realtime_8h__dep__incl.md5 new file mode 100644 index 00000000..864f8202 --- /dev/null +++ b/realtime_8h__dep__incl.md5 @@ -0,0 +1 @@ +5a7b14f8567ac6c7088c7cf74d00ff94 \ No newline at end of file diff --git a/realtime_8h__dep__incl.png b/realtime_8h__dep__incl.png new file mode 100644 index 00000000..5a6c4b0a Binary files /dev/null and b/realtime_8h__dep__incl.png differ diff --git a/realtime_8h__incl.map b/realtime_8h__incl.map new file mode 100644 index 00000000..ebe5fcda --- /dev/null +++ b/realtime_8h__incl.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/realtime_8h__incl.md5 b/realtime_8h__incl.md5 new file mode 100644 index 00000000..b278e58e --- /dev/null +++ b/realtime_8h__incl.md5 @@ -0,0 +1 @@ +9c681b96a07b14dc659f94b03264a88a \ No newline at end of file diff --git a/realtime_8h__incl.png b/realtime_8h__incl.png new file mode 100644 index 00000000..7f5ccd79 Binary files /dev/null and b/realtime_8h__incl.png differ diff --git a/realtime_8h_source.html b/realtime_8h_source.html new file mode 100644 index 00000000..2f25ce2e --- /dev/null +++ b/realtime_8h_source.html @@ -0,0 +1,153 @@ + + + + + + + +vulp: vulp/utils/realtime.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    realtime.h
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    +
    4 #pragma once
    +
    5 
    +
    6 #include <sched.h>
    +
    7 #include <sys/mman.h>
    +
    8 
    +
    9 #include <stdexcept>
    +
    10 
    +
    11 #ifdef __APPLE__
    +
    12 #include <spdlog/spdlog.h>
    +
    13 #endif
    +
    14 
    +
    15 namespace vulp::utils {
    +
    16 
    +
    23 inline void configure_cpu(int cpu) {
    +
    24 #ifndef __APPLE__
    +
    25  constexpr int kPid = 0; // this thread
    +
    26  cpu_set_t cpuset = {};
    +
    27  CPU_ZERO(&cpuset);
    +
    28  CPU_SET(cpu, &cpuset);
    +
    29  if (::sched_setaffinity(kPid, sizeof(cpu_set_t), &cpuset) < 0) {
    +
    30  throw std::runtime_error("Error setting CPU affinity");
    +
    31  }
    +
    32 #else
    +
    33  spdlog::warn("[configure_cpu] This function does nothing on macOS");
    +
    34 #endif
    +
    35 }
    +
    36 
    +
    45 inline void configure_scheduler(int priority) {
    +
    46 #ifndef __APPLE__
    +
    47  constexpr int kPid = 0; // this thread
    +
    48  struct sched_param params = {};
    +
    49  params.sched_priority = priority;
    +
    50  if (::sched_setscheduler(kPid, SCHED_RR, &params) < 0) {
    +
    51  throw std::runtime_error(
    +
    52  "Error setting realtime scheduler, try running as root (use sudo)");
    +
    53  }
    +
    54 #else
    +
    55  spdlog::warn("[configure_scheduler] This function does nothing on macOS");
    +
    56 #endif
    +
    57 }
    +
    58 
    +
    63 inline bool lock_memory() {
    +
    64  return (::mlockall(MCL_CURRENT | MCL_FUTURE) >= 0);
    +
    65 }
    +
    66 
    +
    67 } // namespace vulp::utils
    +
    Utility functions.
    Definition: __init__.py:1
    +
    void configure_scheduler(int priority)
    Configure the scheduler policy to round-robin for this thread.
    Definition: realtime.h:45
    +
    void configure_cpu(int cpu)
    Set the current thread to run on a given CPU core.
    Definition: realtime.h:23
    +
    bool lock_memory()
    Lock all memory to RAM so that the kernel doesn't page it to swap.
    Definition: realtime.h:63
    +
    +
    + + + + diff --git a/request_8py.html b/request_8py.html new file mode 100644 index 00000000..50065612 --- /dev/null +++ b/request_8py.html @@ -0,0 +1,117 @@ + + + + + + + +vulp: vulp/spine/request.py File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    request.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  vulp.spine.request.Request
     Flag set by the agent to request an operation from the spine. More...
     
    + + + +

    +Namespaces

     vulp.spine.request
     
    +
    +
    + + + + diff --git a/request_8py_source.html b/request_8py_source.html new file mode 100644 index 00000000..9a17ae9b --- /dev/null +++ b/request_8py_source.html @@ -0,0 +1,125 @@ + + + + + + + +vulp: vulp/spine/request.py Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    request.py
    +
    +
    +Go to the documentation of this file.
    1 #!/usr/bin/env python3
    +
    2 # -*- coding: utf-8 -*-
    +
    3 #
    +
    4 # SPDX-License-Identifier: Apache-2.0
    +
    5 # Copyright 2022 Stéphane Caron
    +
    6 
    +
    7 from enum import IntEnum
    +
    8 
    +
    9 
    +
    10 class Request(IntEnum):
    +
    11 
    +
    12  """!
    +
    13  Flag set by the agent to request an operation from the spine.
    +
    14 
    +
    15  Once the spine has processed the request, it resets the flag to @ref kNone
    +
    16  in shared memory.
    +
    17  """
    +
    18 
    +
    19  kNone = 0 # no active request
    +
    20  kObservation = 1
    +
    21  kAction = 2
    +
    22  kStart = 3
    +
    23  kStop = 4
    +
    24  kError = 5 # last request was invalid
    +
    Flag set by the agent to request an operation from the spine.
    Definition: request.py:10
    +
    +
    + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 00000000..e1ad0fe3 --- /dev/null +++ b/resize.js @@ -0,0 +1,140 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initResizable() +{ + var cookie_namespace = 'doxygen'; + var sidenav,navtree,content,header,collapsed,collapsedWidth=0,barWidth=6,desktop_vp=768,titleHeight; + + function readCookie(cookie) + { + var myCookie = cookie_namespace+"_"+cookie+"="; + if (document.cookie) { + var index = document.cookie.indexOf(myCookie); + if (index != -1) { + var valStart = index + myCookie.length; + var valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + var val = document.cookie.substring(valStart, valEnd); + return val; + } + } + return 0; + } + + function writeCookie(cookie, val, expiration) + { + if (val==undefined) return; + if (expiration == null) { + var date = new Date(); + date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week + expiration = date.toGMTString(); + } + document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/"; + } + + function resizeWidth() + { + var windowWidth = $(window).width() + "px"; + var sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + writeCookie('width',sidenavWidth-barWidth, null); + } + + function restoreWidth(navWidth) + { + var windowWidth = $(window).width() + "px"; + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight() + { + var headerHeight = header.outerHeight(); + var footerHeight = footer.outerHeight(); + var windowHeight = $(window).height() - headerHeight - footerHeight; + content.css({height:windowHeight + "px"}); + navtree.css({height:windowHeight + "px"}); + sidenav.css({height:windowHeight + "px"}); + var width=$(window).width(); + if (width!=collapsedWidth) { + if (width=desktop_vp) { + if (!collapsed) { + collapseExpand(); + } + } else if (width>desktop_vp && collapsedWidth0) { + restoreWidth(0); + collapsed=true; + } + else { + var width = readCookie('width'); + if (width>200 && width<$(window).width()) { restoreWidth(width); } else { restoreWidth(200); } + collapsed=false; + } + } + + header = $("#top"); + sidenav = $("#side-nav"); + content = $("#doc-content"); + navtree = $("#nav-tree"); + footer = $("#nav-path"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + $(window).resize(function() { resizeHeight(); }); + var device = navigator.userAgent.toLowerCase(); + var touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + var width = readCookie('width'); + if (width) { restoreWidth(width); } else { resizeWidth(); } + resizeHeight(); + var url = location.href; + var i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + var _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/resolution_8h.html b/resolution_8h.html new file mode 100644 index 00000000..fc10fa42 --- /dev/null +++ b/resolution_8h.html @@ -0,0 +1,153 @@ + + + + + + + +vulp: vulp/actuation/resolution.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    resolution.h File Reference
    +
    +
    +
    #include "vulp/actuation/moteus/PositionResolution.h"
    +#include "vulp/actuation/moteus/QueryCommand.h"
    +
    +Include dependency graph for resolution.h:
    +
    +
    + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + +

    +Namespaces

     vulp
     
     vulp::actuation
     Send actions to actuators or simulators.
     
    + + + + + + + +

    +Functions

    actuation::moteus::QueryCommand vulp::actuation::get_query_resolution ()
     Query resolution settings for all servo commands. More...
     
    actuation::moteus::PositionResolution vulp::actuation::get_position_resolution ()
     Resolution settings for all servo commands. More...
     
    +
    +
    + + + + diff --git a/resolution_8h.js b/resolution_8h.js new file mode 100644 index 00000000..bbaaafe1 --- /dev/null +++ b/resolution_8h.js @@ -0,0 +1,5 @@ +var resolution_8h = +[ + [ "get_position_resolution", "resolution_8h.html#ac48c5992ecb62d9c23d2970d3408afdd", null ], + [ "get_query_resolution", "resolution_8h.html#a5ee46598099be18d955806e127b76a38", null ] +]; \ No newline at end of file diff --git a/resolution_8h__dep__incl.map b/resolution_8h__dep__incl.map new file mode 100644 index 00000000..8f8ef14a --- /dev/null +++ b/resolution_8h__dep__incl.map @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/resolution_8h__dep__incl.md5 b/resolution_8h__dep__incl.md5 new file mode 100644 index 00000000..6294be2c --- /dev/null +++ b/resolution_8h__dep__incl.md5 @@ -0,0 +1 @@ +7bf0402fc1427b0c147cf8a3de219435 \ No newline at end of file diff --git a/resolution_8h__dep__incl.png b/resolution_8h__dep__incl.png new file mode 100644 index 00000000..66ba828b Binary files /dev/null and b/resolution_8h__dep__incl.png differ diff --git a/resolution_8h__incl.map b/resolution_8h__incl.map new file mode 100644 index 00000000..e1e57ea7 --- /dev/null +++ b/resolution_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/resolution_8h__incl.md5 b/resolution_8h__incl.md5 new file mode 100644 index 00000000..32274c06 --- /dev/null +++ b/resolution_8h__incl.md5 @@ -0,0 +1 @@ +9f71f74417326912e164b48639beedd7 \ No newline at end of file diff --git a/resolution_8h__incl.png b/resolution_8h__incl.png new file mode 100644 index 00000000..94d1cee8 Binary files /dev/null and b/resolution_8h__incl.png differ diff --git a/resolution_8h_source.html b/resolution_8h_source.html new file mode 100644 index 00000000..7aae9794 --- /dev/null +++ b/resolution_8h_source.html @@ -0,0 +1,144 @@ + + + + + + + +vulp: vulp/actuation/resolution.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    resolution.h
    +
    +
    +Go to the documentation of this file.
    1 // SPDX-License-Identifier: Apache-2.0
    +
    2 // Copyright 2022 Stéphane Caron
    +
    3 
    +
    4 #pragma once
    +
    5 
    +
    6 #include "vulp/actuation/moteus/PositionResolution.h"
    +
    7 #include "vulp/actuation/moteus/QueryCommand.h"
    +
    8 
    +
    9 namespace vulp::actuation {
    +
    10 
    +
    18 inline actuation::moteus::QueryCommand get_query_resolution() {
    +
    19  using actuation::moteus::Resolution;
    +
    20  actuation::moteus::QueryCommand query;
    +
    21  query.mode = Resolution::kInt16;
    +
    22  query.position = Resolution::kInt32;
    +
    23  query.velocity = Resolution::kInt32;
    +
    24  query.torque = Resolution::kInt32;
    +
    25  query.q_current = Resolution::kIgnore;
    +
    26  query.d_current = Resolution::kIgnore;
    +
    27  query.rezero_state = Resolution::kIgnore;
    +
    28  query.voltage = Resolution::kInt8;
    +
    29  query.temperature = Resolution::kInt8;
    +
    30  query.fault = Resolution::kInt8;
    +
    31  return query;
    +
    32 }
    +
    33 
    +
    41 inline actuation::moteus::PositionResolution get_position_resolution() {
    +
    42  using actuation::moteus::Resolution;
    +
    43  actuation::moteus::PositionResolution resolution;
    +
    44  resolution.position = Resolution::kFloat;
    +
    45  resolution.velocity = Resolution::kFloat;
    +
    46  resolution.feedforward_torque = Resolution::kIgnore;
    +
    47  resolution.kp_scale = Resolution::kFloat;
    +
    48  resolution.kd_scale = Resolution::kFloat;
    +
    49  resolution.maximum_torque = Resolution::kFloat;
    +
    50  resolution.stop_position = Resolution::kIgnore;
    +
    51  resolution.watchdog_timeout = Resolution::kIgnore;
    +
    52  return resolution;
    +
    53 }
    +
    54 
    +
    55 } // namespace vulp::actuation
    +
    Send actions to actuators or simulators.
    Definition: bullet_utils.h:13
    +
    actuation::moteus::QueryCommand get_query_resolution()
    Query resolution settings for all servo commands.
    Definition: resolution.h:18
    +
    actuation::moteus::PositionResolution get_position_resolution()
    Resolution settings for all servo commands.
    Definition: resolution.h:41
    +
    +
    + + + + diff --git a/search/all_0.html b/search/all_0.html new file mode 100644 index 00000000..1ec5b2d5 --- /dev/null +++ b/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 00000000..7211b7cf --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['_5f_5fdel_5f_5f_0',['__del__',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a63d8286efc24e65ba6a63667d7e54ecc',1,'vulp::spine::spine_interface::SpineInterface']]], + ['_5f_5finit_5f_5f_1',['__init__',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a66b1bc70850b8e120c2a0df6cc1775a7',1,'vulp::spine::spine_interface::SpineInterface']]], + ['_5f_5finit_5f_5f_2epy_2',['__init__.py',['../spine_2____init_____8py.html',1,'(Global Namespace)'],['../utils_2____init_____8py.html',1,'(Global Namespace)']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 00000000..9f80e904 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 00000000..e9ae1126 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['a_3',['A',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29',1,'vulp::observation::sources']]], + ['act_4',['act',['../classvulp_1_1control_1_1Controller.html#a67d54fc3c74f0464f1685d8d2640f9e0',1,'vulp::control::Controller']]], + ['actuation_5f_5',['actuation_',['../classvulp_1_1spine_1_1Spine.html#ac5140f68adf3ad4a1db44aecf7e5b74b',1,'vulp::spine::Spine']]], + ['actuation_5foutput_5f_6',['actuation_output_',['../classvulp_1_1spine_1_1Spine.html#a0cdd75b5375864a16dc3acd7bc662e8a',1,'vulp::spine::Spine']]], + ['add_5fservo_7',['add_servo',['../classvulp_1_1actuation_1_1ServoLayout.html#a5a77916f9ec8ffe722ce5b3fcacf2097',1,'vulp::actuation::ServoLayout']]], + ['agent_5finterface_5f_8',['agent_interface_',['../classvulp_1_1spine_1_1Spine.html#a00d150f97b2ede19b540f2b554dc2ded',1,'vulp::spine::Spine']]], + ['agentinterface_9',['AgentInterface',['../classvulp_1_1spine_1_1AgentInterface.html#ae188b4cdae97d1556b0f19cf3780cc6e',1,'vulp.spine::AgentInterface::AgentInterface()'],['../classvulp_1_1spine_1_1AgentInterface.html',1,'vulp.spine::AgentInterface']]], + ['agentinterface_2ecpp_10',['AgentInterface.cpp',['../AgentInterface_8cpp.html',1,'']]], + ['agentinterface_2eh_11',['AgentInterface.h',['../AgentInterface_8h.html',1,'']]], + ['allocate_5ffile_12',['allocate_file',['../namespacevulp_1_1spine.html#a8f9f5a5899f507ebe75f4a033e9c1a8f',1,'vulp::spine']]], + ['angular_5fvelocity_5fbase_5fin_5fbase_13',['angular_velocity_base_in_base',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab780b0fcbc751d13b2d5ad7ede7287c8',1,'vulp::actuation::BulletInterface::Parameters::angular_velocity_base_in_base()'],['../classvulp_1_1actuation_1_1BulletInterface.html#a22a4561f736e47fd10838e33e3eea76f',1,'vulp::actuation::BulletInterface::angular_velocity_base_in_base()']]], + ['angular_5fvelocity_5fimu_5fin_5fimu_14',['angular_velocity_imu_in_imu',['../structvulp_1_1actuation_1_1ImuData.html#af0388ff114c843cc5daf4b8d0f902947',1,'vulp::actuation::ImuData']]], + ['append_5fobserver_15',['append_observer',['../classvulp_1_1observation_1_1ObserverPipeline.html#ae2efd5d24271fca7cb053f9732df050f',1,'vulp::observation::ObserverPipeline']]], + ['argv0_16',['argv0',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ada0f9a2c0ee7a3a7fca7308ac3cf12a1',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/all_10.html b/search/all_10.html new file mode 100644 index 00000000..3bf11961 --- /dev/null +++ b/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 00000000..ba738575 --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['parameters_161',['Parameters',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a71e309bd3ceb8c7c19bcef4fcdd40cab',1,'vulp::actuation::BulletInterface::Parameters::Parameters(const Dictionary &config)'],['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab4144bd528ea4d7fce753a80f8f2a998',1,'vulp::actuation::BulletInterface::Parameters::Parameters()=default'],['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html',1,'vulp::actuation::BulletInterface::Parameters'],['../structvulp_1_1spine_1_1Spine_1_1Parameters.html',1,'vulp.spine::Spine::Parameters']]], + ['performanceissue_162',['PerformanceIssue',['../classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html',1,'vulp::spine::exceptions']]], + ['pi3hat_163',['Pi3Hat',['../namespacevulp_1_1actuation.html#ab2b376daf35eae21e48708f9b3f63460',1,'vulp::actuation']]], + ['pi3hatinterface_164',['Pi3HatInterface',['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a996e787fffa3e114248c62554a82ea6c',1,'vulp::actuation::Pi3HatInterface::Pi3HatInterface()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html',1,'vulp::actuation::Pi3HatInterface']]], + ['pi3hatinterface_2ecpp_165',['Pi3HatInterface.cpp',['../Pi3HatInterface_8cpp.html',1,'']]], + ['pi3hatinterface_2eh_166',['Pi3HatInterface.h',['../Pi3HatInterface_8h.html',1,'']]], + ['position_5fbase_5fin_5fworld_167',['position_base_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#abdb2f8b2389319f7f266df01007c995d',1,'vulp::actuation::BulletInterface::Parameters']]], + ['prefix_168',['prefix',['../classvulp_1_1observation_1_1HistoryObserver.html#a9786400be17a5a9f6e1ca34016c27ad7',1,'vulp::observation::HistoryObserver::prefix()'],['../classvulp_1_1observation_1_1Observer.html#a3fd28e0a2aa049f4a6a1e3a7a447ab60',1,'vulp::observation::Observer::prefix()'],['../classvulp_1_1observation_1_1Source.html#aff5c8426054622d7da7b6d023f77d40a',1,'vulp::observation::Source::prefix()'],['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a1f42b9ef3a86dd27c01d5df9c4a2d979',1,'vulp::observation::sources::CpuTemperature::prefix()'],['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a0af1bb65e8e8c27563bebdc2e80951a9',1,'vulp::observation::sources::Joystick::prefix()'],['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a74f9aafe3336163bca381653b8db911e',1,'vulp::observation::sources::Keyboard::prefix()']]], + ['present_169',['present',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a42caa70abe49b65862a960efaff0d624',1,'vulp::observation::sources::Joystick']]], + ['process_5fevent_170',['process_event',['../classvulp_1_1spine_1_1StateMachine.html#a44d4c72635480d0f4c9574d4a9833e5c',1,'vulp::spine::StateMachine']]] +]; diff --git a/search/all_11.html b/search/all_11.html new file mode 100644 index 00000000..c9f79d28 --- /dev/null +++ b/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 00000000..4d22526d --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['random_5fstring_171',['random_string',['../namespacevulp_1_1utils.html#a6c6306957ebd97c6d0682112514a4fe7',1,'vulp::utils']]], + ['random_5fstring_2eh_172',['random_string.h',['../random__string_8h.html',1,'']]], + ['read_173',['read',['../classvulp_1_1observation_1_1HistoryObserver.html#ad4b85e8cdf7f4b9b35e93ec062f2d712',1,'vulp::observation::HistoryObserver::read()'],['../classvulp_1_1observation_1_1Observer.html#a547821509ce1dffd57dccfca3e357b34',1,'vulp::observation::Observer::read()']]], + ['read_5fimu_5fdata_174',['read_imu_data',['../namespacevulp_1_1actuation.html#a17c7faa08c40ba9298774b4da1c86edb',1,'vulp::actuation']]], + ['readme_2emd_175',['README.md',['../README_8md.html',1,'']]], + ['realtime_2eh_176',['realtime.h',['../realtime_8h.html',1,'']]], + ['replies_177',['replies',['../classvulp_1_1actuation_1_1Interface.html#ac2ef0cf7b5e03256826df43fdde67923',1,'vulp::actuation::Interface']]], + ['request_178',['Request',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1',1,'vulp::spine']]], + ['request_179',['request',['../classvulp_1_1spine_1_1AgentInterface.html#afbe5e2c09cd343f179dcc7a97a3228b3',1,'vulp::spine::AgentInterface']]], + ['request_180',['Request',['../classvulp_1_1spine_1_1request_1_1Request.html',1,'vulp::spine::request']]], + ['request_2eh_181',['Request.h',['../Request_8h.html',1,'']]], + ['request_2epy_182',['request.py',['../request_8py.html',1,'']]], + ['reset_183',['reset',['../classvulp_1_1observation_1_1HistoryObserver.html#ad14642b0057573baf2ef01db21b3eb42',1,'vulp::observation::HistoryObserver::reset()'],['../classvulp_1_1spine_1_1Spine.html#a422e9d2f95cf562a05dc994a9385c188',1,'vulp.spine::Spine::reset()'],['../classvulp_1_1observation_1_1ObserverPipeline.html#a411a57b496f55b29070781481b2fd34b',1,'vulp::observation::ObserverPipeline::reset()'],['../classvulp_1_1observation_1_1Observer.html#a220adebd86175a8da2890f14e0fb3d65',1,'vulp::observation::Observer::reset()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html#ae6868c0cb7bdcb5dd16bbcd6bd8a6214',1,'vulp::actuation::Pi3HatInterface::reset()'],['../classvulp_1_1actuation_1_1MockInterface.html#a2e52d2e397d8e0bab2af4f1851f447c3',1,'vulp::actuation::MockInterface::reset()'],['../classvulp_1_1actuation_1_1Interface.html#a6a235100e7e6a7edc3b447ccdd86e71b',1,'vulp::actuation::Interface::reset()'],['../classvulp_1_1actuation_1_1BulletInterface.html#a11efda56b80d0f7fa19616f825ba977e',1,'vulp::actuation::BulletInterface::reset(const Dictionary &config) override']]], + ['reset_5fbase_5fstate_184',['reset_base_state',['../classvulp_1_1actuation_1_1BulletInterface.html#ae739f74f3dcb9316ca97840f5e5cab1a',1,'vulp::actuation::BulletInterface']]], + ['reset_5fcontact_5fdata_185',['reset_contact_data',['../classvulp_1_1actuation_1_1BulletInterface.html#a67388fea7cb1806923cae8db9fa32374',1,'vulp::actuation::BulletInterface']]], + ['reset_5fjoint_5fangles_186',['reset_joint_angles',['../classvulp_1_1actuation_1_1BulletInterface.html#a3e8cb3fe8ce7681bd903b6c64889824c',1,'vulp::actuation::BulletInterface']]], + ['reset_5fjoint_5fproperties_187',['reset_joint_properties',['../classvulp_1_1actuation_1_1BulletInterface.html#a4c35888d4d83b4a011e2d3b866591a43',1,'vulp::actuation::BulletInterface']]], + ['resolution_2eh_188',['resolution.h',['../resolution_8h.html',1,'']]], + ['right_189',['RIGHT',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403',1,'vulp::observation::sources']]], + ['right_5fbytes_190',['RIGHT_BYTES',['../Keyboard_8h.html#adeec831a3176c6cfbd9eb8e8f982aa59',1,'Keyboard.h']]], + ['robot_5furdf_5fpath_191',['robot_urdf_path',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a149f12313d0d349d14c084174b4eea5f',1,'vulp::actuation::BulletInterface::Parameters']]], + ['run_192',['run',['../classvulp_1_1observation_1_1ObserverPipeline.html#a56d8e82ec0322066ee77202c6a98f4be',1,'vulp::observation::ObserverPipeline::run()'],['../classvulp_1_1spine_1_1Spine.html#a31497eb1f54c8876a843a00268dce14c',1,'vulp.spine::Spine::run()']]] +]; diff --git a/search/all_12.html b/search/all_12.html new file mode 100644 index 00000000..ab934722 --- /dev/null +++ b/search/all_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 00000000..237d6082 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,43 @@ +var searchData= +[ + ['s_193',['S',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e',1,'vulp::observation::sources']]], + ['serialize_194',['serialize',['../namespacevulp_1_1utils_1_1serialize.html#a0cb702d04af978c6ba56320ecd0068f1',1,'vulp::utils::serialize']]], + ['serialize_2epy_195',['serialize.py',['../serialize_8py.html',1,'']]], + ['servo_5fbus_5fmap_196',['servo_bus_map',['../classvulp_1_1actuation_1_1ServoLayout.html#af5832e2cf2c38680ae5629437a6d8a5e',1,'vulp::actuation::ServoLayout::servo_bus_map()'],['../classvulp_1_1actuation_1_1Interface.html#a030c21ac2fe9fd6e037f1d8c8ab2a287',1,'vulp::actuation::Interface::servo_bus_map()']]], + ['servo_5fjoint_5fmap_197',['servo_joint_map',['../classvulp_1_1actuation_1_1ServoLayout.html#aa8acd7e824f357e25101d8e27a96cbc0',1,'vulp::actuation::ServoLayout::servo_joint_map()'],['../classvulp_1_1actuation_1_1Interface.html#ad8043504a3f4003d353919f664ad38aa',1,'vulp::actuation::Interface::servo_joint_map() const noexcept']]], + ['servo_5flayout_198',['servo_layout',['../classvulp_1_1actuation_1_1Interface.html#a48f6e80769c28910d4d8affb66fc343e',1,'vulp::actuation::Interface']]], + ['servo_5freply_199',['servo_reply',['../classvulp_1_1actuation_1_1BulletInterface.html#a1f7c35df51b913aa85333be81eec2430',1,'vulp::actuation::BulletInterface']]], + ['servolayout_200',['ServoLayout',['../classvulp_1_1actuation_1_1ServoLayout.html',1,'vulp::actuation']]], + ['servolayout_2eh_201',['ServoLayout.h',['../ServoLayout_8h.html',1,'']]], + ['set_5faction_202',['set_action',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a2eb6a040f56937b3c7c0b5aa668fa95e',1,'vulp::spine::spine_interface::SpineInterface']]], + ['set_5frequest_203',['set_request',['../classvulp_1_1spine_1_1AgentInterface.html#a03c363ea6525fc4a52a34690f30b6cf7',1,'vulp::spine::AgentInterface']]], + ['shm_5fname_204',['shm_name',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a4a6d1c2214abf52d3a6d2714fc4526d4',1,'vulp::spine::Spine::Parameters']]], + ['shm_5fsize_205',['shm_size',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a0639895ce6ca39911eaa55b303582258',1,'vulp::spine::Spine::Parameters']]], + ['simulate_206',['simulate',['../classvulp_1_1spine_1_1Spine.html#a5dfa447b98c55c3caca1f06aed23a4dd',1,'vulp::spine::Spine']]], + ['size_207',['size',['../classvulp_1_1actuation_1_1ServoLayout.html#aa913aed179eea813eeb1e0a26e73079c',1,'vulp::actuation::ServoLayout::size()'],['../classvulp_1_1spine_1_1AgentInterface.html#a1c5ed95ec40decdc148a36f433112554',1,'vulp.spine::AgentInterface::size()']]], + ['skip_5fcount_208',['skip_count',['../classvulp_1_1utils_1_1SynchronousClock.html#a44480a4608ae3b5d5a74dcd97a7b8f75',1,'vulp::utils::SynchronousClock']]], + ['slack_209',['slack',['../classvulp_1_1utils_1_1SynchronousClock.html#aca17e08b153c266fc0fd202822ea3194',1,'vulp::utils::SynchronousClock']]], + ['source_210',['Source',['../classvulp_1_1observation_1_1Source.html',1,'vulp::observation']]], + ['source_2eh_211',['Source.h',['../Source_8h.html',1,'']]], + ['sources_212',['sources',['../classvulp_1_1observation_1_1ObserverPipeline.html#a1757b995b52d4061bde1f043ff92ac03',1,'vulp::observation::ObserverPipeline']]], + ['spine_213',['Spine',['../classvulp_1_1spine_1_1Spine.html#af3f09675c956d6c7eeb116210e3fa973',1,'vulp.spine::Spine::Spine()'],['../classvulp_1_1spine_1_1Spine.html',1,'vulp.spine::Spine']]], + ['spine_2ecpp_214',['Spine.cpp',['../Spine_8cpp.html',1,'']]], + ['spine_2eh_215',['Spine.h',['../Spine_8h.html',1,'']]], + ['spine_5finterface_2epy_216',['spine_interface.py',['../spine__interface_8py.html',1,'']]], + ['spineerror_217',['SpineError',['../classvulp_1_1spine_1_1exceptions_1_1SpineError.html',1,'vulp::spine::exceptions']]], + ['spineinterface_218',['SpineInterface',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html',1,'vulp::spine::spine_interface']]], + ['start_219',['start',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a62b07a000db69ac2ade003c34d728b02',1,'vulp::spine::spine_interface::SpineInterface']]], + ['state_220',['State',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673b',1,'vulp::spine']]], + ['state_221',['state',['../classvulp_1_1spine_1_1StateMachine.html#ace23c634b58a586edc4ca244675e29ff',1,'vulp::spine::StateMachine']]], + ['state_5fcycle_5fbeginning_5f_222',['state_cycle_beginning_',['../classvulp_1_1spine_1_1Spine.html#a3a39717160c48c39e6b13fab3f82f036',1,'vulp::spine::Spine']]], + ['state_5fcycle_5fend_5f_223',['state_cycle_end_',['../classvulp_1_1spine_1_1Spine.html#a3cb0cc80e3ee3412f6c84c9cdc87f6aa',1,'vulp::spine::Spine']]], + ['state_5fmachine_5f_224',['state_machine_',['../classvulp_1_1spine_1_1Spine.html#a54ac730b1f049078c57e578373b9d421',1,'vulp::spine::Spine']]], + ['state_5fname_225',['state_name',['../namespacevulp_1_1spine.html#afe7d438605444b816b7d2fb170c87240',1,'vulp::spine']]], + ['statemachine_226',['StateMachine',['../classvulp_1_1spine_1_1StateMachine.html#acc1608eb36870a89aba2f563220819ee',1,'vulp.spine::StateMachine::StateMachine()'],['../classvulp_1_1spine_1_1StateMachine.html',1,'vulp.spine::StateMachine']]], + ['statemachine_2ecpp_227',['StateMachine.cpp',['../StateMachine_8cpp.html',1,'']]], + ['statemachine_2eh_228',['StateMachine.h',['../StateMachine_8h.html',1,'']]], + ['stop_229',['stop',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aec2e958f961ea163d1b1a78a155d3f2a',1,'vulp::spine::spine_interface::SpineInterface']]], + ['synchronousclock_230',['SynchronousClock',['../classvulp_1_1utils_1_1SynchronousClock.html#a68625e8c2ac5ce10018cd3e38f400ebe',1,'vulp.utils::SynchronousClock::SynchronousClock()'],['../classvulp_1_1utils_1_1SynchronousClock.html',1,'vulp.utils::SynchronousClock']]], + ['synchronousclock_2ecpp_231',['SynchronousClock.cpp',['../SynchronousClock_8cpp.html',1,'']]], + ['synchronousclock_2eh_232',['SynchronousClock.h',['../SynchronousClock_8h.html',1,'']]] +]; diff --git a/search/all_13.html b/search/all_13.html new file mode 100644 index 00000000..51172c2f --- /dev/null +++ b/search/all_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 00000000..69935daa --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['torque_5fcontrol_5fkd_233',['torque_control_kd',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a7bfc34eaf6e26490704ed26a8e8eefa9',1,'vulp::actuation::BulletInterface::Parameters']]], + ['torque_5fcontrol_5fkp_234',['torque_control_kp',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af2f8b2aca20f8dea3f9001c961543d1c',1,'vulp::actuation::BulletInterface::Parameters']]], + ['transform_5fbase_5fto_5fworld_235',['transform_base_to_world',['../classvulp_1_1actuation_1_1BulletInterface.html#abca68c25b313ed573f05d7c8a0f0a74f',1,'vulp::actuation::BulletInterface']]] +]; diff --git a/search/all_14.html b/search/all_14.html new file mode 100644 index 00000000..afecf563 --- /dev/null +++ b/search/all_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 00000000..4a4e8eb5 --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['unknown_236',['UNKNOWN',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3',1,'vulp::observation::sources']]], + ['up_237',['UP',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1',1,'vulp::observation::sources']]], + ['up_5fbytes_238',['UP_BYTES',['../Keyboard_8h.html#a391c665c8ffd7ddd3a8fbca4aaf58225',1,'Keyboard.h']]] +]; diff --git a/search/all_15.html b/search/all_15.html new file mode 100644 index 00000000..69f382b3 --- /dev/null +++ b/search/all_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_15.js b/search/all_15.js new file mode 100644 index 00000000..e68ec0d0 --- /dev/null +++ b/search/all_15.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['actuation_239',['actuation',['../namespacevulp_1_1actuation.html',1,'vulp']]], + ['control_240',['control',['../namespacevulp_1_1control.html',1,'vulp']]], + ['default_5faction_241',['default_action',['../namespacevulp_1_1actuation_1_1default__action.html',1,'vulp::actuation']]], + ['exceptions_242',['exceptions',['../namespacevulp_1_1spine_1_1exceptions.html',1,'vulp::spine']]], + ['internal_243',['internal',['../namespacevulp_1_1utils_1_1internal.html',1,'vulp::utils']]], + ['math_244',['math',['../namespacevulp_1_1utils_1_1math.html',1,'vulp::utils']]], + ['observation_245',['observation',['../namespacevulp_1_1observation.html',1,'vulp']]], + ['request_246',['request',['../namespacevulp_1_1spine_1_1request.html',1,'vulp::spine']]], + ['serialize_247',['serialize',['../namespacevulp_1_1utils_1_1serialize.html',1,'vulp::utils']]], + ['sources_248',['sources',['../namespacevulp_1_1observation_1_1sources.html',1,'vulp::observation']]], + ['spine_249',['spine',['../namespacevulp_1_1spine.html',1,'vulp']]], + ['spine_5finterface_250',['spine_interface',['../namespacevulp_1_1spine_1_1spine__interface.html',1,'vulp::spine']]], + ['utils_251',['utils',['../namespacevulp_1_1utils.html',1,'vulp']]], + ['vulp_252',['vulp',['../namespacevulp.html',1,'']]], + ['vulp_20–_20robot_2fsimulation_20switch_253',['Vulp – Robot/simulation switch',['../index.html',1,'']]], + ['vulpexception_254',['VulpException',['../classvulp_1_1spine_1_1exceptions_1_1VulpException.html',1,'vulp::spine::exceptions']]] +]; diff --git a/search/all_16.html b/search/all_16.html new file mode 100644 index 00000000..b19867ad --- /dev/null +++ b/search/all_16.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_16.js b/search/all_16.js new file mode 100644 index 00000000..4f743e80 --- /dev/null +++ b/search/all_16.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['w_255',['W',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276',1,'vulp::observation::sources']]], + ['wait_5ffor_5fnext_5ftick_256',['wait_for_next_tick',['../classvulp_1_1utils_1_1SynchronousClock.html#a8b04ab90ec9ca81016bfed118a0b1a10',1,'vulp::utils::SynchronousClock']]], + ['wait_5ffor_5fshared_5fmemory_257',['wait_for_shared_memory',['../namespacevulp_1_1spine_1_1spine__interface.html#a4c4005d1998a361e6be94accfccae083',1,'vulp::spine::spine_interface']]], + ['working_5fdict_5f_258',['working_dict_',['../classvulp_1_1spine_1_1Spine.html#ad6b50ac8ebf63ef239bcff853125fc81',1,'vulp::spine::Spine']]], + ['write_259',['write',['../classvulp_1_1observation_1_1HistoryObserver.html#ad5cef6b330e2db7c80dcbaec7cf58892',1,'vulp::observation::HistoryObserver::write()'],['../classvulp_1_1observation_1_1Observer.html#ad1187770cd115152300db7ccbe0ad452',1,'vulp::observation::Observer::write()'],['../classvulp_1_1observation_1_1Source.html#a10a52aaca76bb4482c479d528748d037',1,'vulp::observation::Source::write()'],['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63df1f5c11f3d11d60dab2b7401defe1',1,'vulp::observation::sources::CpuTemperature::write()'],['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a8ce565ddf3ab79d790a0b231d5c9456d',1,'vulp::observation::sources::Joystick::write()'],['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a772779999809525853d22389b0ffba0e',1,'vulp::observation::sources::Keyboard::write()'],['../classvulp_1_1spine_1_1AgentInterface.html#a1996190b31a6bf6f9c530107f4cfce50',1,'vulp.spine::AgentInterface::write()']]], + ['write_5fposition_5fcommands_260',['write_position_commands',['../classvulp_1_1actuation_1_1Interface.html#a03bc60526db123752c398595584af95d',1,'vulp::actuation::Interface']]], + ['write_5fstop_5fcommands_261',['write_stop_commands',['../classvulp_1_1actuation_1_1Interface.html#a8cde746cb50f95e7bfbf9dfe718fa443',1,'vulp::actuation::Interface']]] +]; diff --git a/search/all_17.html b/search/all_17.html new file mode 100644 index 00000000..1ad5d34b --- /dev/null +++ b/search/all_17.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_17.js b/search/all_17.js new file mode 100644 index 00000000..9ccb189b --- /dev/null +++ b/search/all_17.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_262',['X',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383',1,'vulp::observation::sources']]] +]; diff --git a/search/all_18.html b/search/all_18.html new file mode 100644 index 00000000..507d0f85 --- /dev/null +++ b/search/all_18.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_18.js b/search/all_18.js new file mode 100644 index 00000000..cb4ed115 --- /dev/null +++ b/search/all_18.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['_7eagentinterface_263',['~AgentInterface',['../classvulp_1_1spine_1_1AgentInterface.html#aa1f13c476e68abb4b9ac4c62269bdf50',1,'vulp::spine::AgentInterface']]], + ['_7ebulletinterface_264',['~BulletInterface',['../classvulp_1_1actuation_1_1BulletInterface.html#a63ab50366c585f45de6ace6a05cd10d8',1,'vulp::actuation::BulletInterface']]], + ['_7ecputemperature_265',['~CpuTemperature',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#ad9726f53ab1e7a3382db4e00279aa26a',1,'vulp::observation::sources::CpuTemperature']]], + ['_7einterface_266',['~Interface',['../classvulp_1_1actuation_1_1Interface.html#a4699195a001a20220ba4606f0bb58274',1,'vulp::actuation::Interface']]], + ['_7ejoystick_267',['~Joystick',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a1d514247fd5f7ed3728a6a5b02c44b48',1,'vulp::observation::sources::Joystick']]], + ['_7ekeyboard_268',['~Keyboard',['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a662c1d7cab92bf282a19463a84340c0f',1,'vulp::observation::sources::Keyboard']]], + ['_7emockinterface_269',['~MockInterface',['../classvulp_1_1actuation_1_1MockInterface.html#a188d0479488241b3f5549c16a2f4daae',1,'vulp::actuation::MockInterface']]], + ['_7eobserver_270',['~Observer',['../classvulp_1_1observation_1_1Observer.html#aedcf4bafa7051d01e5711180738b2ba6',1,'vulp::observation::Observer']]], + ['_7epi3hatinterface_271',['~Pi3HatInterface',['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a7240e06f6198aebe50f0764c4610c511',1,'vulp::actuation::Pi3HatInterface']]], + ['_7esource_272',['~Source',['../classvulp_1_1observation_1_1Source.html#a9c713319a0579c85a702081364bbb2f1',1,'vulp::observation::Source']]] +]; diff --git a/search/all_2.html b/search/all_2.html new file mode 100644 index 00000000..02cfffc2 --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 00000000..145e4739 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['bullet_5ffrom_5feigen_17',['bullet_from_eigen',['../namespacevulp_1_1actuation.html#ac2af057ce6d42297f974e1386b1b34b3',1,'vulp::actuation::bullet_from_eigen(const Eigen::Quaterniond &quat)'],['../namespacevulp_1_1actuation.html#a225ab1b9ea7b3dd97f298768e432246a',1,'vulp::actuation::bullet_from_eigen(const Eigen::Vector3d &v)']]], + ['bullet_5futils_2eh_18',['bullet_utils.h',['../bullet__utils_8h.html',1,'']]], + ['bulletcontactdata_19',['BulletContactData',['../structvulp_1_1actuation_1_1BulletContactData.html',1,'vulp::actuation']]], + ['bulletcontactdata_2eh_20',['BulletContactData.h',['../BulletContactData_8h.html',1,'']]], + ['bulletimudata_21',['BulletImuData',['../structvulp_1_1actuation_1_1BulletImuData.html',1,'vulp::actuation']]], + ['bulletimudata_2eh_22',['BulletImuData.h',['../BulletImuData_8h.html',1,'']]], + ['bulletinterface_23',['BulletInterface',['../classvulp_1_1actuation_1_1BulletInterface.html#ae714260782b6110a5e77030ac8016540',1,'vulp::actuation::BulletInterface::BulletInterface()'],['../classvulp_1_1actuation_1_1BulletInterface.html',1,'vulp::actuation::BulletInterface']]], + ['bulletinterface_2ecpp_24',['BulletInterface.cpp',['../BulletInterface_8cpp.html',1,'']]], + ['bulletinterface_2eh_25',['BulletInterface.h',['../BulletInterface_8h.html',1,'']]], + ['bulletjointproperties_26',['BulletJointProperties',['../structvulp_1_1actuation_1_1BulletJointProperties.html',1,'vulp::actuation']]], + ['bulletjointproperties_2eh_27',['BulletJointProperties.h',['../BulletJointProperties_8h.html',1,'']]], + ['bus_28',['bus',['../classvulp_1_1actuation_1_1ServoLayout.html#aecd67b35fadbcd87c4528a7069f9ae71',1,'vulp::actuation::ServoLayout']]] +]; diff --git a/search/all_3.html b/search/all_3.html new file mode 100644 index 00000000..39767b85 --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 00000000..23c8a426 --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['caught_5finterrupt_5f_29',['caught_interrupt_',['../classvulp_1_1spine_1_1Spine.html#abba8605f39e2d5fec65425980bab7137',1,'vulp::spine::Spine']]], + ['commands_30',['commands',['../classvulp_1_1actuation_1_1Interface.html#ac60af36fb98a8bda3b21d8252c3a1453',1,'vulp::actuation::Interface']]], + ['compute_5fjoint_5ftorque_31',['compute_joint_torque',['../classvulp_1_1actuation_1_1BulletInterface.html#a947d01df9ece4fb48e0a3f48f9d524b0',1,'vulp::actuation::BulletInterface']]], + ['configure_32',['configure',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aeeda8f2c234ee17f55c2aa485ef47d6f',1,'vulp::actuation::BulletInterface::Parameters']]], + ['configure_5fcpu_33',['configure_cpu',['../namespacevulp_1_1utils.html#a647a4a0c11b7b2a5a65c99c77ebd9a54',1,'vulp::utils']]], + ['configure_5fscheduler_34',['configure_scheduler',['../namespacevulp_1_1utils.html#a382e082bfa27731270dfa119bee29d9a',1,'vulp::utils']]], + ['connect_5fsource_35',['connect_source',['../classvulp_1_1observation_1_1ObserverPipeline.html#ab9f3bed18ac04a0e441fd83422f010d4',1,'vulp::observation::ObserverPipeline']]], + ['controller_36',['Controller',['../classvulp_1_1control_1_1Controller.html',1,'vulp::control']]], + ['controller_2eh_37',['Controller.h',['../Controller_8h.html',1,'']]], + ['cpu_38',['cpu',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a64da4f7a8bd34717145d7ac821ddd20d',1,'vulp::spine::Spine::Parameters']]], + ['cputemperature_39',['CpuTemperature',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63cc643a7be79d776747c14b245937fd',1,'vulp::observation::sources::CpuTemperature::CpuTemperature()'],['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html',1,'vulp::observation::sources::CpuTemperature']]], + ['cputemperature_2ecpp_40',['CpuTemperature.cpp',['../CpuTemperature_8cpp.html',1,'']]], + ['cputemperature_2eh_41',['CpuTemperature.h',['../CpuTemperature_8h.html',1,'']]], + ['cycle_42',['cycle',['../classvulp_1_1actuation_1_1BulletInterface.html#a0b08119f9cdb5b36d9ec995dc56df7a5',1,'vulp::actuation::BulletInterface::cycle()'],['../classvulp_1_1actuation_1_1Interface.html#ab9b6fe3cbfd5e58345a1297a97da5de9',1,'vulp::actuation::Interface::cycle()'],['../classvulp_1_1actuation_1_1MockInterface.html#a9aaaa09396d4966948f02e5953d99677',1,'vulp::actuation::MockInterface::cycle()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a7fba7d27e5486cfdefe177b1631989d3',1,'vulp::actuation::Pi3HatInterface::cycle()'],['../classvulp_1_1spine_1_1Spine.html#aa362cc84873d2ffa1359a73efd5441f9',1,'vulp.spine::Spine::cycle()']]] +]; diff --git a/search/all_4.html b/search/all_4.html new file mode 100644 index 00000000..fc40463c --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 00000000..fc5d7dc4 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['d_43',['D',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5',1,'vulp::observation::sources']]], + ['data_44',['data',['../classvulp_1_1actuation_1_1Interface.html#a3bb031735c3cfa22259787b88d63b49b',1,'vulp::actuation::Interface::data()'],['../classvulp_1_1spine_1_1AgentInterface.html#ae530d9f802a29ea464ec4c280a428f6a',1,'vulp.spine::AgentInterface::data()']]], + ['default_5faction_2eh_45',['default_action.h',['../default__action_8h.html',1,'']]], + ['divides_46',['divides',['../namespacevulp_1_1utils_1_1math.html#a8c590daf31618ab64f1f0f044ed81148',1,'vulp::utils::math']]], + ['down_47',['DOWN',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f',1,'vulp::observation::sources']]], + ['down_5fbytes_48',['DOWN_BYTES',['../Keyboard_8h.html#a3e1a7b8e0852d8d31fd8b17e6d82d766',1,'Keyboard.h']]], + ['dt_49',['dt',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5569419c2647379d927567fe26253cc7',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/all_5.html b/search/all_5.html new file mode 100644 index 00000000..9dd9344b --- /dev/null +++ b/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 00000000..5baaf030 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['eigen_5ffrom_5fbullet_50',['eigen_from_bullet',['../namespacevulp_1_1actuation.html#a57658aadbd0ec10129a9692fe4c281f4',1,'vulp::actuation::eigen_from_bullet(const btQuaternion &quat)'],['../namespacevulp_1_1actuation.html#a3b0ac5d01ef820488834702e962bc765',1,'vulp::actuation::eigen_from_bullet(const btVector3 &v)']]], + ['env_5furdf_5fpaths_51',['env_urdf_paths',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#acba555f40d7d6dbd77f3643b84573fb1',1,'vulp::actuation::BulletInterface::Parameters']]], + ['event_52',['Event',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431',1,'vulp::spine']]], + ['exceptions_2epy_53',['exceptions.py',['../exceptions_8py.html',1,'']]] +]; diff --git a/search/all_6.html b/search/all_6.html new file mode 100644 index 00000000..f1e516d7 --- /dev/null +++ b/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 00000000..5b1bd9ac --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['find_5flink_5findex_54',['find_link_index',['../namespacevulp_1_1actuation.html#ae3bf38e32e44b3a353850acb05bbd81a',1,'vulp::actuation']]], + ['find_5fplane_5furdf_55',['find_plane_urdf',['../namespacevulp_1_1actuation.html#aabb66d6b3cd81c772937088266af0829',1,'vulp::actuation']]], + ['floor_56',['floor',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a9e842b4a697299725aa500a6e038238b',1,'vulp::actuation::BulletInterface::Parameters']]], + ['follower_5fcamera_57',['follower_camera',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af5c2135bac4715f7e17f3834f9940d4d',1,'vulp::actuation::BulletInterface::Parameters']]], + ['frequency_58',['frequency',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a5401e120945e5d09eb569d83833c5c44',1,'vulp::spine::Spine::Parameters']]], + ['frequency_5f_59',['frequency_',['../classvulp_1_1spine_1_1Spine.html#a0f3f391aee9e28c9720703e78783d84d',1,'vulp::spine::Spine']]], + ['friction_60',['friction',['../structvulp_1_1actuation_1_1BulletJointProperties.html#ac61ae286b06ef66415212bf8c97bbc56',1,'vulp::actuation::BulletJointProperties']]] +]; diff --git a/search/all_7.html b/search/all_7.html new file mode 100644 index 00000000..8ddbf6c8 --- /dev/null +++ b/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 00000000..36025744 --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['get_5ffirst_5fobservation_61',['get_first_observation',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aca235a9ef5bb357d939d133bc7a1ed43',1,'vulp::spine::spine_interface::SpineInterface']]], + ['get_5fobservation_62',['get_observation',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a38501b691c8efab6eae04853f88bd6a1',1,'vulp::spine::spine_interface::SpineInterface']]], + ['get_5fposition_5fresolution_63',['get_position_resolution',['../namespacevulp_1_1actuation.html#ac48c5992ecb62d9c23d2970d3408afdd',1,'vulp::actuation']]], + ['get_5fquery_5fresolution_64',['get_query_resolution',['../namespacevulp_1_1actuation.html#a5ee46598099be18d955806e127b76a38',1,'vulp::actuation']]], + ['gravity_65',['gravity',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a3dd3900c6fc0d5e0f9d1eaed35888e5a',1,'vulp::actuation::BulletInterface::Parameters']]], + ['gui_66',['gui',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5f8872bb8b7c460ccd28796fda7428c3',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/all_8.html b/search/all_8.html new file mode 100644 index 00000000..83c55ae2 --- /dev/null +++ b/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 00000000..0d8acd55 --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['handle_5finterrupt_67',['handle_interrupt',['../namespacevulp_1_1utils_1_1internal.html#a838e3878c7da2dc06db5168b5ef421b2',1,'vulp::utils::internal']]], + ['handle_5finterrupts_68',['handle_interrupts',['../namespacevulp_1_1utils.html#a78519754b023e10a26052f84229732fa',1,'vulp::utils']]], + ['handle_5finterrupts_2ecpp_69',['handle_interrupts.cpp',['../handle__interrupts_8cpp.html',1,'']]], + ['handle_5finterrupts_2eh_70',['handle_interrupts.h',['../handle__interrupts_8h.html',1,'']]], + ['historyobserver_71',['HistoryObserver',['../classvulp_1_1observation_1_1HistoryObserver.html#a556211d9cb6719e3a044c20ddfd0bb27',1,'vulp::observation::HistoryObserver::HistoryObserver()'],['../classvulp_1_1observation_1_1HistoryObserver.html',1,'vulp::observation::HistoryObserver< T >']]], + ['historyobserver_2eh_72',['HistoryObserver.h',['../HistoryObserver_8h.html',1,'']]] +]; diff --git a/search/all_9.html b/search/all_9.html new file mode 100644 index 00000000..1e263c13 --- /dev/null +++ b/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 00000000..2727534b --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['imudata_73',['ImuData',['../structvulp_1_1actuation_1_1ImuData.html',1,'vulp::actuation']]], + ['imudata_2eh_74',['ImuData.h',['../ImuData_8h.html',1,'']]], + ['initialize_5faction_75',['initialize_action',['../classvulp_1_1actuation_1_1Interface.html#a58633a8bc4024056e0512b23baa78cfa',1,'vulp::actuation::Interface']]], + ['interface_76',['Interface',['../classvulp_1_1actuation_1_1Interface.html#a154834670d82002681360eebf3353279',1,'vulp::actuation::Interface::Interface()'],['../classvulp_1_1actuation_1_1Interface.html',1,'vulp::actuation::Interface']]], + ['interface_2ecpp_77',['Interface.cpp',['../Interface_8cpp.html',1,'']]], + ['interface_2eh_78',['Interface.h',['../Interface_8h.html',1,'']]], + ['interrupt_5fflag_79',['interrupt_flag',['../namespacevulp_1_1utils_1_1internal.html#ac7a04e3bcce477cf05d12ecb651fab6d',1,'vulp::utils::internal']]], + ['ipc_5fbuffer_5f_80',['ipc_buffer_',['../classvulp_1_1spine_1_1Spine.html#a74511847ef40db4668a8a26ddf6916c8',1,'vulp::spine::Spine']]], + ['is_5fdisabled_81',['is_disabled',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#aa480657101c7adb0f59b873a57ad6cd7',1,'vulp::observation::sources::CpuTemperature']]], + ['is_5flowercase_5falpha_82',['is_lowercase_alpha',['../Keyboard_8h.html#a436c4f03139123bc3fe3e764046213c3',1,'Keyboard.h']]], + ['is_5fover_5fafter_5fthis_5fcycle_83',['is_over_after_this_cycle',['../classvulp_1_1spine_1_1StateMachine.html#ae3883e0306f844b7ce6e95fc931e75f3',1,'vulp::spine::StateMachine']]], + ['is_5fprintable_5fascii_84',['is_printable_ascii',['../Keyboard_8h.html#a1f200ef3dbbdfee1673df8bfa3e12901',1,'Keyboard.h']]], + ['is_5fuppercase_5falpha_85',['is_uppercase_alpha',['../Keyboard_8h.html#aa61d4e7c4b5a2d4ad8fc70900fe17cf9',1,'Keyboard.h']]], + ['iterator_86',['iterator',['../classvulp_1_1observation_1_1ObserverPipeline.html#af938c156ac8f8d3b4ad535c3073e2e15',1,'vulp::observation::ObserverPipeline']]] +]; diff --git a/search/all_a.html b/search/all_a.html new file mode 100644 index 00000000..3a6cac10 --- /dev/null +++ b/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 00000000..b18bf474 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['joint_5ffriction_87',['joint_friction',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aa84c7bf26a08e22a0cd3de02eab3b011',1,'vulp::actuation::BulletInterface::Parameters']]], + ['joint_5fname_88',['joint_name',['../classvulp_1_1actuation_1_1ServoLayout.html#a50a75e86d72f40263d8103e4e575ee84',1,'vulp::actuation::ServoLayout']]], + ['joint_5fproperties_89',['joint_properties',['../classvulp_1_1actuation_1_1BulletInterface.html#aebf8c201d8d102e776fbef06283c2cad',1,'vulp::actuation::BulletInterface']]], + ['joystick_90',['Joystick',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#aa29b4d83c0c29179259151aeb891c0aa',1,'vulp::observation::sources::Joystick::Joystick()'],['../classvulp_1_1observation_1_1sources_1_1Joystick.html',1,'vulp::observation::sources::Joystick']]], + ['joystick_2ecpp_91',['Joystick.cpp',['../Joystick_8cpp.html',1,'']]], + ['joystick_2eh_92',['Joystick.h',['../Joystick_8h.html',1,'']]] +]; diff --git a/search/all_b.html b/search/all_b.html new file mode 100644 index 00000000..130deb4e --- /dev/null +++ b/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 00000000..1c4d5165 --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,34 @@ +var searchData= +[ + ['kact_93',['kAct',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb',1,'vulp::spine']]], + ['kaction_94',['kAction',['../classvulp_1_1spine_1_1request_1_1Request.html#af06518ad121dbf2c7da5d252b024327e',1,'vulp.spine.request.Request.kAction()'],['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4',1,'vulp.spine::kAction()']]], + ['kcputemperaturebuffersize_95',['kCpuTemperatureBufferSize',['../namespacevulp_1_1observation_1_1sources.html#a010055692ae8692090553ae85b6f66bc',1,'vulp::observation::sources']]], + ['kcyclebeginning_96',['kCycleBeginning',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b',1,'vulp::spine']]], + ['kcycleend_97',['kCycleEnd',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16',1,'vulp::spine']]], + ['kerror_98',['kError',['../classvulp_1_1spine_1_1request_1_1Request.html#a39b736cb6f976263c659b39e8374cf1f',1,'vulp.spine.request.Request.kError()'],['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97',1,'vulp.spine::kError()']]], + ['key_99',['Key',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422',1,'vulp::observation::sources']]], + ['keyboard_100',['Keyboard',['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a3a397c882016fbb734f2fb445c29d39b',1,'vulp::observation::sources::Keyboard::Keyboard()'],['../classvulp_1_1observation_1_1sources_1_1Keyboard.html',1,'vulp::observation::sources::Keyboard']]], + ['keyboard_2ecpp_101',['Keyboard.cpp',['../Keyboard_8cpp.html',1,'']]], + ['keyboard_2eh_102',['Keyboard.h',['../Keyboard_8h.html',1,'']]], + ['kfeedforwardtorque_103',['kFeedforwardTorque',['../namespacevulp_1_1actuation_1_1default__action.html#acd6b5f4fab30ca4fa011b072eb178db3',1,'vulp::actuation::default_action']]], + ['kidle_104',['kIdle',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b',1,'vulp::spine']]], + ['kinterrupt_105',['kInterrupt',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae',1,'vulp::spine']]], + ['kjoystickdeadband_106',['kJoystickDeadband',['../namespacevulp_1_1observation_1_1sources.html#a7e19b63b7a414ab70c8b9468df93de44',1,'vulp::observation::sources']]], + ['kkdscale_107',['kKdScale',['../namespacevulp_1_1actuation_1_1default__action.html#a37fdf95f3ecb19b772ed1ed45b5864e9',1,'vulp::actuation::default_action']]], + ['kkpscale_108',['kKpScale',['../namespacevulp_1_1actuation_1_1default__action.html#a9b7395da45f48d599f21ac8d53358a02',1,'vulp::actuation::default_action']]], + ['kmaximumtorque_109',['kMaximumTorque',['../namespacevulp_1_1actuation_1_1default__action.html#a162f94f351be65ad299e955232e415aa',1,'vulp::actuation::default_action']]], + ['kmaxkeybytes_110',['kMaxKeyBytes',['../Keyboard_8h.html#aad42040bb8f9fbb2a4e312fca9736ffa',1,'Keyboard.h']]], + ['kmebibytes_111',['kMebibytes',['../namespacevulp_1_1spine.html#a6c2c8dbd236f8d35e2ecac79f165fa29',1,'vulp::spine']]], + ['knbstopcycles_112',['kNbStopCycles',['../namespacevulp_1_1spine.html#a5bc778508b13f1e9e7dd227025a32808',1,'vulp::spine']]], + ['knone_113',['kNone',['../classvulp_1_1spine_1_1request_1_1Request.html#aaac617fc5ed006caa6f9cb8297eb9f91',1,'vulp.spine.request.Request.kNone()'],['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13',1,'vulp.spine::kNone()']]], + ['kobservation_114',['kObservation',['../classvulp_1_1spine_1_1request_1_1Request.html#ae1f87e136fb3b595c41f7966158be82b',1,'vulp.spine.request.Request.kObservation()'],['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28',1,'vulp.spine::kObservation()']]], + ['kobserve_115',['kObserve',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94',1,'vulp::spine']]], + ['kover_116',['kOver',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961',1,'vulp::spine']]], + ['kpollingintervalms_117',['kPollingIntervalMS',['../Keyboard_8h.html#ac524932df3a0d0889f6ef63734eb9b96',1,'Keyboard.h']]], + ['kreset_118',['kReset',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b',1,'vulp::spine']]], + ['ksendstops_119',['kSendStops',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe',1,'vulp::spine']]], + ['kshutdown_120',['kShutdown',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb',1,'vulp::spine']]], + ['kstart_121',['kStart',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d',1,'vulp.spine::kStart()'],['../classvulp_1_1spine_1_1request_1_1Request.html#aa2fe8a1f03bdbafb2f4d57cb4e92cf07',1,'vulp.spine.request.Request.kStart()']]], + ['kstop_122',['kStop',['../classvulp_1_1spine_1_1request_1_1Request.html#a471941bc5357a4c3899adb5b56136b01',1,'vulp.spine.request.Request.kStop()'],['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b',1,'vulp.spine::kStop()']]], + ['kvelocity_123',['kVelocity',['../namespacevulp_1_1actuation_1_1default__action.html#a1f6d1969f4382b8e086bb89c0514760d',1,'vulp::actuation::default_action']]] +]; diff --git a/search/all_c.html b/search/all_c.html new file mode 100644 index 00000000..3dd5af06 --- /dev/null +++ b/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 00000000..15548855 --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['latest_5freplies_5f_124',['latest_replies_',['../classvulp_1_1spine_1_1Spine.html#a961c5ef602634734b6e75e667574e90c',1,'vulp::spine::Spine']]], + ['left_125',['LEFT',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758',1,'vulp::observation::sources']]], + ['left_5fbytes_126',['LEFT_BYTES',['../Keyboard_8h.html#a287b5932e75598bfa911b731d94a1ff2',1,'Keyboard.h']]], + ['linear_5facceleration_5fimu_5fin_5fimu_127',['linear_acceleration_imu_in_imu',['../structvulp_1_1actuation_1_1ImuData.html#ab7f284df90fd038642a2cdcf55165104',1,'vulp::actuation::ImuData']]], + ['linear_5fvelocity_5fbase_5fto_5fworld_5fin_5fworld_128',['linear_velocity_base_to_world_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab1ddd659af5fd3c87bd623663dabbd2d',1,'vulp::actuation::BulletInterface::Parameters::linear_velocity_base_to_world_in_world()'],['../classvulp_1_1actuation_1_1BulletInterface.html#abf3317db63b1cf38d7da86e0efd7b5e1',1,'vulp::actuation::BulletInterface::linear_velocity_base_to_world_in_world()']]], + ['linear_5fvelocity_5fimu_5fin_5fworld_129',['linear_velocity_imu_in_world',['../structvulp_1_1actuation_1_1BulletImuData.html#a7f574fca8e18c6351fd502aa700240cc',1,'vulp::actuation::BulletImuData']]], + ['lock_5fmemory_130',['lock_memory',['../namespacevulp_1_1utils.html#ae34f759b79aecb082475a33f8d67045e',1,'vulp::utils']]], + ['log_5fpath_131',['log_path',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#adac3276df5a55e141b0820d13d30118f',1,'vulp::spine::Spine::Parameters']]], + ['logger_5f_132',['logger_',['../classvulp_1_1spine_1_1Spine.html#a0060f951f291ff3f707393e7d2563e36',1,'vulp::spine::Spine']]], + ['low_5fpass_5ffilter_133',['low_pass_filter',['../namespacevulp_1_1utils.html#a82e8f66ca7a05a1fe40afeac8cfea205',1,'vulp::utils']]], + ['low_5fpass_5ffilter_2eh_134',['low_pass_filter.h',['../low__pass__filter_8h.html',1,'']]] +]; diff --git a/search/all_d.html b/search/all_d.html new file mode 100644 index 00000000..af7f2f0f --- /dev/null +++ b/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 00000000..bf22b397 --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['math_2eh_135',['math.h',['../math_8h.html',1,'']]], + ['maximum_5ftorque_136',['maximum_torque',['../structvulp_1_1actuation_1_1BulletJointProperties.html#a3af3193c4278dbdb8f9983239ef67b9d',1,'vulp::actuation::BulletJointProperties']]], + ['measured_5fperiod_137',['measured_period',['../classvulp_1_1utils_1_1SynchronousClock.html#a38f9298dd6d373b8930416ae3146f4de',1,'vulp::utils::SynchronousClock']]], + ['mockinterface_138',['MockInterface',['../classvulp_1_1actuation_1_1MockInterface.html#a0e5220c878595c959f26f51dbba9c078',1,'vulp::actuation::MockInterface::MockInterface()'],['../classvulp_1_1actuation_1_1MockInterface.html',1,'vulp::actuation::MockInterface']]], + ['mockinterface_2ecpp_139',['MockInterface.cpp',['../MockInterface_8cpp.html',1,'']]], + ['mockinterface_2eh_140',['MockInterface.h',['../MockInterface_8h.html',1,'']]], + ['monitor_5fcontacts_141',['monitor_contacts',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aae8ee9b622e192f083fa7cc10d869ff6',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/all_e.html b/search/all_e.html new file mode 100644 index 00000000..e25df423 --- /dev/null +++ b/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 00000000..037f10e0 --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['nb_5fobservers_142',['nb_observers',['../classvulp_1_1observation_1_1ObserverPipeline.html#a98385c29632eef6f1edc9e6e1ed58f36',1,'vulp::observation::ObserverPipeline']]], + ['nb_5fsources_143',['nb_sources',['../classvulp_1_1observation_1_1ObserverPipeline.html#aac2989ab99989a92a77d7e1125a0c152',1,'vulp::observation::ObserverPipeline']]], + ['none_144',['NONE',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693',1,'vulp::observation::sources']]], + ['num_5fcontact_5fpoints_145',['num_contact_points',['../structvulp_1_1actuation_1_1BulletContactData.html#ad28b8a81095edc4f3975e7b44ccd67a3',1,'vulp::actuation::BulletContactData']]] +]; diff --git a/search/all_f.html b/search/all_f.html new file mode 100644 index 00000000..b23da6ce --- /dev/null +++ b/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 00000000..3d55f441 --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['observe_146',['observe',['../classvulp_1_1actuation_1_1Pi3HatInterface.html#abdec83204cb8b1bd51333d5d62f89293',1,'vulp::actuation::Pi3HatInterface::observe()'],['../classvulp_1_1actuation_1_1MockInterface.html#a790e57ed6a6157044ae70c3e59d9967e',1,'vulp::actuation::MockInterface::observe()'],['../classvulp_1_1actuation_1_1Interface.html#ac5f1fd525398a0a0d290ee2aed26c66f',1,'vulp::actuation::Interface::observe()'],['../classvulp_1_1actuation_1_1BulletInterface.html#aa6e175ab2ded82e0c2e4c0e849e67b51',1,'vulp::actuation::BulletInterface::observe()']]], + ['observe_5fservos_147',['observe_servos',['../namespacevulp_1_1observation.html#a0ae2b75955060fe39559b2b05f6997ed',1,'vulp::observation::observe_servos(palimpsest::Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< actuation::moteus::ServoReply > &servo_replies)'],['../namespacevulp_1_1observation.html#ad2218a79b5b3865746e23d5579f97585',1,'vulp::observation::observe_servos(Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)']]], + ['observe_5fservos_2ecpp_148',['observe_servos.cpp',['../observe__servos_8cpp.html',1,'']]], + ['observe_5fservos_2eh_149',['observe_servos.h',['../observe__servos_8h.html',1,'']]], + ['observe_5ftime_150',['observe_time',['../namespacevulp_1_1observation.html#a91251ac7479e0efd644cbd763d66d5ea',1,'vulp::observation']]], + ['observe_5ftime_2eh_151',['observe_time.h',['../observe__time_8h.html',1,'']]], + ['observer_152',['Observer',['../classvulp_1_1observation_1_1Observer.html',1,'vulp::observation']]], + ['observer_2eh_153',['Observer.h',['../Observer_8h.html',1,'']]], + ['observer_5fpipeline_5f_154',['observer_pipeline_',['../classvulp_1_1spine_1_1Spine.html#a5aae68ebd2f703f2c2dfdeb54f99c0a5',1,'vulp::spine::Spine']]], + ['observerpipeline_155',['ObserverPipeline',['../classvulp_1_1observation_1_1ObserverPipeline.html',1,'vulp::observation']]], + ['observerpipeline_2ecpp_156',['ObserverPipeline.cpp',['../ObserverPipeline_8cpp.html',1,'']]], + ['observerpipeline_2eh_157',['ObserverPipeline.h',['../ObserverPipeline_8h.html',1,'']]], + ['observers_158',['observers',['../classvulp_1_1observation_1_1ObserverPipeline.html#a5137ef162e96278c44a05b146115c17b',1,'vulp::observation::ObserverPipeline']]], + ['orientation_5fbase_5fin_5fworld_159',['orientation_base_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab6c2a786fa1a05366e2478920f91503a',1,'vulp::actuation::BulletInterface::Parameters']]], + ['orientation_5fimu_5fin_5fars_160',['orientation_imu_in_ars',['../structvulp_1_1actuation_1_1ImuData.html#a044618ce2e107e6c3b9372da39b69efe',1,'vulp::actuation::ImuData']]] +]; diff --git a/search/classes_0.html b/search/classes_0.html new file mode 100644 index 00000000..af8159ee --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 00000000..5e3b8c77 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['agentinterface_273',['AgentInterface',['../classvulp_1_1spine_1_1AgentInterface.html',1,'vulp::spine']]] +]; diff --git a/search/classes_1.html b/search/classes_1.html new file mode 100644 index 00000000..576e9168 --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 00000000..f8c39b07 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['bulletcontactdata_274',['BulletContactData',['../structvulp_1_1actuation_1_1BulletContactData.html',1,'vulp::actuation']]], + ['bulletimudata_275',['BulletImuData',['../structvulp_1_1actuation_1_1BulletImuData.html',1,'vulp::actuation']]], + ['bulletinterface_276',['BulletInterface',['../classvulp_1_1actuation_1_1BulletInterface.html',1,'vulp::actuation']]], + ['bulletjointproperties_277',['BulletJointProperties',['../structvulp_1_1actuation_1_1BulletJointProperties.html',1,'vulp::actuation']]] +]; diff --git a/search/classes_2.html b/search/classes_2.html new file mode 100644 index 00000000..956405e5 --- /dev/null +++ b/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_2.js b/search/classes_2.js new file mode 100644 index 00000000..c65b5513 --- /dev/null +++ b/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['controller_278',['Controller',['../classvulp_1_1control_1_1Controller.html',1,'vulp::control']]], + ['cputemperature_279',['CpuTemperature',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html',1,'vulp::observation::sources']]] +]; diff --git a/search/classes_3.html b/search/classes_3.html new file mode 100644 index 00000000..d33343bc --- /dev/null +++ b/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_3.js b/search/classes_3.js new file mode 100644 index 00000000..3b00a998 --- /dev/null +++ b/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['historyobserver_280',['HistoryObserver',['../classvulp_1_1observation_1_1HistoryObserver.html',1,'vulp::observation']]] +]; diff --git a/search/classes_4.html b/search/classes_4.html new file mode 100644 index 00000000..8430b07f --- /dev/null +++ b/search/classes_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_4.js b/search/classes_4.js new file mode 100644 index 00000000..4bc98146 --- /dev/null +++ b/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['imudata_281',['ImuData',['../structvulp_1_1actuation_1_1ImuData.html',1,'vulp::actuation']]], + ['interface_282',['Interface',['../classvulp_1_1actuation_1_1Interface.html',1,'vulp::actuation']]] +]; diff --git a/search/classes_5.html b/search/classes_5.html new file mode 100644 index 00000000..c2f1b767 --- /dev/null +++ b/search/classes_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_5.js b/search/classes_5.js new file mode 100644 index 00000000..0779742d --- /dev/null +++ b/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['joystick_283',['Joystick',['../classvulp_1_1observation_1_1sources_1_1Joystick.html',1,'vulp::observation::sources']]] +]; diff --git a/search/classes_6.html b/search/classes_6.html new file mode 100644 index 00000000..e39847ce --- /dev/null +++ b/search/classes_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_6.js b/search/classes_6.js new file mode 100644 index 00000000..392083e2 --- /dev/null +++ b/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['keyboard_284',['Keyboard',['../classvulp_1_1observation_1_1sources_1_1Keyboard.html',1,'vulp::observation::sources']]] +]; diff --git a/search/classes_7.html b/search/classes_7.html new file mode 100644 index 00000000..a2c4d1a3 --- /dev/null +++ b/search/classes_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_7.js b/search/classes_7.js new file mode 100644 index 00000000..7838351c --- /dev/null +++ b/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mockinterface_285',['MockInterface',['../classvulp_1_1actuation_1_1MockInterface.html',1,'vulp::actuation']]] +]; diff --git a/search/classes_8.html b/search/classes_8.html new file mode 100644 index 00000000..17003e48 --- /dev/null +++ b/search/classes_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_8.js b/search/classes_8.js new file mode 100644 index 00000000..5c8cf639 --- /dev/null +++ b/search/classes_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['observer_286',['Observer',['../classvulp_1_1observation_1_1Observer.html',1,'vulp::observation']]], + ['observerpipeline_287',['ObserverPipeline',['../classvulp_1_1observation_1_1ObserverPipeline.html',1,'vulp::observation']]] +]; diff --git a/search/classes_9.html b/search/classes_9.html new file mode 100644 index 00000000..b8afa8cb --- /dev/null +++ b/search/classes_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_9.js b/search/classes_9.js new file mode 100644 index 00000000..07c2d646 --- /dev/null +++ b/search/classes_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['parameters_288',['Parameters',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html',1,'vulp::actuation::BulletInterface::Parameters'],['../structvulp_1_1spine_1_1Spine_1_1Parameters.html',1,'vulp.spine::Spine::Parameters']]], + ['performanceissue_289',['PerformanceIssue',['../classvulp_1_1spine_1_1exceptions_1_1PerformanceIssue.html',1,'vulp::spine::exceptions']]], + ['pi3hatinterface_290',['Pi3HatInterface',['../classvulp_1_1actuation_1_1Pi3HatInterface.html',1,'vulp::actuation']]] +]; diff --git a/search/classes_a.html b/search/classes_a.html new file mode 100644 index 00000000..6788af27 --- /dev/null +++ b/search/classes_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_a.js b/search/classes_a.js new file mode 100644 index 00000000..be268f2a --- /dev/null +++ b/search/classes_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['request_291',['Request',['../classvulp_1_1spine_1_1request_1_1Request.html',1,'vulp::spine::request']]] +]; diff --git a/search/classes_b.html b/search/classes_b.html new file mode 100644 index 00000000..3fcb4985 --- /dev/null +++ b/search/classes_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_b.js b/search/classes_b.js new file mode 100644 index 00000000..fe5fd397 --- /dev/null +++ b/search/classes_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['servolayout_292',['ServoLayout',['../classvulp_1_1actuation_1_1ServoLayout.html',1,'vulp::actuation']]], + ['source_293',['Source',['../classvulp_1_1observation_1_1Source.html',1,'vulp::observation']]], + ['spine_294',['Spine',['../classvulp_1_1spine_1_1Spine.html',1,'vulp::spine']]], + ['spineerror_295',['SpineError',['../classvulp_1_1spine_1_1exceptions_1_1SpineError.html',1,'vulp::spine::exceptions']]], + ['spineinterface_296',['SpineInterface',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html',1,'vulp::spine::spine_interface']]], + ['statemachine_297',['StateMachine',['../classvulp_1_1spine_1_1StateMachine.html',1,'vulp::spine']]], + ['synchronousclock_298',['SynchronousClock',['../classvulp_1_1utils_1_1SynchronousClock.html',1,'vulp::utils']]] +]; diff --git a/search/classes_c.html b/search/classes_c.html new file mode 100644 index 00000000..2f7b1f3d --- /dev/null +++ b/search/classes_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_c.js b/search/classes_c.js new file mode 100644 index 00000000..f859b83b --- /dev/null +++ b/search/classes_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vulpexception_299',['VulpException',['../classvulp_1_1spine_1_1exceptions_1_1VulpException.html',1,'vulp::spine::exceptions']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 00000000..a933eea1 --- /dev/null +++ b/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/search/enums_0.html b/search/enums_0.html new file mode 100644 index 00000000..141fff57 --- /dev/null +++ b/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enums_0.js b/search/enums_0.js new file mode 100644 index 00000000..39678de6 --- /dev/null +++ b/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['event_535',['Event',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431',1,'vulp::spine']]] +]; diff --git a/search/enums_1.html b/search/enums_1.html new file mode 100644 index 00000000..d29f3b16 --- /dev/null +++ b/search/enums_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enums_1.js b/search/enums_1.js new file mode 100644 index 00000000..75e09395 --- /dev/null +++ b/search/enums_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_536',['Key',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422',1,'vulp::observation::sources']]] +]; diff --git a/search/enums_2.html b/search/enums_2.html new file mode 100644 index 00000000..59aadf2c --- /dev/null +++ b/search/enums_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enums_2.js b/search/enums_2.js new file mode 100644 index 00000000..490d9dba --- /dev/null +++ b/search/enums_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['request_537',['Request',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1',1,'vulp::spine']]] +]; diff --git a/search/enums_3.html b/search/enums_3.html new file mode 100644 index 00000000..87c17443 --- /dev/null +++ b/search/enums_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enums_3.js b/search/enums_3.js new file mode 100644 index 00000000..ab3ad05f --- /dev/null +++ b/search/enums_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['state_538',['State',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673b',1,'vulp::spine']]] +]; diff --git a/search/enumvalues_0.html b/search/enumvalues_0.html new file mode 100644 index 00000000..0d131d95 --- /dev/null +++ b/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_0.js b/search/enumvalues_0.js new file mode 100644 index 00000000..f57f80a1 --- /dev/null +++ b/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['a_539',['A',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a7fc56270e7a70fa81a5935b72eacbe29',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_1.html b/search/enumvalues_1.html new file mode 100644 index 00000000..cd9187ab --- /dev/null +++ b/search/enumvalues_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_1.js b/search/enumvalues_1.js new file mode 100644 index 00000000..5af21c9e --- /dev/null +++ b/search/enumvalues_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['d_540',['D',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422af623e75af30e62bbd73d6df5b50bb7b5',1,'vulp::observation::sources']]], + ['down_541',['DOWN',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ac4e0e4e3118472beeb2ae75827450f1f',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_2.html b/search/enumvalues_2.html new file mode 100644 index 00000000..2b95d920 --- /dev/null +++ b/search/enumvalues_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_2.js b/search/enumvalues_2.js new file mode 100644 index 00000000..148fe4fd --- /dev/null +++ b/search/enumvalues_2.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['kact_542',['kAct',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba1b0998c854703ffb1a393222e660defb',1,'vulp::spine']]], + ['kaction_543',['kAction',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1af399eb8fcbf5333a780a3321ca9fefa4',1,'vulp::spine']]], + ['kcyclebeginning_544',['kCycleBeginning',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a6271e28ff352965b1a52163c2c9c2e2b',1,'vulp::spine']]], + ['kcycleend_545',['kCycleEnd',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a9a0848af36001f2871702e16c321aa16',1,'vulp::spine']]], + ['kerror_546',['kError',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1ae3587c730cc1aa530fa4ddc9c4204e97',1,'vulp::spine']]], + ['kidle_547',['kIdle',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baf5137a026a4b2f3b1c8a21cfc60dd14b',1,'vulp::spine']]], + ['kinterrupt_548',['kInterrupt',['../namespacevulp_1_1spine.html#a7bae69748fb3232300f1e8d212b31431a5226558f5ccca12b5009c9e2f97d50ae',1,'vulp::spine']]], + ['knone_549',['kNone',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a35c3ace1970663a16e5c65baa5941b13',1,'vulp::spine']]], + ['kobservation_550',['kObservation',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a4cf65e46cd2d92869b62939447587a28',1,'vulp::spine']]], + ['kobserve_551',['kObserve',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba83b5da05ca06622e63e18ab850b0dd94',1,'vulp::spine']]], + ['kover_552',['kOver',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673ba274424d4b2847f3476c20fc98440c961',1,'vulp::spine']]], + ['kreset_553',['kReset',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bac372b1b54561a3ca533a61adafccfc8b',1,'vulp::spine']]], + ['ksendstops_554',['kSendStops',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673baa233cf6eb64d27b8feba46dd6cb086fe',1,'vulp::spine']]], + ['kshutdown_555',['kShutdown',['../namespacevulp_1_1spine.html#abbe3763ac890ce29c6435b7f1f30673bae033f7151cb68a6eba0551ad2df506eb',1,'vulp::spine']]], + ['kstart_556',['kStart',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a127f8e8149d57253ad94c9d2c752113d',1,'vulp::spine']]], + ['kstop_557',['kStop',['../namespacevulp_1_1spine.html#a5e74a47513457ef7c8d3d341ca8a28b1a97bebae73e3334ef0c946c5df81e440b',1,'vulp::spine']]] +]; diff --git a/search/enumvalues_3.html b/search/enumvalues_3.html new file mode 100644 index 00000000..bc0ac8a9 --- /dev/null +++ b/search/enumvalues_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_3.js b/search/enumvalues_3.js new file mode 100644 index 00000000..bf2bb8af --- /dev/null +++ b/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['left_558',['LEFT',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a684d325a7303f52e64011467ff5c5758',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_4.html b/search/enumvalues_4.html new file mode 100644 index 00000000..ef94dd8d --- /dev/null +++ b/search/enumvalues_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_4.js b/search/enumvalues_4.js new file mode 100644 index 00000000..0ba5170d --- /dev/null +++ b/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['none_559',['NONE',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422ab50339a10e1de285ac99d4c3990b8693',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_5.html b/search/enumvalues_5.html new file mode 100644 index 00000000..1c2e2f33 --- /dev/null +++ b/search/enumvalues_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_5.js b/search/enumvalues_5.js new file mode 100644 index 00000000..e466bc2a --- /dev/null +++ b/search/enumvalues_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['right_560',['RIGHT',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a21507b40c80068eda19865706fdc2403',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_6.html b/search/enumvalues_6.html new file mode 100644 index 00000000..f985df91 --- /dev/null +++ b/search/enumvalues_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_6.js b/search/enumvalues_6.js new file mode 100644 index 00000000..6be019d0 --- /dev/null +++ b/search/enumvalues_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['s_561',['S',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a5dbc98dcc983a70728bd082d1a47546e',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_7.html b/search/enumvalues_7.html new file mode 100644 index 00000000..7fdf663d --- /dev/null +++ b/search/enumvalues_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_7.js b/search/enumvalues_7.js new file mode 100644 index 00000000..acac54ea --- /dev/null +++ b/search/enumvalues_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['unknown_562',['UNKNOWN',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a696b031073e74bf2cb98e5ef201d4aa3',1,'vulp::observation::sources']]], + ['up_563',['UP',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422afbaedde498cdead4f2780217646e9ba1',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_8.html b/search/enumvalues_8.html new file mode 100644 index 00000000..674ccda6 --- /dev/null +++ b/search/enumvalues_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_8.js b/search/enumvalues_8.js new file mode 100644 index 00000000..e2c1a106 --- /dev/null +++ b/search/enumvalues_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['w_564',['W',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a61e9c06ea9a85a5088a499df6458d276',1,'vulp::observation::sources']]] +]; diff --git a/search/enumvalues_9.html b/search/enumvalues_9.html new file mode 100644 index 00000000..60f15ee3 --- /dev/null +++ b/search/enumvalues_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/enumvalues_9.js b/search/enumvalues_9.js new file mode 100644 index 00000000..57d66a30 --- /dev/null +++ b/search/enumvalues_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_565',['X',['../namespacevulp_1_1observation_1_1sources.html#ac1e70c7ad21b88d5ada4530e537d4422a02129bb861061d1a052c592e2dc6b383',1,'vulp::observation::sources']]] +]; diff --git a/search/files_0.html b/search/files_0.html new file mode 100644 index 00000000..9498842a --- /dev/null +++ b/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 00000000..6006ab07 --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_2epy_314',['__init__.py',['../spine_2____init_____8py.html',1,'(Global Namespace)'],['../utils_2____init_____8py.html',1,'(Global Namespace)']]] +]; diff --git a/search/files_1.html b/search/files_1.html new file mode 100644 index 00000000..7050ef48 --- /dev/null +++ b/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 00000000..6175a080 --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['agentinterface_2ecpp_315',['AgentInterface.cpp',['../AgentInterface_8cpp.html',1,'']]], + ['agentinterface_2eh_316',['AgentInterface.h',['../AgentInterface_8h.html',1,'']]] +]; diff --git a/search/files_2.html b/search/files_2.html new file mode 100644 index 00000000..497cdf5c --- /dev/null +++ b/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 00000000..236f76aa --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['bullet_5futils_2eh_317',['bullet_utils.h',['../bullet__utils_8h.html',1,'']]], + ['bulletcontactdata_2eh_318',['BulletContactData.h',['../BulletContactData_8h.html',1,'']]], + ['bulletimudata_2eh_319',['BulletImuData.h',['../BulletImuData_8h.html',1,'']]], + ['bulletinterface_2ecpp_320',['BulletInterface.cpp',['../BulletInterface_8cpp.html',1,'']]], + ['bulletinterface_2eh_321',['BulletInterface.h',['../BulletInterface_8h.html',1,'']]], + ['bulletjointproperties_2eh_322',['BulletJointProperties.h',['../BulletJointProperties_8h.html',1,'']]] +]; diff --git a/search/files_3.html b/search/files_3.html new file mode 100644 index 00000000..1ba106b2 --- /dev/null +++ b/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_3.js b/search/files_3.js new file mode 100644 index 00000000..071eaca0 --- /dev/null +++ b/search/files_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['controller_2eh_323',['Controller.h',['../Controller_8h.html',1,'']]], + ['cputemperature_2ecpp_324',['CpuTemperature.cpp',['../CpuTemperature_8cpp.html',1,'']]], + ['cputemperature_2eh_325',['CpuTemperature.h',['../CpuTemperature_8h.html',1,'']]] +]; diff --git a/search/files_4.html b/search/files_4.html new file mode 100644 index 00000000..753b7b10 --- /dev/null +++ b/search/files_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_4.js b/search/files_4.js new file mode 100644 index 00000000..29846e8f --- /dev/null +++ b/search/files_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['default_5faction_2eh_326',['default_action.h',['../default__action_8h.html',1,'']]] +]; diff --git a/search/files_5.html b/search/files_5.html new file mode 100644 index 00000000..7b6affd7 --- /dev/null +++ b/search/files_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_5.js b/search/files_5.js new file mode 100644 index 00000000..bd17cee6 --- /dev/null +++ b/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exceptions_2epy_327',['exceptions.py',['../exceptions_8py.html',1,'']]] +]; diff --git a/search/files_6.html b/search/files_6.html new file mode 100644 index 00000000..802ebf71 --- /dev/null +++ b/search/files_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_6.js b/search/files_6.js new file mode 100644 index 00000000..74a90d8e --- /dev/null +++ b/search/files_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['handle_5finterrupts_2ecpp_328',['handle_interrupts.cpp',['../handle__interrupts_8cpp.html',1,'']]], + ['handle_5finterrupts_2eh_329',['handle_interrupts.h',['../handle__interrupts_8h.html',1,'']]], + ['historyobserver_2eh_330',['HistoryObserver.h',['../HistoryObserver_8h.html',1,'']]] +]; diff --git a/search/files_7.html b/search/files_7.html new file mode 100644 index 00000000..365e6484 --- /dev/null +++ b/search/files_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_7.js b/search/files_7.js new file mode 100644 index 00000000..4fba1f4b --- /dev/null +++ b/search/files_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['imudata_2eh_331',['ImuData.h',['../ImuData_8h.html',1,'']]], + ['interface_2ecpp_332',['Interface.cpp',['../Interface_8cpp.html',1,'']]], + ['interface_2eh_333',['Interface.h',['../Interface_8h.html',1,'']]] +]; diff --git a/search/files_8.html b/search/files_8.html new file mode 100644 index 00000000..3df0f2fa --- /dev/null +++ b/search/files_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_8.js b/search/files_8.js new file mode 100644 index 00000000..05ca639b --- /dev/null +++ b/search/files_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['joystick_2ecpp_334',['Joystick.cpp',['../Joystick_8cpp.html',1,'']]], + ['joystick_2eh_335',['Joystick.h',['../Joystick_8h.html',1,'']]] +]; diff --git a/search/files_9.html b/search/files_9.html new file mode 100644 index 00000000..52f8b6c0 --- /dev/null +++ b/search/files_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_9.js b/search/files_9.js new file mode 100644 index 00000000..05eaf89b --- /dev/null +++ b/search/files_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['keyboard_2ecpp_336',['Keyboard.cpp',['../Keyboard_8cpp.html',1,'']]], + ['keyboard_2eh_337',['Keyboard.h',['../Keyboard_8h.html',1,'']]] +]; diff --git a/search/files_a.html b/search/files_a.html new file mode 100644 index 00000000..11d4c117 --- /dev/null +++ b/search/files_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_a.js b/search/files_a.js new file mode 100644 index 00000000..a180da64 --- /dev/null +++ b/search/files_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['low_5fpass_5ffilter_2eh_338',['low_pass_filter.h',['../low__pass__filter_8h.html',1,'']]] +]; diff --git a/search/files_b.html b/search/files_b.html new file mode 100644 index 00000000..9fc83436 --- /dev/null +++ b/search/files_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_b.js b/search/files_b.js new file mode 100644 index 00000000..fcf392f8 --- /dev/null +++ b/search/files_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['math_2eh_339',['math.h',['../math_8h.html',1,'']]], + ['mockinterface_2ecpp_340',['MockInterface.cpp',['../MockInterface_8cpp.html',1,'']]], + ['mockinterface_2eh_341',['MockInterface.h',['../MockInterface_8h.html',1,'']]] +]; diff --git a/search/files_c.html b/search/files_c.html new file mode 100644 index 00000000..c266b4c2 --- /dev/null +++ b/search/files_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_c.js b/search/files_c.js new file mode 100644 index 00000000..c1630485 --- /dev/null +++ b/search/files_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['observe_5fservos_2ecpp_342',['observe_servos.cpp',['../observe__servos_8cpp.html',1,'']]], + ['observe_5fservos_2eh_343',['observe_servos.h',['../observe__servos_8h.html',1,'']]], + ['observe_5ftime_2eh_344',['observe_time.h',['../observe__time_8h.html',1,'']]], + ['observer_2eh_345',['Observer.h',['../Observer_8h.html',1,'']]], + ['observerpipeline_2ecpp_346',['ObserverPipeline.cpp',['../ObserverPipeline_8cpp.html',1,'']]], + ['observerpipeline_2eh_347',['ObserverPipeline.h',['../ObserverPipeline_8h.html',1,'']]] +]; diff --git a/search/files_d.html b/search/files_d.html new file mode 100644 index 00000000..d2ca3c1c --- /dev/null +++ b/search/files_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_d.js b/search/files_d.js new file mode 100644 index 00000000..ce6adf73 --- /dev/null +++ b/search/files_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['pi3hatinterface_2ecpp_348',['Pi3HatInterface.cpp',['../Pi3HatInterface_8cpp.html',1,'']]], + ['pi3hatinterface_2eh_349',['Pi3HatInterface.h',['../Pi3HatInterface_8h.html',1,'']]] +]; diff --git a/search/files_e.html b/search/files_e.html new file mode 100644 index 00000000..9df41167 --- /dev/null +++ b/search/files_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_e.js b/search/files_e.js new file mode 100644 index 00000000..e5fe6090 --- /dev/null +++ b/search/files_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['random_5fstring_2eh_350',['random_string.h',['../random__string_8h.html',1,'']]], + ['readme_2emd_351',['README.md',['../README_8md.html',1,'']]], + ['realtime_2eh_352',['realtime.h',['../realtime_8h.html',1,'']]], + ['request_2eh_353',['Request.h',['../Request_8h.html',1,'']]], + ['request_2epy_354',['request.py',['../request_8py.html',1,'']]], + ['resolution_2eh_355',['resolution.h',['../resolution_8h.html',1,'']]] +]; diff --git a/search/files_f.html b/search/files_f.html new file mode 100644 index 00000000..f75258bb --- /dev/null +++ b/search/files_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_f.js b/search/files_f.js new file mode 100644 index 00000000..33d9adb5 --- /dev/null +++ b/search/files_f.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['serialize_2epy_356',['serialize.py',['../serialize_8py.html',1,'']]], + ['servolayout_2eh_357',['ServoLayout.h',['../ServoLayout_8h.html',1,'']]], + ['source_2eh_358',['Source.h',['../Source_8h.html',1,'']]], + ['spine_2ecpp_359',['Spine.cpp',['../Spine_8cpp.html',1,'']]], + ['spine_2eh_360',['Spine.h',['../Spine_8h.html',1,'']]], + ['spine_5finterface_2epy_361',['spine_interface.py',['../spine__interface_8py.html',1,'']]], + ['statemachine_2ecpp_362',['StateMachine.cpp',['../StateMachine_8cpp.html',1,'']]], + ['statemachine_2eh_363',['StateMachine.h',['../StateMachine_8h.html',1,'']]], + ['synchronousclock_2ecpp_364',['SynchronousClock.cpp',['../SynchronousClock_8cpp.html',1,'']]], + ['synchronousclock_2eh_365',['SynchronousClock.h',['../SynchronousClock_8h.html',1,'']]] +]; diff --git a/search/functions_0.html b/search/functions_0.html new file mode 100644 index 00000000..eb4c5014 --- /dev/null +++ b/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 00000000..a3fd2bd0 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['_5f_5fdel_5f_5f_366',['__del__',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a63d8286efc24e65ba6a63667d7e54ecc',1,'vulp::spine::spine_interface::SpineInterface']]], + ['_5f_5finit_5f_5f_367',['__init__',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a66b1bc70850b8e120c2a0df6cc1775a7',1,'vulp::spine::spine_interface::SpineInterface']]] +]; diff --git a/search/functions_1.html b/search/functions_1.html new file mode 100644 index 00000000..ef4088b8 --- /dev/null +++ b/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 00000000..99bf6759 --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['act_368',['act',['../classvulp_1_1control_1_1Controller.html#a67d54fc3c74f0464f1685d8d2640f9e0',1,'vulp::control::Controller']]], + ['add_5fservo_369',['add_servo',['../classvulp_1_1actuation_1_1ServoLayout.html#a5a77916f9ec8ffe722ce5b3fcacf2097',1,'vulp::actuation::ServoLayout']]], + ['agentinterface_370',['AgentInterface',['../classvulp_1_1spine_1_1AgentInterface.html#ae188b4cdae97d1556b0f19cf3780cc6e',1,'vulp::spine::AgentInterface']]], + ['allocate_5ffile_371',['allocate_file',['../namespacevulp_1_1spine.html#a8f9f5a5899f507ebe75f4a033e9c1a8f',1,'vulp::spine']]], + ['angular_5fvelocity_5fbase_5fin_5fbase_372',['angular_velocity_base_in_base',['../classvulp_1_1actuation_1_1BulletInterface.html#a22a4561f736e47fd10838e33e3eea76f',1,'vulp::actuation::BulletInterface']]], + ['append_5fobserver_373',['append_observer',['../classvulp_1_1observation_1_1ObserverPipeline.html#ae2efd5d24271fca7cb053f9732df050f',1,'vulp::observation::ObserverPipeline']]] +]; diff --git a/search/functions_10.html b/search/functions_10.html new file mode 100644 index 00000000..1bdc1257 --- /dev/null +++ b/search/functions_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_10.js b/search/functions_10.js new file mode 100644 index 00000000..cd52fb6f --- /dev/null +++ b/search/functions_10.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['parameters_419',['Parameters',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab4144bd528ea4d7fce753a80f8f2a998',1,'vulp::actuation::BulletInterface::Parameters::Parameters()=default'],['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a71e309bd3ceb8c7c19bcef4fcdd40cab',1,'vulp::actuation::BulletInterface::Parameters::Parameters(const Dictionary &config)']]], + ['pi3hatinterface_420',['Pi3HatInterface',['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a996e787fffa3e114248c62554a82ea6c',1,'vulp::actuation::Pi3HatInterface']]], + ['prefix_421',['prefix',['../classvulp_1_1observation_1_1HistoryObserver.html#a9786400be17a5a9f6e1ca34016c27ad7',1,'vulp::observation::HistoryObserver::prefix()'],['../classvulp_1_1observation_1_1Observer.html#a3fd28e0a2aa049f4a6a1e3a7a447ab60',1,'vulp::observation::Observer::prefix()'],['../classvulp_1_1observation_1_1Source.html#aff5c8426054622d7da7b6d023f77d40a',1,'vulp::observation::Source::prefix()'],['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a1f42b9ef3a86dd27c01d5df9c4a2d979',1,'vulp::observation::sources::CpuTemperature::prefix()'],['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a0af1bb65e8e8c27563bebdc2e80951a9',1,'vulp::observation::sources::Joystick::prefix()'],['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a74f9aafe3336163bca381653b8db911e',1,'vulp::observation::sources::Keyboard::prefix()']]], + ['present_422',['present',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a42caa70abe49b65862a960efaff0d624',1,'vulp::observation::sources::Joystick']]], + ['process_5fevent_423',['process_event',['../classvulp_1_1spine_1_1StateMachine.html#a44d4c72635480d0f4c9574d4a9833e5c',1,'vulp::spine::StateMachine']]] +]; diff --git a/search/functions_11.html b/search/functions_11.html new file mode 100644 index 00000000..188076ef --- /dev/null +++ b/search/functions_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_11.js b/search/functions_11.js new file mode 100644 index 00000000..f2f6b0e4 --- /dev/null +++ b/search/functions_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['random_5fstring_424',['random_string',['../namespacevulp_1_1utils.html#a6c6306957ebd97c6d0682112514a4fe7',1,'vulp::utils']]], + ['read_425',['read',['../classvulp_1_1observation_1_1Observer.html#a547821509ce1dffd57dccfca3e357b34',1,'vulp::observation::Observer::read()'],['../classvulp_1_1observation_1_1HistoryObserver.html#ad4b85e8cdf7f4b9b35e93ec062f2d712',1,'vulp::observation::HistoryObserver::read()']]], + ['read_5fimu_5fdata_426',['read_imu_data',['../namespacevulp_1_1actuation.html#a17c7faa08c40ba9298774b4da1c86edb',1,'vulp::actuation']]], + ['replies_427',['replies',['../classvulp_1_1actuation_1_1Interface.html#ac2ef0cf7b5e03256826df43fdde67923',1,'vulp::actuation::Interface']]], + ['request_428',['request',['../classvulp_1_1spine_1_1AgentInterface.html#afbe5e2c09cd343f179dcc7a97a3228b3',1,'vulp::spine::AgentInterface']]], + ['reset_429',['reset',['../classvulp_1_1actuation_1_1BulletInterface.html#a11efda56b80d0f7fa19616f825ba977e',1,'vulp::actuation::BulletInterface::reset()'],['../classvulp_1_1actuation_1_1Interface.html#a6a235100e7e6a7edc3b447ccdd86e71b',1,'vulp::actuation::Interface::reset()'],['../classvulp_1_1actuation_1_1MockInterface.html#a2e52d2e397d8e0bab2af4f1851f447c3',1,'vulp::actuation::MockInterface::reset()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html#ae6868c0cb7bdcb5dd16bbcd6bd8a6214',1,'vulp::actuation::Pi3HatInterface::reset()'],['../classvulp_1_1observation_1_1HistoryObserver.html#ad14642b0057573baf2ef01db21b3eb42',1,'vulp::observation::HistoryObserver::reset()'],['../classvulp_1_1observation_1_1Observer.html#a220adebd86175a8da2890f14e0fb3d65',1,'vulp::observation::Observer::reset()'],['../classvulp_1_1observation_1_1ObserverPipeline.html#a411a57b496f55b29070781481b2fd34b',1,'vulp::observation::ObserverPipeline::reset()'],['../classvulp_1_1spine_1_1Spine.html#a422e9d2f95cf562a05dc994a9385c188',1,'vulp.spine::Spine::reset()']]], + ['reset_5fbase_5fstate_430',['reset_base_state',['../classvulp_1_1actuation_1_1BulletInterface.html#ae739f74f3dcb9316ca97840f5e5cab1a',1,'vulp::actuation::BulletInterface']]], + ['reset_5fcontact_5fdata_431',['reset_contact_data',['../classvulp_1_1actuation_1_1BulletInterface.html#a67388fea7cb1806923cae8db9fa32374',1,'vulp::actuation::BulletInterface']]], + ['reset_5fjoint_5fangles_432',['reset_joint_angles',['../classvulp_1_1actuation_1_1BulletInterface.html#a3e8cb3fe8ce7681bd903b6c64889824c',1,'vulp::actuation::BulletInterface']]], + ['reset_5fjoint_5fproperties_433',['reset_joint_properties',['../classvulp_1_1actuation_1_1BulletInterface.html#a4c35888d4d83b4a011e2d3b866591a43',1,'vulp::actuation::BulletInterface']]], + ['run_434',['run',['../classvulp_1_1observation_1_1ObserverPipeline.html#a56d8e82ec0322066ee77202c6a98f4be',1,'vulp::observation::ObserverPipeline::run()'],['../classvulp_1_1spine_1_1Spine.html#a31497eb1f54c8876a843a00268dce14c',1,'vulp.spine::Spine::run()']]] +]; diff --git a/search/functions_12.html b/search/functions_12.html new file mode 100644 index 00000000..eb29d8f9 --- /dev/null +++ b/search/functions_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_12.js b/search/functions_12.js new file mode 100644 index 00000000..0770aeb7 --- /dev/null +++ b/search/functions_12.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['serialize_435',['serialize',['../namespacevulp_1_1utils_1_1serialize.html#a0cb702d04af978c6ba56320ecd0068f1',1,'vulp::utils::serialize']]], + ['servo_5fbus_5fmap_436',['servo_bus_map',['../classvulp_1_1actuation_1_1ServoLayout.html#af5832e2cf2c38680ae5629437a6d8a5e',1,'vulp::actuation::ServoLayout::servo_bus_map()'],['../classvulp_1_1actuation_1_1Interface.html#a030c21ac2fe9fd6e037f1d8c8ab2a287',1,'vulp::actuation::Interface::servo_bus_map() const noexcept']]], + ['servo_5fjoint_5fmap_437',['servo_joint_map',['../classvulp_1_1actuation_1_1Interface.html#ad8043504a3f4003d353919f664ad38aa',1,'vulp::actuation::Interface::servo_joint_map()'],['../classvulp_1_1actuation_1_1ServoLayout.html#aa8acd7e824f357e25101d8e27a96cbc0',1,'vulp::actuation::ServoLayout::servo_joint_map()']]], + ['servo_5flayout_438',['servo_layout',['../classvulp_1_1actuation_1_1Interface.html#a48f6e80769c28910d4d8affb66fc343e',1,'vulp::actuation::Interface']]], + ['servo_5freply_439',['servo_reply',['../classvulp_1_1actuation_1_1BulletInterface.html#a1f7c35df51b913aa85333be81eec2430',1,'vulp::actuation::BulletInterface']]], + ['set_5faction_440',['set_action',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a2eb6a040f56937b3c7c0b5aa668fa95e',1,'vulp::spine::spine_interface::SpineInterface']]], + ['set_5frequest_441',['set_request',['../classvulp_1_1spine_1_1AgentInterface.html#a03c363ea6525fc4a52a34690f30b6cf7',1,'vulp::spine::AgentInterface']]], + ['simulate_442',['simulate',['../classvulp_1_1spine_1_1Spine.html#a5dfa447b98c55c3caca1f06aed23a4dd',1,'vulp::spine::Spine']]], + ['size_443',['size',['../classvulp_1_1actuation_1_1ServoLayout.html#aa913aed179eea813eeb1e0a26e73079c',1,'vulp::actuation::ServoLayout::size()'],['../classvulp_1_1spine_1_1AgentInterface.html#a1c5ed95ec40decdc148a36f433112554',1,'vulp.spine::AgentInterface::size()']]], + ['skip_5fcount_444',['skip_count',['../classvulp_1_1utils_1_1SynchronousClock.html#a44480a4608ae3b5d5a74dcd97a7b8f75',1,'vulp::utils::SynchronousClock']]], + ['slack_445',['slack',['../classvulp_1_1utils_1_1SynchronousClock.html#aca17e08b153c266fc0fd202822ea3194',1,'vulp::utils::SynchronousClock']]], + ['sources_446',['sources',['../classvulp_1_1observation_1_1ObserverPipeline.html#a1757b995b52d4061bde1f043ff92ac03',1,'vulp::observation::ObserverPipeline']]], + ['spine_447',['Spine',['../classvulp_1_1spine_1_1Spine.html#af3f09675c956d6c7eeb116210e3fa973',1,'vulp::spine::Spine']]], + ['start_448',['start',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a62b07a000db69ac2ade003c34d728b02',1,'vulp::spine::spine_interface::SpineInterface']]], + ['state_449',['state',['../classvulp_1_1spine_1_1StateMachine.html#ace23c634b58a586edc4ca244675e29ff',1,'vulp::spine::StateMachine']]], + ['state_5fname_450',['state_name',['../namespacevulp_1_1spine.html#afe7d438605444b816b7d2fb170c87240',1,'vulp::spine']]], + ['statemachine_451',['StateMachine',['../classvulp_1_1spine_1_1StateMachine.html#acc1608eb36870a89aba2f563220819ee',1,'vulp::spine::StateMachine']]], + ['stop_452',['stop',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aec2e958f961ea163d1b1a78a155d3f2a',1,'vulp::spine::spine_interface::SpineInterface']]], + ['synchronousclock_453',['SynchronousClock',['../classvulp_1_1utils_1_1SynchronousClock.html#a68625e8c2ac5ce10018cd3e38f400ebe',1,'vulp::utils::SynchronousClock']]] +]; diff --git a/search/functions_13.html b/search/functions_13.html new file mode 100644 index 00000000..3da2ea69 --- /dev/null +++ b/search/functions_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_13.js b/search/functions_13.js new file mode 100644 index 00000000..3a962937 --- /dev/null +++ b/search/functions_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['transform_5fbase_5fto_5fworld_454',['transform_base_to_world',['../classvulp_1_1actuation_1_1BulletInterface.html#abca68c25b313ed573f05d7c8a0f0a74f',1,'vulp::actuation::BulletInterface']]] +]; diff --git a/search/functions_14.html b/search/functions_14.html new file mode 100644 index 00000000..29237b44 --- /dev/null +++ b/search/functions_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_14.js b/search/functions_14.js new file mode 100644 index 00000000..40c762c6 --- /dev/null +++ b/search/functions_14.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['wait_5ffor_5fnext_5ftick_455',['wait_for_next_tick',['../classvulp_1_1utils_1_1SynchronousClock.html#a8b04ab90ec9ca81016bfed118a0b1a10',1,'vulp::utils::SynchronousClock']]], + ['wait_5ffor_5fshared_5fmemory_456',['wait_for_shared_memory',['../namespacevulp_1_1spine_1_1spine__interface.html#a4c4005d1998a361e6be94accfccae083',1,'vulp::spine::spine_interface']]], + ['write_457',['write',['../classvulp_1_1observation_1_1HistoryObserver.html#ad5cef6b330e2db7c80dcbaec7cf58892',1,'vulp::observation::HistoryObserver::write()'],['../classvulp_1_1observation_1_1Observer.html#ad1187770cd115152300db7ccbe0ad452',1,'vulp::observation::Observer::write()'],['../classvulp_1_1observation_1_1Source.html#a10a52aaca76bb4482c479d528748d037',1,'vulp::observation::Source::write()'],['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63df1f5c11f3d11d60dab2b7401defe1',1,'vulp::observation::sources::CpuTemperature::write()'],['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a8ce565ddf3ab79d790a0b231d5c9456d',1,'vulp::observation::sources::Joystick::write()'],['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a772779999809525853d22389b0ffba0e',1,'vulp::observation::sources::Keyboard::write()'],['../classvulp_1_1spine_1_1AgentInterface.html#a1996190b31a6bf6f9c530107f4cfce50',1,'vulp.spine::AgentInterface::write()']]], + ['write_5fposition_5fcommands_458',['write_position_commands',['../classvulp_1_1actuation_1_1Interface.html#a03bc60526db123752c398595584af95d',1,'vulp::actuation::Interface']]], + ['write_5fstop_5fcommands_459',['write_stop_commands',['../classvulp_1_1actuation_1_1Interface.html#a8cde746cb50f95e7bfbf9dfe718fa443',1,'vulp::actuation::Interface']]] +]; diff --git a/search/functions_15.html b/search/functions_15.html new file mode 100644 index 00000000..6d5decd7 --- /dev/null +++ b/search/functions_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_15.js b/search/functions_15.js new file mode 100644 index 00000000..e106b00c --- /dev/null +++ b/search/functions_15.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['_7eagentinterface_460',['~AgentInterface',['../classvulp_1_1spine_1_1AgentInterface.html#aa1f13c476e68abb4b9ac4c62269bdf50',1,'vulp::spine::AgentInterface']]], + ['_7ebulletinterface_461',['~BulletInterface',['../classvulp_1_1actuation_1_1BulletInterface.html#a63ab50366c585f45de6ace6a05cd10d8',1,'vulp::actuation::BulletInterface']]], + ['_7ecputemperature_462',['~CpuTemperature',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#ad9726f53ab1e7a3382db4e00279aa26a',1,'vulp::observation::sources::CpuTemperature']]], + ['_7einterface_463',['~Interface',['../classvulp_1_1actuation_1_1Interface.html#a4699195a001a20220ba4606f0bb58274',1,'vulp::actuation::Interface']]], + ['_7ejoystick_464',['~Joystick',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#a1d514247fd5f7ed3728a6a5b02c44b48',1,'vulp::observation::sources::Joystick']]], + ['_7ekeyboard_465',['~Keyboard',['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a662c1d7cab92bf282a19463a84340c0f',1,'vulp::observation::sources::Keyboard']]], + ['_7emockinterface_466',['~MockInterface',['../classvulp_1_1actuation_1_1MockInterface.html#a188d0479488241b3f5549c16a2f4daae',1,'vulp::actuation::MockInterface']]], + ['_7eobserver_467',['~Observer',['../classvulp_1_1observation_1_1Observer.html#aedcf4bafa7051d01e5711180738b2ba6',1,'vulp::observation::Observer']]], + ['_7epi3hatinterface_468',['~Pi3HatInterface',['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a7240e06f6198aebe50f0764c4610c511',1,'vulp::actuation::Pi3HatInterface']]], + ['_7esource_469',['~Source',['../classvulp_1_1observation_1_1Source.html#a9c713319a0579c85a702081364bbb2f1',1,'vulp::observation::Source']]] +]; diff --git a/search/functions_2.html b/search/functions_2.html new file mode 100644 index 00000000..ca5aa10e --- /dev/null +++ b/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_2.js b/search/functions_2.js new file mode 100644 index 00000000..eb884d67 --- /dev/null +++ b/search/functions_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['bullet_5ffrom_5feigen_374',['bullet_from_eigen',['../namespacevulp_1_1actuation.html#ac2af057ce6d42297f974e1386b1b34b3',1,'vulp::actuation::bullet_from_eigen(const Eigen::Quaterniond &quat)'],['../namespacevulp_1_1actuation.html#a225ab1b9ea7b3dd97f298768e432246a',1,'vulp::actuation::bullet_from_eigen(const Eigen::Vector3d &v)']]], + ['bulletinterface_375',['BulletInterface',['../classvulp_1_1actuation_1_1BulletInterface.html#ae714260782b6110a5e77030ac8016540',1,'vulp::actuation::BulletInterface']]], + ['bus_376',['bus',['../classvulp_1_1actuation_1_1ServoLayout.html#aecd67b35fadbcd87c4528a7069f9ae71',1,'vulp::actuation::ServoLayout']]] +]; diff --git a/search/functions_3.html b/search/functions_3.html new file mode 100644 index 00000000..d79f55b8 --- /dev/null +++ b/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_3.js b/search/functions_3.js new file mode 100644 index 00000000..61bff465 --- /dev/null +++ b/search/functions_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['commands_377',['commands',['../classvulp_1_1actuation_1_1Interface.html#ac60af36fb98a8bda3b21d8252c3a1453',1,'vulp::actuation::Interface']]], + ['compute_5fjoint_5ftorque_378',['compute_joint_torque',['../classvulp_1_1actuation_1_1BulletInterface.html#a947d01df9ece4fb48e0a3f48f9d524b0',1,'vulp::actuation::BulletInterface']]], + ['configure_379',['configure',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aeeda8f2c234ee17f55c2aa485ef47d6f',1,'vulp::actuation::BulletInterface::Parameters']]], + ['configure_5fcpu_380',['configure_cpu',['../namespacevulp_1_1utils.html#a647a4a0c11b7b2a5a65c99c77ebd9a54',1,'vulp::utils']]], + ['configure_5fscheduler_381',['configure_scheduler',['../namespacevulp_1_1utils.html#a382e082bfa27731270dfa119bee29d9a',1,'vulp::utils']]], + ['connect_5fsource_382',['connect_source',['../classvulp_1_1observation_1_1ObserverPipeline.html#ab9f3bed18ac04a0e441fd83422f010d4',1,'vulp::observation::ObserverPipeline']]], + ['cputemperature_383',['CpuTemperature',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#a63cc643a7be79d776747c14b245937fd',1,'vulp::observation::sources::CpuTemperature']]], + ['cycle_384',['cycle',['../classvulp_1_1actuation_1_1BulletInterface.html#a0b08119f9cdb5b36d9ec995dc56df7a5',1,'vulp::actuation::BulletInterface::cycle()'],['../classvulp_1_1actuation_1_1Interface.html#ab9b6fe3cbfd5e58345a1297a97da5de9',1,'vulp::actuation::Interface::cycle()'],['../classvulp_1_1actuation_1_1MockInterface.html#a9aaaa09396d4966948f02e5953d99677',1,'vulp::actuation::MockInterface::cycle()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html#a7fba7d27e5486cfdefe177b1631989d3',1,'vulp::actuation::Pi3HatInterface::cycle()'],['../classvulp_1_1spine_1_1Spine.html#aa362cc84873d2ffa1359a73efd5441f9',1,'vulp.spine::Spine::cycle()']]] +]; diff --git a/search/functions_4.html b/search/functions_4.html new file mode 100644 index 00000000..1657cad0 --- /dev/null +++ b/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_4.js b/search/functions_4.js new file mode 100644 index 00000000..75950b57 --- /dev/null +++ b/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['data_385',['data',['../classvulp_1_1actuation_1_1Interface.html#a3bb031735c3cfa22259787b88d63b49b',1,'vulp::actuation::Interface::data()'],['../classvulp_1_1spine_1_1AgentInterface.html#ae530d9f802a29ea464ec4c280a428f6a',1,'vulp.spine::AgentInterface::data()']]], + ['divides_386',['divides',['../namespacevulp_1_1utils_1_1math.html#a8c590daf31618ab64f1f0f044ed81148',1,'vulp::utils::math']]] +]; diff --git a/search/functions_5.html b/search/functions_5.html new file mode 100644 index 00000000..9301d6b9 --- /dev/null +++ b/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_5.js b/search/functions_5.js new file mode 100644 index 00000000..9b54e682 --- /dev/null +++ b/search/functions_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['eigen_5ffrom_5fbullet_387',['eigen_from_bullet',['../namespacevulp_1_1actuation.html#a57658aadbd0ec10129a9692fe4c281f4',1,'vulp::actuation::eigen_from_bullet(const btQuaternion &quat)'],['../namespacevulp_1_1actuation.html#a3b0ac5d01ef820488834702e962bc765',1,'vulp::actuation::eigen_from_bullet(const btVector3 &v)']]] +]; diff --git a/search/functions_6.html b/search/functions_6.html new file mode 100644 index 00000000..9c4f5fc6 --- /dev/null +++ b/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_6.js b/search/functions_6.js new file mode 100644 index 00000000..5fc7e1b9 --- /dev/null +++ b/search/functions_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['find_5flink_5findex_388',['find_link_index',['../namespacevulp_1_1actuation.html#ae3bf38e32e44b3a353850acb05bbd81a',1,'vulp::actuation']]], + ['find_5fplane_5furdf_389',['find_plane_urdf',['../namespacevulp_1_1actuation.html#aabb66d6b3cd81c772937088266af0829',1,'vulp::actuation']]] +]; diff --git a/search/functions_7.html b/search/functions_7.html new file mode 100644 index 00000000..46b5c0f6 --- /dev/null +++ b/search/functions_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_7.js b/search/functions_7.js new file mode 100644 index 00000000..960ec833 --- /dev/null +++ b/search/functions_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['get_5ffirst_5fobservation_390',['get_first_observation',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#aca235a9ef5bb357d939d133bc7a1ed43',1,'vulp::spine::spine_interface::SpineInterface']]], + ['get_5fobservation_391',['get_observation',['../classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html#a38501b691c8efab6eae04853f88bd6a1',1,'vulp::spine::spine_interface::SpineInterface']]], + ['get_5fposition_5fresolution_392',['get_position_resolution',['../namespacevulp_1_1actuation.html#ac48c5992ecb62d9c23d2970d3408afdd',1,'vulp::actuation']]], + ['get_5fquery_5fresolution_393',['get_query_resolution',['../namespacevulp_1_1actuation.html#a5ee46598099be18d955806e127b76a38',1,'vulp::actuation']]] +]; diff --git a/search/functions_8.html b/search/functions_8.html new file mode 100644 index 00000000..31a1d950 --- /dev/null +++ b/search/functions_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_8.js b/search/functions_8.js new file mode 100644 index 00000000..37924719 --- /dev/null +++ b/search/functions_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['handle_5finterrupt_394',['handle_interrupt',['../namespacevulp_1_1utils_1_1internal.html#a838e3878c7da2dc06db5168b5ef421b2',1,'vulp::utils::internal']]], + ['handle_5finterrupts_395',['handle_interrupts',['../namespacevulp_1_1utils.html#a78519754b023e10a26052f84229732fa',1,'vulp::utils']]], + ['historyobserver_396',['HistoryObserver',['../classvulp_1_1observation_1_1HistoryObserver.html#a556211d9cb6719e3a044c20ddfd0bb27',1,'vulp::observation::HistoryObserver']]] +]; diff --git a/search/functions_9.html b/search/functions_9.html new file mode 100644 index 00000000..9a8e4290 --- /dev/null +++ b/search/functions_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_9.js b/search/functions_9.js new file mode 100644 index 00000000..b631e286 --- /dev/null +++ b/search/functions_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['initialize_5faction_397',['initialize_action',['../classvulp_1_1actuation_1_1Interface.html#a58633a8bc4024056e0512b23baa78cfa',1,'vulp::actuation::Interface']]], + ['interface_398',['Interface',['../classvulp_1_1actuation_1_1Interface.html#a154834670d82002681360eebf3353279',1,'vulp::actuation::Interface']]], + ['is_5fdisabled_399',['is_disabled',['../classvulp_1_1observation_1_1sources_1_1CpuTemperature.html#aa480657101c7adb0f59b873a57ad6cd7',1,'vulp::observation::sources::CpuTemperature']]], + ['is_5flowercase_5falpha_400',['is_lowercase_alpha',['../Keyboard_8h.html#a436c4f03139123bc3fe3e764046213c3',1,'Keyboard.h']]], + ['is_5fover_5fafter_5fthis_5fcycle_401',['is_over_after_this_cycle',['../classvulp_1_1spine_1_1StateMachine.html#ae3883e0306f844b7ce6e95fc931e75f3',1,'vulp::spine::StateMachine']]], + ['is_5fprintable_5fascii_402',['is_printable_ascii',['../Keyboard_8h.html#a1f200ef3dbbdfee1673df8bfa3e12901',1,'Keyboard.h']]], + ['is_5fuppercase_5falpha_403',['is_uppercase_alpha',['../Keyboard_8h.html#aa61d4e7c4b5a2d4ad8fc70900fe17cf9',1,'Keyboard.h']]] +]; diff --git a/search/functions_a.html b/search/functions_a.html new file mode 100644 index 00000000..5ecc152c --- /dev/null +++ b/search/functions_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_a.js b/search/functions_a.js new file mode 100644 index 00000000..7c78419c --- /dev/null +++ b/search/functions_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['joint_5fname_404',['joint_name',['../classvulp_1_1actuation_1_1ServoLayout.html#a50a75e86d72f40263d8103e4e575ee84',1,'vulp::actuation::ServoLayout']]], + ['joint_5fproperties_405',['joint_properties',['../classvulp_1_1actuation_1_1BulletInterface.html#aebf8c201d8d102e776fbef06283c2cad',1,'vulp::actuation::BulletInterface']]], + ['joystick_406',['Joystick',['../classvulp_1_1observation_1_1sources_1_1Joystick.html#aa29b4d83c0c29179259151aeb891c0aa',1,'vulp::observation::sources::Joystick']]] +]; diff --git a/search/functions_b.html b/search/functions_b.html new file mode 100644 index 00000000..e301fedd --- /dev/null +++ b/search/functions_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_b.js b/search/functions_b.js new file mode 100644 index 00000000..f0cddadd --- /dev/null +++ b/search/functions_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['keyboard_407',['Keyboard',['../classvulp_1_1observation_1_1sources_1_1Keyboard.html#a3a397c882016fbb734f2fb445c29d39b',1,'vulp::observation::sources::Keyboard']]] +]; diff --git a/search/functions_c.html b/search/functions_c.html new file mode 100644 index 00000000..c4f32687 --- /dev/null +++ b/search/functions_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_c.js b/search/functions_c.js new file mode 100644 index 00000000..0519e7f6 --- /dev/null +++ b/search/functions_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['linear_5fvelocity_5fbase_5fto_5fworld_5fin_5fworld_408',['linear_velocity_base_to_world_in_world',['../classvulp_1_1actuation_1_1BulletInterface.html#abf3317db63b1cf38d7da86e0efd7b5e1',1,'vulp::actuation::BulletInterface']]], + ['lock_5fmemory_409',['lock_memory',['../namespacevulp_1_1utils.html#ae34f759b79aecb082475a33f8d67045e',1,'vulp::utils']]], + ['low_5fpass_5ffilter_410',['low_pass_filter',['../namespacevulp_1_1utils.html#a82e8f66ca7a05a1fe40afeac8cfea205',1,'vulp::utils']]] +]; diff --git a/search/functions_d.html b/search/functions_d.html new file mode 100644 index 00000000..7a1ed065 --- /dev/null +++ b/search/functions_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_d.js b/search/functions_d.js new file mode 100644 index 00000000..a2e0a1b6 --- /dev/null +++ b/search/functions_d.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['measured_5fperiod_411',['measured_period',['../classvulp_1_1utils_1_1SynchronousClock.html#a38f9298dd6d373b8930416ae3146f4de',1,'vulp::utils::SynchronousClock']]], + ['mockinterface_412',['MockInterface',['../classvulp_1_1actuation_1_1MockInterface.html#a0e5220c878595c959f26f51dbba9c078',1,'vulp::actuation::MockInterface']]] +]; diff --git a/search/functions_e.html b/search/functions_e.html new file mode 100644 index 00000000..22d2a6bf --- /dev/null +++ b/search/functions_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_e.js b/search/functions_e.js new file mode 100644 index 00000000..310452a9 --- /dev/null +++ b/search/functions_e.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['nb_5fobservers_413',['nb_observers',['../classvulp_1_1observation_1_1ObserverPipeline.html#a98385c29632eef6f1edc9e6e1ed58f36',1,'vulp::observation::ObserverPipeline']]], + ['nb_5fsources_414',['nb_sources',['../classvulp_1_1observation_1_1ObserverPipeline.html#aac2989ab99989a92a77d7e1125a0c152',1,'vulp::observation::ObserverPipeline']]] +]; diff --git a/search/functions_f.html b/search/functions_f.html new file mode 100644 index 00000000..54b7dee0 --- /dev/null +++ b/search/functions_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_f.js b/search/functions_f.js new file mode 100644 index 00000000..64732d94 --- /dev/null +++ b/search/functions_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['observe_415',['observe',['../classvulp_1_1actuation_1_1BulletInterface.html#aa6e175ab2ded82e0c2e4c0e849e67b51',1,'vulp::actuation::BulletInterface::observe()'],['../classvulp_1_1actuation_1_1Interface.html#ac5f1fd525398a0a0d290ee2aed26c66f',1,'vulp::actuation::Interface::observe()'],['../classvulp_1_1actuation_1_1MockInterface.html#a790e57ed6a6157044ae70c3e59d9967e',1,'vulp::actuation::MockInterface::observe()'],['../classvulp_1_1actuation_1_1Pi3HatInterface.html#abdec83204cb8b1bd51333d5d62f89293',1,'vulp::actuation::Pi3HatInterface::observe()']]], + ['observe_5fservos_416',['observe_servos',['../namespacevulp_1_1observation.html#ad2218a79b5b3865746e23d5579f97585',1,'vulp::observation::observe_servos(Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< moteus::ServoReply > &servo_replies)'],['../namespacevulp_1_1observation.html#a0ae2b75955060fe39559b2b05f6997ed',1,'vulp::observation::observe_servos(palimpsest::Dictionary &observation, const std::map< int, std::string > &servo_joint_map, const std::vector< actuation::moteus::ServoReply > &servo_replies)']]], + ['observe_5ftime_417',['observe_time',['../namespacevulp_1_1observation.html#a91251ac7479e0efd644cbd763d66d5ea',1,'vulp::observation']]], + ['observers_418',['observers',['../classvulp_1_1observation_1_1ObserverPipeline.html#a5137ef162e96278c44a05b146115c17b',1,'vulp::observation::ObserverPipeline']]] +]; diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 00000000..03626f64 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/search/namespaces_0.html b/search/namespaces_0.html new file mode 100644 index 00000000..21db2c3a --- /dev/null +++ b/search/namespaces_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/namespaces_0.js b/search/namespaces_0.js new file mode 100644 index 00000000..5d7c96dd --- /dev/null +++ b/search/namespaces_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['actuation_300',['actuation',['../namespacevulp_1_1actuation.html',1,'vulp']]], + ['control_301',['control',['../namespacevulp_1_1control.html',1,'vulp']]], + ['default_5faction_302',['default_action',['../namespacevulp_1_1actuation_1_1default__action.html',1,'vulp::actuation']]], + ['exceptions_303',['exceptions',['../namespacevulp_1_1spine_1_1exceptions.html',1,'vulp::spine']]], + ['internal_304',['internal',['../namespacevulp_1_1utils_1_1internal.html',1,'vulp::utils']]], + ['math_305',['math',['../namespacevulp_1_1utils_1_1math.html',1,'vulp::utils']]], + ['observation_306',['observation',['../namespacevulp_1_1observation.html',1,'vulp']]], + ['request_307',['request',['../namespacevulp_1_1spine_1_1request.html',1,'vulp::spine']]], + ['serialize_308',['serialize',['../namespacevulp_1_1utils_1_1serialize.html',1,'vulp::utils']]], + ['sources_309',['sources',['../namespacevulp_1_1observation_1_1sources.html',1,'vulp::observation']]], + ['spine_310',['spine',['../namespacevulp_1_1spine.html',1,'vulp']]], + ['spine_5finterface_311',['spine_interface',['../namespacevulp_1_1spine_1_1spine__interface.html',1,'vulp::spine']]], + ['utils_312',['utils',['../namespacevulp_1_1utils.html',1,'vulp']]], + ['vulp_313',['vulp',['../namespacevulp.html',1,'']]] +]; diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 00000000..2b9360b6 --- /dev/null +++ b/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/search/pages_0.html b/search/pages_0.html new file mode 100644 index 00000000..8517b48f --- /dev/null +++ b/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 00000000..5397bdb7 --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vulp_20–_20robot_2fsimulation_20switch_566',['Vulp – Robot/simulation switch',['../index.html',1,'']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 00000000..9074198f --- /dev/null +++ b/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 00000000..fb226f73 --- /dev/null +++ b/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_0.js b/search/typedefs_0.js new file mode 100644 index 00000000..9c6123e0 --- /dev/null +++ b/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['iterator_533',['iterator',['../classvulp_1_1observation_1_1ObserverPipeline.html#af938c156ac8f8d3b4ad535c3073e2e15',1,'vulp::observation::ObserverPipeline']]] +]; diff --git a/search/typedefs_1.html b/search/typedefs_1.html new file mode 100644 index 00000000..46cf01e6 --- /dev/null +++ b/search/typedefs_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_1.js b/search/typedefs_1.js new file mode 100644 index 00000000..b60112aa --- /dev/null +++ b/search/typedefs_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pi3hat_534',['Pi3Hat',['../namespacevulp_1_1actuation.html#ab2b376daf35eae21e48708f9b3f63460',1,'vulp::actuation']]] +]; diff --git a/search/variables_0.html b/search/variables_0.html new file mode 100644 index 00000000..1e477c08 --- /dev/null +++ b/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_0.js b/search/variables_0.js new file mode 100644 index 00000000..74fbf708 --- /dev/null +++ b/search/variables_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['actuation_5f_470',['actuation_',['../classvulp_1_1spine_1_1Spine.html#ac5140f68adf3ad4a1db44aecf7e5b74b',1,'vulp::spine::Spine']]], + ['actuation_5foutput_5f_471',['actuation_output_',['../classvulp_1_1spine_1_1Spine.html#a0cdd75b5375864a16dc3acd7bc662e8a',1,'vulp::spine::Spine']]], + ['agent_5finterface_5f_472',['agent_interface_',['../classvulp_1_1spine_1_1Spine.html#a00d150f97b2ede19b540f2b554dc2ded',1,'vulp::spine::Spine']]], + ['angular_5fvelocity_5fbase_5fin_5fbase_473',['angular_velocity_base_in_base',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab780b0fcbc751d13b2d5ad7ede7287c8',1,'vulp::actuation::BulletInterface::Parameters']]], + ['angular_5fvelocity_5fimu_5fin_5fimu_474',['angular_velocity_imu_in_imu',['../structvulp_1_1actuation_1_1ImuData.html#af0388ff114c843cc5daf4b8d0f902947',1,'vulp::actuation::ImuData']]], + ['argv0_475',['argv0',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ada0f9a2c0ee7a3a7fca7308ac3cf12a1',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_1.html b/search/variables_1.html new file mode 100644 index 00000000..ea73d9a4 --- /dev/null +++ b/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_1.js b/search/variables_1.js new file mode 100644 index 00000000..aa3d3b9c --- /dev/null +++ b/search/variables_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['caught_5finterrupt_5f_476',['caught_interrupt_',['../classvulp_1_1spine_1_1Spine.html#abba8605f39e2d5fec65425980bab7137',1,'vulp::spine::Spine']]], + ['cpu_477',['cpu',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a64da4f7a8bd34717145d7ac821ddd20d',1,'vulp::spine::Spine::Parameters']]] +]; diff --git a/search/variables_10.html b/search/variables_10.html new file mode 100644 index 00000000..dc9920b6 --- /dev/null +++ b/search/variables_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_10.js b/search/variables_10.js new file mode 100644 index 00000000..2c2eaa24 --- /dev/null +++ b/search/variables_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['torque_5fcontrol_5fkd_529',['torque_control_kd',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a7bfc34eaf6e26490704ed26a8e8eefa9',1,'vulp::actuation::BulletInterface::Parameters']]], + ['torque_5fcontrol_5fkp_530',['torque_control_kp',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af2f8b2aca20f8dea3f9001c961543d1c',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_11.html b/search/variables_11.html new file mode 100644 index 00000000..704bcb18 --- /dev/null +++ b/search/variables_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_11.js b/search/variables_11.js new file mode 100644 index 00000000..38f6cec0 --- /dev/null +++ b/search/variables_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['up_5fbytes_531',['UP_BYTES',['../Keyboard_8h.html#a391c665c8ffd7ddd3a8fbca4aaf58225',1,'Keyboard.h']]] +]; diff --git a/search/variables_12.html b/search/variables_12.html new file mode 100644 index 00000000..a3a32eb8 --- /dev/null +++ b/search/variables_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_12.js b/search/variables_12.js new file mode 100644 index 00000000..13ae39d7 --- /dev/null +++ b/search/variables_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['working_5fdict_5f_532',['working_dict_',['../classvulp_1_1spine_1_1Spine.html#ad6b50ac8ebf63ef239bcff853125fc81',1,'vulp::spine::Spine']]] +]; diff --git a/search/variables_2.html b/search/variables_2.html new file mode 100644 index 00000000..0580462e --- /dev/null +++ b/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_2.js b/search/variables_2.js new file mode 100644 index 00000000..efe84489 --- /dev/null +++ b/search/variables_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['down_5fbytes_478',['DOWN_BYTES',['../Keyboard_8h.html#a3e1a7b8e0852d8d31fd8b17e6d82d766',1,'Keyboard.h']]], + ['dt_479',['dt',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5569419c2647379d927567fe26253cc7',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_3.html b/search/variables_3.html new file mode 100644 index 00000000..0d69e761 --- /dev/null +++ b/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_3.js b/search/variables_3.js new file mode 100644 index 00000000..c7417144 --- /dev/null +++ b/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['env_5furdf_5fpaths_480',['env_urdf_paths',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#acba555f40d7d6dbd77f3643b84573fb1',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_4.html b/search/variables_4.html new file mode 100644 index 00000000..a4b6506b --- /dev/null +++ b/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_4.js b/search/variables_4.js new file mode 100644 index 00000000..17313884 --- /dev/null +++ b/search/variables_4.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['floor_481',['floor',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a9e842b4a697299725aa500a6e038238b',1,'vulp::actuation::BulletInterface::Parameters']]], + ['follower_5fcamera_482',['follower_camera',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af5c2135bac4715f7e17f3834f9940d4d',1,'vulp::actuation::BulletInterface::Parameters']]], + ['frequency_483',['frequency',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a5401e120945e5d09eb569d83833c5c44',1,'vulp::spine::Spine::Parameters']]], + ['frequency_5f_484',['frequency_',['../classvulp_1_1spine_1_1Spine.html#a0f3f391aee9e28c9720703e78783d84d',1,'vulp::spine::Spine']]], + ['friction_485',['friction',['../structvulp_1_1actuation_1_1BulletJointProperties.html#ac61ae286b06ef66415212bf8c97bbc56',1,'vulp::actuation::BulletJointProperties']]] +]; diff --git a/search/variables_5.html b/search/variables_5.html new file mode 100644 index 00000000..7e345d16 --- /dev/null +++ b/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_5.js b/search/variables_5.js new file mode 100644 index 00000000..9845b2b0 --- /dev/null +++ b/search/variables_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['gravity_486',['gravity',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a3dd3900c6fc0d5e0f9d1eaed35888e5a',1,'vulp::actuation::BulletInterface::Parameters']]], + ['gui_487',['gui',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5f8872bb8b7c460ccd28796fda7428c3',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_6.html b/search/variables_6.html new file mode 100644 index 00000000..7d48e75e --- /dev/null +++ b/search/variables_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_6.js b/search/variables_6.js new file mode 100644 index 00000000..1e3ca8d4 --- /dev/null +++ b/search/variables_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['interrupt_5fflag_488',['interrupt_flag',['../namespacevulp_1_1utils_1_1internal.html#ac7a04e3bcce477cf05d12ecb651fab6d',1,'vulp::utils::internal']]], + ['ipc_5fbuffer_5f_489',['ipc_buffer_',['../classvulp_1_1spine_1_1Spine.html#a74511847ef40db4668a8a26ddf6916c8',1,'vulp::spine::Spine']]] +]; diff --git a/search/variables_7.html b/search/variables_7.html new file mode 100644 index 00000000..5c263409 --- /dev/null +++ b/search/variables_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_7.js b/search/variables_7.js new file mode 100644 index 00000000..439561dc --- /dev/null +++ b/search/variables_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['joint_5ffriction_490',['joint_friction',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aa84c7bf26a08e22a0cd3de02eab3b011',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_8.html b/search/variables_8.html new file mode 100644 index 00000000..dc9ec54a --- /dev/null +++ b/search/variables_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_8.js b/search/variables_8.js new file mode 100644 index 00000000..28e4a3db --- /dev/null +++ b/search/variables_8.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['kaction_491',['kAction',['../classvulp_1_1spine_1_1request_1_1Request.html#af06518ad121dbf2c7da5d252b024327e',1,'vulp::spine::request::Request']]], + ['kcputemperaturebuffersize_492',['kCpuTemperatureBufferSize',['../namespacevulp_1_1observation_1_1sources.html#a010055692ae8692090553ae85b6f66bc',1,'vulp::observation::sources']]], + ['kerror_493',['kError',['../classvulp_1_1spine_1_1request_1_1Request.html#a39b736cb6f976263c659b39e8374cf1f',1,'vulp::spine::request::Request']]], + ['kfeedforwardtorque_494',['kFeedforwardTorque',['../namespacevulp_1_1actuation_1_1default__action.html#acd6b5f4fab30ca4fa011b072eb178db3',1,'vulp::actuation::default_action']]], + ['kjoystickdeadband_495',['kJoystickDeadband',['../namespacevulp_1_1observation_1_1sources.html#a7e19b63b7a414ab70c8b9468df93de44',1,'vulp::observation::sources']]], + ['kkdscale_496',['kKdScale',['../namespacevulp_1_1actuation_1_1default__action.html#a37fdf95f3ecb19b772ed1ed45b5864e9',1,'vulp::actuation::default_action']]], + ['kkpscale_497',['kKpScale',['../namespacevulp_1_1actuation_1_1default__action.html#a9b7395da45f48d599f21ac8d53358a02',1,'vulp::actuation::default_action']]], + ['kmaximumtorque_498',['kMaximumTorque',['../namespacevulp_1_1actuation_1_1default__action.html#a162f94f351be65ad299e955232e415aa',1,'vulp::actuation::default_action']]], + ['kmaxkeybytes_499',['kMaxKeyBytes',['../Keyboard_8h.html#aad42040bb8f9fbb2a4e312fca9736ffa',1,'Keyboard.h']]], + ['kmebibytes_500',['kMebibytes',['../namespacevulp_1_1spine.html#a6c2c8dbd236f8d35e2ecac79f165fa29',1,'vulp::spine']]], + ['knbstopcycles_501',['kNbStopCycles',['../namespacevulp_1_1spine.html#a5bc778508b13f1e9e7dd227025a32808',1,'vulp::spine']]], + ['knone_502',['kNone',['../classvulp_1_1spine_1_1request_1_1Request.html#aaac617fc5ed006caa6f9cb8297eb9f91',1,'vulp::spine::request::Request']]], + ['kobservation_503',['kObservation',['../classvulp_1_1spine_1_1request_1_1Request.html#ae1f87e136fb3b595c41f7966158be82b',1,'vulp::spine::request::Request']]], + ['kpollingintervalms_504',['kPollingIntervalMS',['../Keyboard_8h.html#ac524932df3a0d0889f6ef63734eb9b96',1,'Keyboard.h']]], + ['kstart_505',['kStart',['../classvulp_1_1spine_1_1request_1_1Request.html#aa2fe8a1f03bdbafb2f4d57cb4e92cf07',1,'vulp::spine::request::Request']]], + ['kstop_506',['kStop',['../classvulp_1_1spine_1_1request_1_1Request.html#a471941bc5357a4c3899adb5b56136b01',1,'vulp::spine::request::Request']]], + ['kvelocity_507',['kVelocity',['../namespacevulp_1_1actuation_1_1default__action.html#a1f6d1969f4382b8e086bb89c0514760d',1,'vulp::actuation::default_action']]] +]; diff --git a/search/variables_9.html b/search/variables_9.html new file mode 100644 index 00000000..7b014750 --- /dev/null +++ b/search/variables_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_9.js b/search/variables_9.js new file mode 100644 index 00000000..c14a28c8 --- /dev/null +++ b/search/variables_9.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['latest_5freplies_5f_508',['latest_replies_',['../classvulp_1_1spine_1_1Spine.html#a961c5ef602634734b6e75e667574e90c',1,'vulp::spine::Spine']]], + ['left_5fbytes_509',['LEFT_BYTES',['../Keyboard_8h.html#a287b5932e75598bfa911b731d94a1ff2',1,'Keyboard.h']]], + ['linear_5facceleration_5fimu_5fin_5fimu_510',['linear_acceleration_imu_in_imu',['../structvulp_1_1actuation_1_1ImuData.html#ab7f284df90fd038642a2cdcf55165104',1,'vulp::actuation::ImuData']]], + ['linear_5fvelocity_5fbase_5fto_5fworld_5fin_5fworld_511',['linear_velocity_base_to_world_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab1ddd659af5fd3c87bd623663dabbd2d',1,'vulp::actuation::BulletInterface::Parameters']]], + ['linear_5fvelocity_5fimu_5fin_5fworld_512',['linear_velocity_imu_in_world',['../structvulp_1_1actuation_1_1BulletImuData.html#a7f574fca8e18c6351fd502aa700240cc',1,'vulp::actuation::BulletImuData']]], + ['log_5fpath_513',['log_path',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#adac3276df5a55e141b0820d13d30118f',1,'vulp::spine::Spine::Parameters']]], + ['logger_5f_514',['logger_',['../classvulp_1_1spine_1_1Spine.html#a0060f951f291ff3f707393e7d2563e36',1,'vulp::spine::Spine']]] +]; diff --git a/search/variables_a.html b/search/variables_a.html new file mode 100644 index 00000000..52a724d1 --- /dev/null +++ b/search/variables_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_a.js b/search/variables_a.js new file mode 100644 index 00000000..cfcc378b --- /dev/null +++ b/search/variables_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['maximum_5ftorque_515',['maximum_torque',['../structvulp_1_1actuation_1_1BulletJointProperties.html#a3af3193c4278dbdb8f9983239ef67b9d',1,'vulp::actuation::BulletJointProperties']]], + ['monitor_5fcontacts_516',['monitor_contacts',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aae8ee9b622e192f083fa7cc10d869ff6',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_b.html b/search/variables_b.html new file mode 100644 index 00000000..f376b27a --- /dev/null +++ b/search/variables_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_b.js b/search/variables_b.js new file mode 100644 index 00000000..6f557493 --- /dev/null +++ b/search/variables_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['num_5fcontact_5fpoints_517',['num_contact_points',['../structvulp_1_1actuation_1_1BulletContactData.html#ad28b8a81095edc4f3975e7b44ccd67a3',1,'vulp::actuation::BulletContactData']]] +]; diff --git a/search/variables_c.html b/search/variables_c.html new file mode 100644 index 00000000..6019eba9 --- /dev/null +++ b/search/variables_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_c.js b/search/variables_c.js new file mode 100644 index 00000000..f39d6b53 --- /dev/null +++ b/search/variables_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['observer_5fpipeline_5f_518',['observer_pipeline_',['../classvulp_1_1spine_1_1Spine.html#a5aae68ebd2f703f2c2dfdeb54f99c0a5',1,'vulp::spine::Spine']]], + ['orientation_5fbase_5fin_5fworld_519',['orientation_base_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab6c2a786fa1a05366e2478920f91503a',1,'vulp::actuation::BulletInterface::Parameters']]], + ['orientation_5fimu_5fin_5fars_520',['orientation_imu_in_ars',['../structvulp_1_1actuation_1_1ImuData.html#a044618ce2e107e6c3b9372da39b69efe',1,'vulp::actuation::ImuData']]] +]; diff --git a/search/variables_d.html b/search/variables_d.html new file mode 100644 index 00000000..f61ae751 --- /dev/null +++ b/search/variables_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_d.js b/search/variables_d.js new file mode 100644 index 00000000..8249d826 --- /dev/null +++ b/search/variables_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['position_5fbase_5fin_5fworld_521',['position_base_in_world',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#abdb2f8b2389319f7f266df01007c995d',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_e.html b/search/variables_e.html new file mode 100644 index 00000000..7bfd3721 --- /dev/null +++ b/search/variables_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_e.js b/search/variables_e.js new file mode 100644 index 00000000..3b4352f1 --- /dev/null +++ b/search/variables_e.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['right_5fbytes_522',['RIGHT_BYTES',['../Keyboard_8h.html#adeec831a3176c6cfbd9eb8e8f982aa59',1,'Keyboard.h']]], + ['robot_5furdf_5fpath_523',['robot_urdf_path',['../structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a149f12313d0d349d14c084174b4eea5f',1,'vulp::actuation::BulletInterface::Parameters']]] +]; diff --git a/search/variables_f.html b/search/variables_f.html new file mode 100644 index 00000000..d97920d0 --- /dev/null +++ b/search/variables_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_f.js b/search/variables_f.js new file mode 100644 index 00000000..ad086b93 --- /dev/null +++ b/search/variables_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['shm_5fname_524',['shm_name',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a4a6d1c2214abf52d3a6d2714fc4526d4',1,'vulp::spine::Spine::Parameters']]], + ['shm_5fsize_525',['shm_size',['../structvulp_1_1spine_1_1Spine_1_1Parameters.html#a0639895ce6ca39911eaa55b303582258',1,'vulp::spine::Spine::Parameters']]], + ['state_5fcycle_5fbeginning_5f_526',['state_cycle_beginning_',['../classvulp_1_1spine_1_1Spine.html#a3a39717160c48c39e6b13fab3f82f036',1,'vulp::spine::Spine']]], + ['state_5fcycle_5fend_5f_527',['state_cycle_end_',['../classvulp_1_1spine_1_1Spine.html#a3cb0cc80e3ee3412f6c84c9cdc87f6aa',1,'vulp::spine::Spine']]], + ['state_5fmachine_5f_528',['state_machine_',['../classvulp_1_1spine_1_1Spine.html#a54ac730b1f049078c57e578373b9d421',1,'vulp::spine::Spine']]] +]; diff --git a/serialize_8py.html b/serialize_8py.html new file mode 100644 index 00000000..46eb9706 --- /dev/null +++ b/serialize_8py.html @@ -0,0 +1,117 @@ + + + + + + + +vulp: vulp/utils/serialize.py File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    serialize.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Namespaces

     vulp.utils.serialize
     
    + + + + +

    +Functions

    def vulp.utils.serialize.serialize (obj)
     Serialize an object for message packing. More...
     
    +
    +
    + + + + diff --git a/serialize_8py.js b/serialize_8py.js new file mode 100644 index 00000000..2a28fd2b --- /dev/null +++ b/serialize_8py.js @@ -0,0 +1,4 @@ +var serialize_8py = +[ + [ "serialize", "serialize_8py.html#a0cb702d04af978c6ba56320ecd0068f1", null ] +]; \ No newline at end of file diff --git a/serialize_8py_source.html b/serialize_8py_source.html new file mode 100644 index 00000000..9bbe6d98 --- /dev/null +++ b/serialize_8py_source.html @@ -0,0 +1,137 @@ + + + + + + + +vulp: vulp/utils/serialize.py Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    serialize.py
    +
    +
    +Go to the documentation of this file.
    1 #!/usr/bin/env python3
    +
    2 # -*- coding: utf-8 -*-
    +
    3 #
    +
    4 # SPDX-License-Identifier: Apache-2.0
    +
    5 # Copyright 2022 Stéphane Caron
    +
    6 # Copyright 2023 Inria
    +
    7 
    +
    8 
    +
    9 def serialize(obj):
    +
    10  """!
    +
    11  Serialize an object for message packing.
    +
    12 
    +
    13  @param obj Object to serialize.
    +
    14 
    +
    15  @returns Serialized object.
    +
    16 
    +
    17  @note Calling the numpy conversion is much faster than the default list
    +
    18  constructor:
    +
    19 
    +
    20  @code{python}
    +
    21  In [1]: x = random.random(6)
    +
    22 
    +
    23  In [2]: %timeit list(x)
    +
    24  789 ns ± 5.79 ns per loop (mean ± std. dev. of 7 runs, 1e6 loops each)
    +
    25 
    +
    26  In [3]: %timeit x.tolist()
    +
    27  117 ns ± 0.865 ns per loop (mean ± std. dev. of 7 runs, 1e7 loops each)
    +
    28  @endcode
    +
    29  """
    +
    30  if hasattr(obj, "tolist"): # numpy.ndarray
    +
    31  return obj.tolist()
    +
    32  elif hasattr(obj, "np"): # pinocchio.SE3
    +
    33  return obj.np.tolist()
    +
    34  elif hasattr(obj, "serialize"): # more complex objects
    +
    35  return obj.serialize()
    +
    36  return obj
    +
    def serialize(obj)
    Serialize an object for message packing.
    Definition: serialize.py:9
    +
    +
    + + + + diff --git a/spine_2____init_____8py.html b/spine_2____init_____8py.html new file mode 100644 index 00000000..710225b4 --- /dev/null +++ b/spine_2____init_____8py.html @@ -0,0 +1,111 @@ + + + + + + + +vulp: vulp/spine/__init__.py File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    __init__.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     vulp.spine
     Inter-process communication protocol with the spine.
     
    +
    +
    + + + + diff --git a/spine_2____init_____8py.js b/spine_2____init_____8py.js new file mode 100644 index 00000000..9dbb554c --- /dev/null +++ b/spine_2____init_____8py.js @@ -0,0 +1,4 @@ +var spine_2____init_____8py = +[ + [ "__all__", "spine_2____init_____8py.html#a8a3fa5d6802d99a9b3dbcb1425231bde", null ] +]; \ No newline at end of file diff --git a/spine_2____init_____8py_source.html b/spine_2____init_____8py_source.html new file mode 100644 index 00000000..a9dc691f --- /dev/null +++ b/spine_2____init_____8py_source.html @@ -0,0 +1,121 @@ + + + + + + + +vulp: vulp/spine/__init__.py Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    __init__.py
    +
    +
    +Go to the documentation of this file.
    1 #!/usr/bin/env python3
    +
    2 # -*- coding: utf-8 -*-
    +
    3 #
    +
    4 # SPDX-License-Identifier: Apache-2.0
    +
    5 # Copyright 2022 Stéphane Caron
    +
    6 
    +
    7 """!
    +
    8 Python library for an agent to interact with a spine.
    +
    9 """
    +
    10 
    +
    11 from .exceptions import PerformanceIssue, SpineError, VulpException
    +
    12 from .request import Request
    +
    13 from .spine_interface import SpineInterface
    +
    14 
    +
    15 __all__ = [
    +
    16  "PerformanceIssue",
    +
    17  "Request",
    +
    18  "SpineError",
    +
    19  "SpineInterface",
    +
    20  "VulpException",
    +
    21 ]
    +
    +
    + + + + diff --git a/spine__interface_8py.html b/spine__interface_8py.html new file mode 100644 index 00000000..c0745a9f --- /dev/null +++ b/spine__interface_8py.html @@ -0,0 +1,124 @@ + + + + + + + +vulp: vulp/spine/spine_interface.py File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    spine_interface.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + +

    +Classes

    class  vulp.spine.spine_interface.SpineInterface
     Interface to interact with a spine from a Python agent. More...
     
    + + + +

    +Namespaces

     vulp.spine.spine_interface
     
    + + + + +

    +Functions

    SharedMemory vulp.spine.spine_interface.wait_for_shared_memory (str shm_name, int retries)
     Connect to the spine shared memory. More...
     
    +
    +
    + + + + diff --git a/spine__interface_8py.js b/spine__interface_8py.js new file mode 100644 index 00000000..309e599c --- /dev/null +++ b/spine__interface_8py.js @@ -0,0 +1,5 @@ +var spine__interface_8py = +[ + [ "SpineInterface", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface.html", "classvulp_1_1spine_1_1spine__interface_1_1SpineInterface" ], + [ "wait_for_shared_memory", "spine__interface_8py.html#a4c4005d1998a361e6be94accfccae083", null ] +]; \ No newline at end of file diff --git a/spine__interface_8py_source.html b/spine__interface_8py_source.html new file mode 100644 index 00000000..b15288e9 --- /dev/null +++ b/spine__interface_8py_source.html @@ -0,0 +1,345 @@ + + + + + + + +vulp: vulp/spine/spine_interface.py Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    spine_interface.py
    +
    +
    +Go to the documentation of this file.
    1 #!/usr/bin/env python3
    +
    2 # -*- coding: utf-8 -*-
    +
    3 #
    +
    4 # SPDX-License-Identifier: Apache-2.0
    +
    5 # Copyright 2022 Stéphane Caron
    +
    6 # Copyright 2024 Inria
    +
    7 
    +
    8 import logging
    +
    9 import mmap
    +
    10 import sys
    +
    11 import time
    +
    12 from multiprocessing import resource_tracker
    +
    13 from multiprocessing.shared_memory import SharedMemory
    +
    14 from time import perf_counter_ns
    +
    15 
    +
    16 import msgpack
    +
    17 
    +
    18 from vulp.utils import serialize
    +
    19 
    +
    20 from .exceptions import PerformanceIssue, SpineError
    +
    21 from .request import Request
    +
    22 
    +
    23 
    + +
    25  shm_name: str,
    +
    26  retries: int,
    +
    27 ) -> SharedMemory:
    +
    28  """!
    +
    29  Connect to the spine shared memory.
    +
    30 
    +
    31  @param shm_name Name of the shared memory object.
    +
    32  @param retries Number of times to try opening the shared-memory file.
    +
    33  @raise SpineError If the spine did not respond after the prescribed number
    +
    34  of trials.
    +
    35  """
    +
    36  # Remove leading slash if present, as SharedMemory will prepend it
    +
    37  # See https://github.com/upkie/vulp/issues/92
    +
    38  shm_name = shm_name.lstrip("/")
    +
    39 
    +
    40  for trial in range(retries):
    +
    41  if trial > 0:
    +
    42  logging.info(
    +
    43  f"Waiting for spine {shm_name} to start "
    +
    44  f"(trial {trial} / {retries})..."
    +
    45  )
    +
    46  time.sleep(1.0)
    +
    47  try:
    +
    48  shared_memory = SharedMemory(shm_name, size=0, create=False)
    +
    49  # Why we unregister: https://github.com/upkie/vulp/issues/88
    +
    50  # Upstream issue: https://github.com/python/cpython/issues/82300
    +
    51  resource_tracker.unregister(shared_memory._name, "shared_memory")
    +
    52  return shared_memory
    +
    53  except FileNotFoundError:
    +
    54  pass
    +
    55  raise SpineError(
    +
    56  f"spine {shm_name} did not respond after {retries} attempts"
    +
    57  )
    +
    58 
    +
    59 
    + +
    61 
    +
    62  """!
    +
    63  Interface to interact with a spine from a Python agent.
    +
    64  """
    +
    65 
    +
    66  _mmap: mmap.mmap
    +
    67 
    +
    68  def __init__(
    +
    69  self,
    +
    70  shm_name: str = "/vulp",
    +
    71  retries: int = 1,
    +
    72  perf_checks: bool = True,
    +
    73  ):
    +
    74  """!
    +
    75  Connect to the spine shared memory.
    +
    76 
    +
    77  @param shm_name Name of the shared memory object.
    +
    78  @param retries Number of times to try opening the shared-memory file.
    +
    79  @param perf_checks If true, run performance checks after construction.
    +
    80  """
    +
    81  shared_memory = wait_for_shared_memory(shm_name, retries)
    +
    82  self._mmap_mmap = shared_memory._mmap
    +
    83  self._packer_packer = msgpack.Packer(default=serialize, use_bin_type=True)
    +
    84  self._shared_memory_shared_memory = shared_memory
    +
    85  self._stop_waiting_stop_waiting = set([Request.kNone, Request.kError])
    +
    86  self._unpacker_unpacker = msgpack.Unpacker(raw=False)
    +
    87  if perf_checks:
    +
    88  self.__perf_checks__perf_checks()
    +
    89 
    +
    90  def __perf_checks(self):
    +
    91  packer_cls = str(msgpack.Packer)
    +
    92  unpacker_cls = str(msgpack.Unpacker)
    +
    93  if "fallback" in packer_cls or "fallback" in unpacker_cls:
    +
    94  # See https://github.com/upkie/vulp/issues/74
    +
    95  raise PerformanceIssue("msgpack is running in pure Python")
    +
    96 
    +
    97  def __del__(self):
    +
    98  """!
    +
    99  Close memory mapping.
    +
    100 
    +
    101  Note that the spine process will unlink the shared memory object, so we
    +
    102  don't unlink it here.
    +
    103  """
    +
    104  if hasattr(self, "_shared_memory"): # handle ctor exceptions
    +
    105  self._shared_memory_shared_memory.close()
    +
    106 
    +
    107  def get_observation(self) -> dict:
    +
    108  """!
    +
    109  Ask the spine to write the latest observation to shared memory.
    +
    110 
    +
    111  @returns Observation dictionary.
    +
    112 
    +
    113  @note In simulation, the first observation after a reset was collected
    +
    114  before that reset. Use @ref get_first_observation in that case to skip
    +
    115  to the first post-reset observation.
    +
    116  """
    +
    117  self._wait_for_spine_wait_for_spine()
    +
    118  self._write_request_write_request(Request.kObservation)
    +
    119  self._wait_for_spine_wait_for_spine()
    +
    120  observation = self._read_dict_read_dict()
    +
    121  return observation
    +
    122 
    +
    123  def get_first_observation(self) -> dict:
    +
    124  """!
    +
    125  Get first observation after a reset.
    +
    126 
    +
    127  @returns Observation dictionary.
    +
    128  """
    +
    129  self.get_observationget_observation() # pre-reset observation, skipped
    +
    130  return self.get_observationget_observation()
    +
    131 
    +
    132  def set_action(self, action: dict) -> None:
    +
    133  self._wait_for_spine_wait_for_spine()
    +
    134  self._write_dict_write_dict(action)
    +
    135  self._write_request_write_request(Request.kAction)
    +
    136 
    +
    137  def start(self, config: dict) -> None:
    +
    138  """!
    +
    139  Reset the spine to a new configuration.
    +
    140 
    +
    141  @param config Configuration dictionary.
    +
    142  """
    +
    143  self._wait_for_spine_wait_for_spine()
    +
    144  self._write_dict_write_dict(config)
    +
    145  self._write_request_write_request(Request.kStart)
    +
    146 
    +
    147  def stop(self) -> None:
    +
    148  """!
    +
    149  Tell the spine to stop all actuators.
    +
    150  """
    +
    151  self._wait_for_spine_wait_for_spine()
    +
    152  self._write_request_write_request(Request.kStop)
    +
    153 
    +
    154  def _read_request(self) -> int:
    +
    155  """!
    +
    156  Read current request from shared memory.
    +
    157  """
    +
    158  self._mmap_mmap.seek(0)
    +
    159  return int.from_bytes(self._mmap_mmap.read(4), byteorder=sys.byteorder)
    +
    160 
    +
    161  def _read_dict(self) -> dict:
    +
    162  """!
    +
    163  Read dictionary from shared memory.
    +
    164 
    +
    165  @returns Observation dictionary.
    +
    166  """
    +
    167  assert self._read_request_read_request() == Request.kNone
    +
    168  self._mmap_mmap.seek(0)
    +
    169  self._mmap_mmap.read(4) # skip request field
    +
    170  size = int.from_bytes(self._mmap_mmap.read(4), byteorder=sys.byteorder)
    +
    171  data = self._mmap_mmap.read(size)
    +
    172  self._unpacker_unpacker.feed(data)
    +
    173  unpacked = 0
    +
    174  last_dict = {}
    +
    175  for observation in self._unpacker_unpacker:
    +
    176  last_dict = observation
    +
    177  unpacked += 1
    +
    178  assert unpacked == 1
    +
    179  return last_dict
    +
    180 
    +
    181  def _wait_for_spine(self, timeout_ns: int = 100000000) -> None:
    +
    182  """!
    +
    183  Wait for the spine to signal itself as available, which it does by
    +
    184  setting the current request to none in shared memory.
    +
    185 
    +
    186  @param timeout_ns Don't wait for more than this duration in
    +
    187  nanoseconds.
    +
    188  @raise SpineError If the request read from spine has an error flag.
    +
    189  """
    +
    190  stop = perf_counter_ns() + timeout_ns
    +
    191  while self._read_request_read_request() not in self._stop_waiting_stop_waiting: # sets are fast
    +
    192  # Fun fact: `not in set` is 3-4x faster than `!=` on the raspi
    +
    193  # perf_counter_ns clocks ~1 us on the raspi
    +
    194  if perf_counter_ns() > stop:
    +
    195  raise TimeoutError(
    +
    196  "Spine did not process request within "
    +
    197  f"{timeout_ns / 1e6:.1f} ms, is it stopped?"
    +
    198  )
    +
    199  if self._read_request_read_request() == Request.kError:
    +
    200  self._write_request_write_request(Request.kNone)
    +
    201  raise SpineError("Invalid request, is the spine started?")
    +
    202 
    +
    203  def _write_request(self, request: int) -> None:
    +
    204  """!
    +
    205  Set request in shared memory.
    +
    206  """
    +
    207  self._mmap_mmap.seek(0)
    +
    208  self._mmap_mmap.write(request.to_bytes(4, byteorder=sys.byteorder))
    +
    209 
    +
    210  def _write_dict(self, dictionary: dict) -> None:
    +
    211  """!
    +
    212  Set the shared memory to a given dictionary.
    +
    213 
    +
    214  @param dictionary Dictionary to pack and write.
    +
    215  """
    +
    216  assert self._read_request_read_request() == Request.kNone
    +
    217  data = self._packer_packer.pack(dictionary)
    +
    218  size = len(data)
    +
    219  self._mmap_mmap.seek(0)
    +
    220  self._mmap_mmap.read(4) # skip request field
    +
    221  self._mmap_mmap.write(size.to_bytes(4, byteorder=sys.byteorder))
    +
    222  self._mmap_mmap.write(data)
    +
    Exception raised when a performance issue is detected.
    Definition: exceptions.py:15
    +
    Exception raised when the spine sets an error flag in the request field of the shared memory map.
    Definition: exceptions.py:21
    +
    Interface to interact with a spine from a Python agent.
    + + + + + +
    dict get_observation(self)
    Ask the spine to write the latest observation to shared memory.
    +
    None start(self, dict config)
    Reset the spine to a new configuration.
    +
    def __del__(self)
    Close memory mapping.
    +
    def __init__(self, str shm_name="/vulp", int retries=1, bool perf_checks=True)
    Connect to the spine shared memory.
    +
    None _write_dict(self, dict dictionary)
    + + + +
    dict get_first_observation(self)
    Get first observation after a reset.
    +
    None _wait_for_spine(self, int timeout_ns=100000000)
    +
    None stop(self)
    Tell the spine to stop all actuators.
    + + +
    SharedMemory wait_for_shared_memory(str shm_name, int retries)
    Connect to the spine shared memory.
    +
    Utility functions.
    Definition: __init__.py:1
    +
    +
    + + + + diff --git a/splitbar.png b/splitbar.png new file mode 100644 index 00000000..fe895f2c Binary files /dev/null and b/splitbar.png differ diff --git a/state-machine.png b/state-machine.png new file mode 100644 index 00000000..8b9b2576 Binary files /dev/null and b/state-machine.png differ diff --git a/structvulp_1_1actuation_1_1BulletContactData-members.html b/structvulp_1_1actuation_1_1BulletContactData-members.html new file mode 100644 index 00000000..bfa1856f --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletContactData-members.html @@ -0,0 +1,103 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vulp::actuation::BulletContactData Member List
    +
    +
    + +

    This is the complete list of members for vulp::actuation::BulletContactData, including all inherited members.

    + + +
    num_contact_pointsvulp::actuation::BulletContactData
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletContactData.html b/structvulp_1_1actuation_1_1BulletContactData.html new file mode 100644 index 00000000..d020766b --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletContactData.html @@ -0,0 +1,142 @@ + + + + + + + +vulp: vulp::actuation::BulletContactData Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::BulletContactData Struct Reference
    +
    +
    + +

    Contact information for a single link. + More...

    + +

    #include <BulletContactData.h>

    + + + + + +

    +Public Attributes

    int num_contact_points
     Number of contact points detected on link. More...
     
    +

    Detailed Description

    +

    Contact information for a single link.

    +

    This is a placeholder class that can grow later if we want to compute a net wrench from individual contact forces reported by Bullet.

    + +

    Definition at line 15 of file BulletContactData.h.

    +

    Member Data Documentation

    + +

    ◆ num_contact_points

    + +
    +
    + + + + +
    int vulp::actuation::BulletContactData::num_contact_points
    +
    + +

    Number of contact points detected on link.

    + +

    Definition at line 17 of file BulletContactData.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletContactData.js b/structvulp_1_1actuation_1_1BulletContactData.js new file mode 100644 index 00000000..b5ad1982 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletContactData.js @@ -0,0 +1,4 @@ +var structvulp_1_1actuation_1_1BulletContactData = +[ + [ "num_contact_points", "structvulp_1_1actuation_1_1BulletContactData.html#ad28b8a81095edc4f3975e7b44ccd67a3", null ] +]; \ No newline at end of file diff --git a/structvulp_1_1actuation_1_1BulletImuData-members.html b/structvulp_1_1actuation_1_1BulletImuData-members.html new file mode 100644 index 00000000..e1fb01c1 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletImuData-members.html @@ -0,0 +1,106 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vulp::actuation::BulletImuData Member List
    +
    + +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletImuData.html b/structvulp_1_1actuation_1_1BulletImuData.html new file mode 100644 index 00000000..e5413915 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletImuData.html @@ -0,0 +1,147 @@ + + + + + + + +vulp: vulp::actuation::BulletImuData Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::BulletImuData Struct Reference
    +
    +
    + +

    #include <BulletImuData.h>

    + + + + + + + + + + + + + + + +

    +Public Attributes

    Eigen::Vector3d linear_velocity_imu_in_world = Eigen::Vector3d::Zero()
     Spatial linear velocity in [m] / [s]², used to compute the acceleration. More...
     
    - Public Attributes inherited from vulp::actuation::ImuData
    Eigen::Quaterniond orientation_imu_in_ars = Eigen::Quaterniond::Identity()
     Orientation from the IMU frame to the attitude reference system (ARS) frame. More...
     
    Eigen::Vector3d angular_velocity_imu_in_imu = Eigen::Vector3d::Zero()
     Body angular velocity of the IMU frame in [rad] / [s]. More...
     
    Eigen::Vector3d linear_acceleration_imu_in_imu = Eigen::Vector3d::Zero()
     Body linear acceleration of the IMU, in [m] / [s]². More...
     
    +

    Detailed Description

    +
    +

    Definition at line 13 of file BulletImuData.h.

    +

    Member Data Documentation

    + +

    ◆ linear_velocity_imu_in_world

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::BulletImuData::linear_velocity_imu_in_world = Eigen::Vector3d::Zero()
    +
    + +

    Spatial linear velocity in [m] / [s]², used to compute the acceleration.

    + +

    Definition at line 15 of file BulletImuData.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletImuData.js b/structvulp_1_1actuation_1_1BulletImuData.js new file mode 100644 index 00000000..d4a62e27 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletImuData.js @@ -0,0 +1,4 @@ +var structvulp_1_1actuation_1_1BulletImuData = +[ + [ "linear_velocity_imu_in_world", "structvulp_1_1actuation_1_1BulletImuData.html#a7f574fca8e18c6351fd502aa700240cc", null ] +]; \ No newline at end of file diff --git a/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters-members.html b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters-members.html new file mode 100644 index 00000000..c33f5e1e --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters-members.html @@ -0,0 +1,121 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + + + + + + diff --git a/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html new file mode 100644 index 00000000..0bb73167 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html @@ -0,0 +1,580 @@ + + + + + + + +vulp: vulp::actuation::BulletInterface::Parameters Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::BulletInterface::Parameters Struct Reference
    +
    +
    + +

    Interface parameters. + More...

    + +

    #include <BulletInterface.h>

    + + + + + + + + + + + +

    +Public Member Functions

     Parameters ()=default
     Keep default constructor. More...
     
     Parameters (const Dictionary &config)
     Initialize from global configuration. More...
     
    void configure (const Dictionary &config)
     Configure from dictionary. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    std::string argv0 = ""
     Value of argv[0] used to locate runfiles (e.g. More...
     
    std::vector< std::string > monitor_contacts
     Contacts to monitor and report along with observations. More...
     
    double dt = std::numeric_limits<double>::quiet_NaN()
     Simulation timestep in [s]. More...
     
    bool follower_camera = false
     Translate the camera to follow the robot. More...
     
    bool gravity = true
     If true, set gravity to -9.81 m/s². More...
     
    bool floor = true
     If true, load a floor plane. More...
     
    bool gui = false
     If true, fire up the graphical user interface. More...
     
    std::string robot_urdf_path
     Path to the URDF model of the robot. More...
     
    std::vector< std::string > env_urdf_paths
     Paths to environment URDFs to load. More...
     
    double torque_control_kd = 1.0
     Gain for joint velocity control feedback. More...
     
    double torque_control_kp = 20.0
     Gain for joint position control feedback. More...
     
    Eigen::Vector3d position_base_in_world = Eigen::Vector3d::Zero()
     Position of the base in the world frame upon reset. More...
     
    Eigen::Quaterniond orientation_base_in_world
     Orientation of the base in the world frame upon reset. More...
     
    Eigen::Vector3d linear_velocity_base_to_world_in_world
     Linear velocity of the base in the world frame upon reset. More...
     
    Eigen::Vector3d angular_velocity_base_in_base = Eigen::Vector3d::Zero()
     Body angular velocity of the base upon reset. More...
     
    std::map< std::string, double > joint_friction
     Joint friction parameters. More...
     
    +

    Detailed Description

    +

    Interface parameters.

    + +

    Definition at line 28 of file BulletInterface.h.

    +

    Constructor & Destructor Documentation

    + +

    ◆ Parameters() [1/2]

    + +
    +
    + + + + + +
    + + + + + + + +
    vulp::actuation::BulletInterface::Parameters::Parameters ()
    +
    +default
    +
    + +

    Keep default constructor.

    + +
    +
    + +

    ◆ Parameters() [2/2]

    + +
    +
    + + + + + +
    + + + + + + + + +
    vulp::actuation::BulletInterface::Parameters::Parameters (const Dictionary & config)
    +
    +inlineexplicit
    +
    + +

    Initialize from global configuration.

    +
    Parameters
    + + +
    [in]configGlobal configuration dictionary.
    +
    +
    + +

    Definition at line 36 of file BulletInterface.h.

    + +
    +
    +

    Member Function Documentation

    + +

    ◆ configure()

    + +
    +
    + + + + + +
    + + + + + + + + +
    void vulp::actuation::BulletInterface::Parameters::configure (const Dictionary & config)
    +
    +inline
    +
    + +

    Configure from dictionary.

    +
    Parameters
    + + +
    [in]configGlobal configuration dictionary.
    +
    +
    + +

    Definition at line 42 of file BulletInterface.h.

    + +
    +
    +

    Member Data Documentation

    + +

    ◆ angular_velocity_base_in_base

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::BulletInterface::Parameters::angular_velocity_base_in_base = Eigen::Vector3d::Zero()
    +
    + +

    Body angular velocity of the base upon reset.

    + +

    Definition at line 158 of file BulletInterface.h.

    + +
    +
    + +

    ◆ argv0

    + +
    +
    + + + + +
    std::string vulp::actuation::BulletInterface::Parameters::argv0 = ""
    +
    + +

    Value of argv[0] used to locate runfiles (e.g.

    +

    plane.urdf) in Bazel.

    +

    This value helps find runfiles because Bazel does not seem to set the RUNFILES_MANIFEST_FILE environment variable from cc_binary rules, although in a similar context it does set it from py_binary rules that depend on "@rules_python//python/runfiles". When RUNFILES_MANIFEST_FILE is unset, knowing argv[0] triggers an alternative way to find runfiles.

    +

    The following issues are related:

    +

    https://github.com/bazelbuild/bazel/issues/4586 https://github.com/bazelbuild/bazel/issues/7994

    + +

    Definition at line 105 of file BulletInterface.h.

    + +
    +
    + +

    ◆ dt

    + +
    +
    + + + + +
    double vulp::actuation::BulletInterface::Parameters::dt = std::numeric_limits<double>::quiet_NaN()
    +
    + +

    Simulation timestep in [s].

    + +

    Definition at line 111 of file BulletInterface.h.

    + +
    +
    + +

    ◆ env_urdf_paths

    + +
    +
    + + + + +
    std::vector<std::string> vulp::actuation::BulletInterface::Parameters::env_urdf_paths
    +
    + +

    Paths to environment URDFs to load.

    + +

    Definition at line 138 of file BulletInterface.h.

    + +
    +
    + +

    ◆ floor

    + +
    +
    + + + + +
    bool vulp::actuation::BulletInterface::Parameters::floor = true
    +
    + +

    If true, load a floor plane.

    + +

    Definition at line 120 of file BulletInterface.h.

    + +
    +
    + +

    ◆ follower_camera

    + +
    +
    + + + + +
    bool vulp::actuation::BulletInterface::Parameters::follower_camera = false
    +
    + +

    Translate the camera to follow the robot.

    + +

    Definition at line 114 of file BulletInterface.h.

    + +
    +
    + +

    ◆ gravity

    + +
    +
    + + + + +
    bool vulp::actuation::BulletInterface::Parameters::gravity = true
    +
    + +

    If true, set gravity to -9.81 m/s².

    + +

    Definition at line 117 of file BulletInterface.h.

    + +
    +
    + +

    ◆ gui

    + +
    +
    + + + + +
    bool vulp::actuation::BulletInterface::Parameters::gui = false
    +
    + +

    If true, fire up the graphical user interface.

    + +

    Definition at line 123 of file BulletInterface.h.

    + +
    +
    + +

    ◆ joint_friction

    + +
    +
    + + + + +
    std::map<std::string, double> vulp::actuation::BulletInterface::Parameters::joint_friction
    +
    + +

    Joint friction parameters.

    + +

    Definition at line 161 of file BulletInterface.h.

    + +
    +
    + +

    ◆ linear_velocity_base_to_world_in_world

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::BulletInterface::Parameters::linear_velocity_base_to_world_in_world
    +
    +Initial value:
    =
    +
    Eigen::Vector3d::Zero()
    +
    +

    Linear velocity of the base in the world frame upon reset.

    + +

    Definition at line 154 of file BulletInterface.h.

    + +
    +
    + +

    ◆ monitor_contacts

    + +
    +
    + + + + +
    std::vector<std::string> vulp::actuation::BulletInterface::Parameters::monitor_contacts
    +
    + +

    Contacts to monitor and report along with observations.

    + +

    Definition at line 108 of file BulletInterface.h.

    + +
    +
    + +

    ◆ orientation_base_in_world

    + +
    +
    + + + + +
    Eigen::Quaterniond vulp::actuation::BulletInterface::Parameters::orientation_base_in_world
    +
    +Initial value:
    =
    +
    Eigen::Quaterniond::Identity()
    +
    +

    Orientation of the base in the world frame upon reset.

    + +

    Definition at line 150 of file BulletInterface.h.

    + +
    +
    + +

    ◆ position_base_in_world

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::BulletInterface::Parameters::position_base_in_world = Eigen::Vector3d::Zero()
    +
    + +

    Position of the base in the world frame upon reset.

    + +

    Definition at line 147 of file BulletInterface.h.

    + +
    +
    + +

    ◆ robot_urdf_path

    + +
    +
    + + + + +
    std::string vulp::actuation::BulletInterface::Parameters::robot_urdf_path
    +
    + +

    Path to the URDF model of the robot.

    +

    A path from the root of the Bazel workspace works. For instance, use "models/upkie_description/urdf/upkie.urdf" to load the URDF from Bazel data such as data = ["//models/upkie_description"].

    +

    For external targets, add the "external/" prefix. For instance, use "external/upkie_description/urdf/upkie.urdf" to load the URDF from Bazel data loaded from a dependency: data = ["@upkie_description"].

    + +

    Definition at line 135 of file BulletInterface.h.

    + +
    +
    + +

    ◆ torque_control_kd

    + +
    +
    + + + + +
    double vulp::actuation::BulletInterface::Parameters::torque_control_kd = 1.0
    +
    + +

    Gain for joint velocity control feedback.

    + +

    Definition at line 141 of file BulletInterface.h.

    + +
    +
    + +

    ◆ torque_control_kp

    + +
    +
    + + + + +
    double vulp::actuation::BulletInterface::Parameters::torque_control_kp = 20.0
    +
    + +

    Gain for joint position control feedback.

    + +

    Definition at line 144 of file BulletInterface.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.js b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.js new file mode 100644 index 00000000..f11f6bbe --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.js @@ -0,0 +1,22 @@ +var structvulp_1_1actuation_1_1BulletInterface_1_1Parameters = +[ + [ "Parameters", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab4144bd528ea4d7fce753a80f8f2a998", null ], + [ "Parameters", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a71e309bd3ceb8c7c19bcef4fcdd40cab", null ], + [ "configure", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aeeda8f2c234ee17f55c2aa485ef47d6f", null ], + [ "angular_velocity_base_in_base", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab780b0fcbc751d13b2d5ad7ede7287c8", null ], + [ "argv0", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ada0f9a2c0ee7a3a7fca7308ac3cf12a1", null ], + [ "dt", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5569419c2647379d927567fe26253cc7", null ], + [ "env_urdf_paths", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#acba555f40d7d6dbd77f3643b84573fb1", null ], + [ "floor", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a9e842b4a697299725aa500a6e038238b", null ], + [ "follower_camera", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af5c2135bac4715f7e17f3834f9940d4d", null ], + [ "gravity", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a3dd3900c6fc0d5e0f9d1eaed35888e5a", null ], + [ "gui", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a5f8872bb8b7c460ccd28796fda7428c3", null ], + [ "joint_friction", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aa84c7bf26a08e22a0cd3de02eab3b011", null ], + [ "linear_velocity_base_to_world_in_world", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab1ddd659af5fd3c87bd623663dabbd2d", null ], + [ "monitor_contacts", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#aae8ee9b622e192f083fa7cc10d869ff6", null ], + [ "orientation_base_in_world", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#ab6c2a786fa1a05366e2478920f91503a", null ], + [ "position_base_in_world", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#abdb2f8b2389319f7f266df01007c995d", null ], + [ "robot_urdf_path", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a149f12313d0d349d14c084174b4eea5f", null ], + [ "torque_control_kd", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#a7bfc34eaf6e26490704ed26a8e8eefa9", null ], + [ "torque_control_kp", "structvulp_1_1actuation_1_1BulletInterface_1_1Parameters.html#af2f8b2aca20f8dea3f9001c961543d1c", null ] +]; \ No newline at end of file diff --git a/structvulp_1_1actuation_1_1BulletJointProperties-members.html b/structvulp_1_1actuation_1_1BulletJointProperties-members.html new file mode 100644 index 00000000..b32a77ef --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletJointProperties-members.html @@ -0,0 +1,104 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vulp::actuation::BulletJointProperties Member List
    +
    + +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletJointProperties.html b/structvulp_1_1actuation_1_1BulletJointProperties.html new file mode 100644 index 00000000..c2712f81 --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletJointProperties.html @@ -0,0 +1,162 @@ + + + + + + + +vulp: vulp::actuation::BulletJointProperties Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::BulletJointProperties Struct Reference
    +
    +
    + +

    Properties for robot joints in the Bullet simulation. + More...

    + +

    #include <BulletJointProperties.h>

    + + + + + + + + +

    +Public Attributes

    double friction = 0.0
     Kinetic friction, in N.m. More...
     
    double maximum_torque = 0.0
     Maximum torque, in N.m. More...
     
    +

    Detailed Description

    +

    Properties for robot joints in the Bullet simulation.

    + +

    Definition at line 13 of file BulletJointProperties.h.

    +

    Member Data Documentation

    + +

    ◆ friction

    + +
    +
    + + + + +
    double vulp::actuation::BulletJointProperties::friction = 0.0
    +
    + +

    Kinetic friction, in N.m.

    + +

    Definition at line 15 of file BulletJointProperties.h.

    + +
    +
    + +

    ◆ maximum_torque

    + +
    +
    + + + + +
    double vulp::actuation::BulletJointProperties::maximum_torque = 0.0
    +
    + +

    Maximum torque, in N.m.

    + +

    Definition at line 18 of file BulletJointProperties.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1BulletJointProperties.js b/structvulp_1_1actuation_1_1BulletJointProperties.js new file mode 100644 index 00000000..697d6c8e --- /dev/null +++ b/structvulp_1_1actuation_1_1BulletJointProperties.js @@ -0,0 +1,5 @@ +var structvulp_1_1actuation_1_1BulletJointProperties = +[ + [ "friction", "structvulp_1_1actuation_1_1BulletJointProperties.html#ac61ae286b06ef66415212bf8c97bbc56", null ], + [ "maximum_torque", "structvulp_1_1actuation_1_1BulletJointProperties.html#a3af3193c4278dbdb8f9983239ef67b9d", null ] +]; \ No newline at end of file diff --git a/structvulp_1_1actuation_1_1ImuData-members.html b/structvulp_1_1actuation_1_1ImuData-members.html new file mode 100644 index 00000000..7ad0572e --- /dev/null +++ b/structvulp_1_1actuation_1_1ImuData-members.html @@ -0,0 +1,105 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vulp::actuation::ImuData Member List
    +
    + +
    + + + + diff --git a/structvulp_1_1actuation_1_1ImuData.html b/structvulp_1_1actuation_1_1ImuData.html new file mode 100644 index 00000000..1bcc22a3 --- /dev/null +++ b/structvulp_1_1actuation_1_1ImuData.html @@ -0,0 +1,188 @@ + + + + + + + +vulp: vulp::actuation::ImuData Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp::actuation::ImuData Struct Reference
    +
    +
    + +

    Data filtered from an onboard IMU such as the pi3hat's. + More...

    + +

    #include <ImuData.h>

    + + + + + + + + + + + +

    +Public Attributes

    Eigen::Quaterniond orientation_imu_in_ars = Eigen::Quaterniond::Identity()
     Orientation from the IMU frame to the attitude reference system (ARS) frame. More...
     
    Eigen::Vector3d angular_velocity_imu_in_imu = Eigen::Vector3d::Zero()
     Body angular velocity of the IMU frame in [rad] / [s]. More...
     
    Eigen::Vector3d linear_acceleration_imu_in_imu = Eigen::Vector3d::Zero()
     Body linear acceleration of the IMU, in [m] / [s]². More...
     
    +

    Detailed Description

    +

    Data filtered from an onboard IMU such as the pi3hat's.

    + +

    Definition at line 12 of file ImuData.h.

    +

    Member Data Documentation

    + +

    ◆ angular_velocity_imu_in_imu

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::ImuData::angular_velocity_imu_in_imu = Eigen::Vector3d::Zero()
    +
    + +

    Body angular velocity of the IMU frame in [rad] / [s].

    +
    Note
    The full name of the body angular vector would be "angular velocity +IMU to world in IMU", but as for all body angular velocities, "angular +velocity Body to X in Body" is the same for all inertial frames X (that have zero velocity relative to the world frame). See for instance https://scaron.info/robotics/screw-theory.html#body-screws for the math.
    + +

    Definition at line 30 of file ImuData.h.

    + +
    +
    + +

    ◆ linear_acceleration_imu_in_imu

    + +
    +
    + + + + +
    Eigen::Vector3d vulp::actuation::ImuData::linear_acceleration_imu_in_imu = Eigen::Vector3d::Zero()
    +
    + +

    Body linear acceleration of the IMU, in [m] / [s]².

    +
    Note
    This quantity corresponds to SPI register 34 from the pi3hat https://github.com/mjbots/pi3hat/blob/master/docs/reference.md#imu-register-mapping from which gravity has been substracted out. Raw IMU data (including gravity) is returned in register 33.
    + +

    Definition at line 39 of file ImuData.h.

    + +
    +
    + +

    ◆ orientation_imu_in_ars

    + +
    +
    + + + + +
    Eigen::Quaterniond vulp::actuation::ImuData::orientation_imu_in_ars = Eigen::Quaterniond::Identity()
    +
    + +

    Orientation from the IMU frame to the attitude reference system (ARS) frame.

    +

    The attitude reference system frame has +x forward, +y right and +z down, whereas our world frame has +x forward, +y left and +z up: https://github.com/mjbots/pi3hat/blob/ab632c82bd501b9fcb6f8200df0551989292b7a1/docs/reference.md#orientation

    + +

    Definition at line 20 of file ImuData.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1actuation_1_1ImuData.js b/structvulp_1_1actuation_1_1ImuData.js new file mode 100644 index 00000000..77de01de --- /dev/null +++ b/structvulp_1_1actuation_1_1ImuData.js @@ -0,0 +1,6 @@ +var structvulp_1_1actuation_1_1ImuData = +[ + [ "angular_velocity_imu_in_imu", "structvulp_1_1actuation_1_1ImuData.html#af0388ff114c843cc5daf4b8d0f902947", null ], + [ "linear_acceleration_imu_in_imu", "structvulp_1_1actuation_1_1ImuData.html#ab7f284df90fd038642a2cdcf55165104", null ], + [ "orientation_imu_in_ars", "structvulp_1_1actuation_1_1ImuData.html#a044618ce2e107e6c3b9372da39b69efe", null ] +]; \ No newline at end of file diff --git a/structvulp_1_1spine_1_1Spine_1_1Parameters-members.html b/structvulp_1_1spine_1_1Spine_1_1Parameters-members.html new file mode 100644 index 00000000..b1db3e85 --- /dev/null +++ b/structvulp_1_1spine_1_1Spine_1_1Parameters-members.html @@ -0,0 +1,107 @@ + + + + + + + +vulp: Member List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    vulp.spine::Spine::Parameters Member List
    +
    + +
    + + + + diff --git a/structvulp_1_1spine_1_1Spine_1_1Parameters.html b/structvulp_1_1spine_1_1Spine_1_1Parameters.html new file mode 100644 index 00000000..bd0b3a13 --- /dev/null +++ b/structvulp_1_1spine_1_1Spine_1_1Parameters.html @@ -0,0 +1,225 @@ + + + + + + + +vulp: vulp.spine::Spine::Parameters Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    vulp.spine::Spine::Parameters Struct Reference
    +
    +
    + +

    Spine parameters. + More...

    + +

    #include <Spine.h>

    + + + + + + + + + + + + + + + + + +

    +Public Attributes

    int cpu = -1
     CPUID for the spine thread (-1 to disable realtime). More...
     
    unsigned frequency = 1000u
     Frequency of the spine loop in [Hz]. More...
     
    std::string log_path = "/dev/null"
     Path to output log file. More...
     
    std::string shm_name = "/vulp"
     Name of the shared memory object for inter-process communication. More...
     
    size_t shm_size = 1 * kMebibytes
     Size of the shared memory object in bytes. More...
     
    +

    Detailed Description

    +

    Spine parameters.

    + +

    Definition at line 48 of file Spine.h.

    +

    Member Data Documentation

    + +

    ◆ cpu

    + +
    +
    + + + + +
    int vulp.spine::Spine::Parameters::cpu = -1
    +
    + +

    CPUID for the spine thread (-1 to disable realtime).

    + +

    Definition at line 50 of file Spine.h.

    + +
    +
    + +

    ◆ frequency

    + +
    +
    + + + + +
    unsigned vulp.spine::Spine::Parameters::frequency = 1000u
    +
    + +

    Frequency of the spine loop in [Hz].

    + +

    Definition at line 53 of file Spine.h.

    + +
    +
    + +

    ◆ log_path

    + +
    +
    + + + + +
    std::string vulp.spine::Spine::Parameters::log_path = "/dev/null"
    +
    + +

    Path to output log file.

    + +

    Definition at line 56 of file Spine.h.

    + +
    +
    + +

    ◆ shm_name

    + +
    +
    + + + + +
    std::string vulp.spine::Spine::Parameters::shm_name = "/vulp"
    +
    + +

    Name of the shared memory object for inter-process communication.

    + +

    Definition at line 59 of file Spine.h.

    + +
    +
    + +

    ◆ shm_size

    + +
    +
    + + + + +
    size_t vulp.spine::Spine::Parameters::shm_size = 1 * kMebibytes
    +
    + +

    Size of the shared memory object in bytes.

    + +

    Definition at line 62 of file Spine.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    +
    + + + + diff --git a/structvulp_1_1spine_1_1Spine_1_1Parameters.js b/structvulp_1_1spine_1_1Spine_1_1Parameters.js new file mode 100644 index 00000000..a10fb27e --- /dev/null +++ b/structvulp_1_1spine_1_1Spine_1_1Parameters.js @@ -0,0 +1,8 @@ +var structvulp_1_1spine_1_1Spine_1_1Parameters = +[ + [ "cpu", "structvulp_1_1spine_1_1Spine_1_1Parameters.html#a64da4f7a8bd34717145d7ac821ddd20d", null ], + [ "frequency", "structvulp_1_1spine_1_1Spine_1_1Parameters.html#a5401e120945e5d09eb569d83833c5c44", null ], + [ "log_path", "structvulp_1_1spine_1_1Spine_1_1Parameters.html#adac3276df5a55e141b0820d13d30118f", null ], + [ "shm_name", "structvulp_1_1spine_1_1Spine_1_1Parameters.html#a4a6d1c2214abf52d3a6d2714fc4526d4", null ], + [ "shm_size", "structvulp_1_1spine_1_1Spine_1_1Parameters.html#a0639895ce6ca39911eaa55b303582258", null ] +]; \ No newline at end of file diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 00000000..3b443fc6 Binary files /dev/null and b/sync_off.png differ diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 00000000..e08320fb Binary files /dev/null and b/sync_on.png differ diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 00000000..3b725c41 Binary files /dev/null and b/tab_a.png differ diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 00000000..e2b4a863 Binary files /dev/null and b/tab_b.png differ diff --git a/tab_h.png b/tab_h.png new file mode 100644 index 00000000..fd5cb705 Binary files /dev/null and b/tab_h.png differ diff --git a/tab_s.png b/tab_s.png new file mode 100644 index 00000000..ab478c95 Binary files /dev/null and b/tab_s.png differ diff --git a/tabs.css b/tabs.css new file mode 100644 index 00000000..7d45d36c --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} diff --git a/utils_2____init_____8py.html b/utils_2____init_____8py.html new file mode 100644 index 00000000..5cfeb264 --- /dev/null +++ b/utils_2____init_____8py.html @@ -0,0 +1,111 @@ + + + + + + + +vulp: vulp/utils/__init__.py File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    +
    __init__.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + +

    +Namespaces

     vulp.utils
     Utility functions.
     
    +
    +
    + + + + diff --git a/utils_2____init_____8py.js b/utils_2____init_____8py.js new file mode 100644 index 00000000..ad807f07 --- /dev/null +++ b/utils_2____init_____8py.js @@ -0,0 +1,4 @@ +var utils_2____init_____8py = +[ + [ "__all__", "utils_2____init_____8py.html#a65dbe76c6a061bce5651e1ddd7d00b13", null ] +]; \ No newline at end of file diff --git a/utils_2____init_____8py_source.html b/utils_2____init_____8py_source.html new file mode 100644 index 00000000..c5eb26f6 --- /dev/null +++ b/utils_2____init_____8py_source.html @@ -0,0 +1,110 @@ + + + + + + + +vulp: vulp/utils/__init__.py Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    vulp +  2.4.0 +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    __init__.py
    +
    +
    +Go to the documentation of this file.
    1 #!/usr/bin/env python3
    +
    2 # -*- coding: utf-8 -*-
    +
    3 #
    +
    4 # This file helps organize documentation namespaces.
    +
    5 
    +
    6 from .serialize import serialize
    +
    7 
    +
    8 __all__ = [
    +
    9  "serialize",
    +
    10 ]
    +
    +
    + + + +