Motion Master
Loading...
Searching...
No Matches
mock_master.h
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <map>
5#include <random>
6
7#include "ethercat_master.h"
8#include "util.h"
9
10class MockSlave;
11
12class MockMaster : public EthercatMaster {
13 public:
14 explicit MockMaster(uint16_t devices);
15 ~MockMaster() override;
16
22 size_t start() override;
23
27 void stop() override;
28
36 size_t restart() override;
37
44 int32_t execute(uint64_t pending_signals) override;
45
51 bool is_running() override;
52
58 int get_slaves_responding() override;
59
65 std::list<VirtualDevice *> get_slaves() override;
66
72 bool disable_all_slaves() override;
73
74 void abort_all_client_requests() override {};
75
76 private:
77 std::map<int32_t, MockSlave *> slaves_;
78 std::atomic_bool running_;
79
80 // Motor simulation
81 std::vector<double> actual_positions_;
82 std::vector<double> actual_velocities_;
83 std::vector<double> actual_torques_;
84
85 std::vector<LowPassFilter> velocity_filters_;
86 std::vector<LowPassFilter> torque_filters_;
87
88 std::random_device random_device_;
89 std::mt19937 random_generator_;
90
91 const double inertia_ = 7.0e-5; // Inertia constant
92 const double friction_ = 5.0e-4; // Friction constant
93 const double sampling_time_ = 1000.0e-6; // One millisecond
94
95 const double a0_ =
96 sampling_time_ / (2 * inertia_ + sampling_time_ * friction_);
97 const double a1_ =
98 sampling_time_ / (2 * inertia_ + sampling_time_ * friction_);
99 const double b1_ = -1 * (sampling_time_ * friction_ - 2 * inertia_) /
100 (2 * inertia_ + sampling_time_ * friction_);
101
102 static uint32_t get_statusword(uint32_t statusword, uint32_t controlword);
103 static uint32_t get_motion_encoder_resolution(MockSlave *mock_slave);
104
105 static bool is_controlword_switch_on(uint32_t control_word);
106 static bool is_controlword_enable_voltage(uint32_t control_word);
107 static bool is_controlword_quick_stop(uint32_t control_word);
108 static bool is_controlword_enable_op(uint32_t control_word);
109 static bool is_controlword_fault_reset(uint32_t control_word);
110 static bool ctrl_shutdown(uint32_t control_word);
111 static bool ctrl_switch_on(uint32_t control_word);
112 static bool ctrl_disable_volt(uint32_t control_word);
113 static bool ctrl_quick_stop(uint32_t control_word);
114 static bool ctrl_disable_op(uint32_t control_word);
115 static bool ctrl_enable_op(uint32_t control_word);
116 static bool ctrl_communication_timeout(uint32_t control_word);
117};
Definition: ethercat_master.h:9
Definition: mock_master.h:12
int get_slaves_responding() override
Return the number of slaves.
Definition: mock_master.cc:253
~MockMaster() override
Definition: mock_master.cc:67
bool is_running() override
Definition: mock_master.cc:89
bool disable_all_slaves() override
Switch all slaves to PREOP.
Definition: mock_master.cc:263
void abort_all_client_requests() override
Definition: mock_master.h:74
std::list< VirtualDevice * > get_slaves() override
Get all of the available slaves.
Definition: mock_master.cc:255
size_t start() override
Start the mock master.
Definition: mock_master.cc:73
int32_t execute(uint64_t pending_signals) override
Main mock master loop function to be executed at one millisecond interval.
Definition: mock_master.cc:91
void stop() override
Stop the mock master.
Definition: mock_master.cc:81
size_t restart() override
Restart the mock master.
Definition: mock_master.cc:87
Definition: mock_slave.h:10