rm_control
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
multi_actuator_transmission.h
Go to the documentation of this file.
1//
2// Created by luotinkai on 2021/12/5.
3//
4
5#pragma once
6
7#include <cassert>
8#include <string>
9#include <vector>
10
11#include <transmission_interface/transmission.h>
12#include <transmission_interface/transmission_interface_exception.h>
13
15{
16class MultiActuatorTransmission : public Transmission
17{
18public:
19 MultiActuatorTransmission(const TransmissionInfo& transmission_info, std::vector<double> actuator_reduction,
20 double joint_reduction, double joint_offset = 0.0);
21
22 void actuatorToJointEffort(const ActuatorData& act_data, JointData& jnt_data) override;
23 void actuatorToJointVelocity(const ActuatorData& act_data, JointData& jnt_data) override;
24 void actuatorToJointPosition(const ActuatorData& act_data, JointData& jnt_data) override;
25 void jointToActuatorEffort(const JointData& jnt_data, ActuatorData& act_data) override;
26 void jointToActuatorVelocity(const JointData& jnt_data, ActuatorData& act_data) override{};
27 void jointToActuatorPosition(const JointData& jnt_data, ActuatorData& act_data) override{};
28
29 std::size_t numActuators() const override
30 {
31 return act_number_;
32 }
33 std::size_t numJoints() const override
34 {
35 return 1;
36 }
37
38 const std::vector<double>& getActuatorReduction() const
39 {
40 return act_reduction_;
41 }
42 double getJointReduction() const
43 {
44 return jnt_reduction_;
45 }
46 double getJointOffset() const
47 {
48 return jnt_offset_;
49 }
50
51protected:
52 std::vector<double> act_reduction_;
54 double jnt_offset_{};
55 int act_number_ = 0;
56};
57
58MultiActuatorTransmission::MultiActuatorTransmission(const TransmissionInfo& transmission_info,
59 std::vector<double> actuator_reduction, double joint_reduction,
60 double joint_offset)
61 : act_reduction_(std::move(actuator_reduction)), jnt_reduction_(joint_reduction), jnt_offset_(joint_offset)
62{
63 act_number_ = transmission_info.actuators_.size();
64 for (int i = 1; i < act_number_; ++i)
65 {
66 if (0.0 == act_reduction_[i])
67 throw TransmissionInterfaceException("Transmission actuators reduction ratios cannot be zero.");
68 }
69 if (0.0 == jnt_reduction_)
70 throw TransmissionInterfaceException("Transmission joint reduction ratios cannot be zero.");
71}
72inline void MultiActuatorTransmission::actuatorToJointEffort(const ActuatorData& act_data, JointData& jnt_data)
73{
74 const std::vector<double>& ar = act_reduction_;
75 double ad = (*act_data.effort[0] * ar[0]);
76 for (int i = 1; i < act_number_; ++i)
77 {
78 ad = ad + (*act_data.effort[i] * ar[i]);
79 }
80 *jnt_data.effort[0] = jnt_reduction_ * ad;
81}
82
83inline void MultiActuatorTransmission::actuatorToJointVelocity(const ActuatorData& act_data, JointData& jnt_data)
84{
85 const std::vector<double>& ar = act_reduction_;
86
87 double ad = (*act_data.velocity[0] / ar[0]);
88 for (int i = 1; i < act_number_; ++i)
89 {
90 ad = ad + (*act_data.velocity[i] / ar[i]);
91 }
92 *jnt_data.velocity[0] = ad / (2.0 * jnt_reduction_);
93}
94
95inline void MultiActuatorTransmission::actuatorToJointPosition(const ActuatorData& act_data, JointData& jnt_data)
96{
97 const std::vector<double>& ar = act_reduction_;
98
99 *jnt_data.position[0] = (*act_data.position[0] / ar[0]) / jnt_reduction_ + jnt_offset_;
100}
101
102inline void MultiActuatorTransmission::jointToActuatorEffort(const JointData& jnt_data, ActuatorData& act_data)
103{
104 const std::vector<double>& ar = act_reduction_;
105
106 for (int i = 0; i < act_number_; ++i)
107 {
108 *act_data.effort[i] = (*jnt_data.effort[0] / jnt_reduction_) / (act_number_ * ar[i]);
109 }
110}
111
112} // namespace transmission_interface
Definition multi_actuator_transmission.h:17
double jnt_offset_
Definition multi_actuator_transmission.h:54
void jointToActuatorVelocity(const JointData &jnt_data, ActuatorData &act_data) override
Definition multi_actuator_transmission.h:26
double getJointReduction() const
Definition multi_actuator_transmission.h:42
void actuatorToJointPosition(const ActuatorData &act_data, JointData &jnt_data) override
Definition multi_actuator_transmission.h:95
const std::vector< double > & getActuatorReduction() const
Definition multi_actuator_transmission.h:38
void actuatorToJointVelocity(const ActuatorData &act_data, JointData &jnt_data) override
Definition multi_actuator_transmission.h:83
double jnt_reduction_
Definition multi_actuator_transmission.h:53
std::size_t numJoints() const override
Definition multi_actuator_transmission.h:33
std::size_t numActuators() const override
Definition multi_actuator_transmission.h:29
void actuatorToJointEffort(const ActuatorData &act_data, JointData &jnt_data) override
Definition multi_actuator_transmission.h:72
void jointToActuatorEffort(const JointData &jnt_data, ActuatorData &act_data) override
Definition multi_actuator_transmission.h:102
double getJointOffset() const
Definition multi_actuator_transmission.h:46
std::vector< double > act_reduction_
Definition multi_actuator_transmission.h:52
void jointToActuatorPosition(const JointData &jnt_data, ActuatorData &act_data) override
Definition multi_actuator_transmission.h:27
MultiActuatorTransmission(const TransmissionInfo &transmission_info, std::vector< double > actuator_reduction, double joint_reduction, double joint_offset=0.0)
Definition multi_actuator_transmission.h:58
int act_number_
Definition multi_actuator_transmission.h:55
Definition multi_actuator_transmission.h:15