Main Page · Modules · All Classes · Class Hierarchy
MATailController.cpp
1 /*
2  * This file is part of the AiBO+ project
3  *
4  * Copyright (C) 2005-2016 Csaba Kertész (csaba.kertesz@gmail.com)
5  *
6  * AiBO+ is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * AiBO+ is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
19  *
20  */
21 
22 #include "MATailController.hpp"
23 
24 #include "core/MADevice.hpp"
25 #include "core/MAValueGenerators.hpp"
26 #include "types/skits/MAMotionSkit.hpp"
27 #include "types/MARobotState.hpp"
28 #include "types/MATypeRanges.hpp"
29 #include "types/MATorso.hpp"
30 
31 #include <MCLog.hpp>
32 
33 namespace MA
34 {
36 }
37 
39 {
40  if (MA::Tail.get())
41  {
42  MC_WARNING("The global tail controller is overridden.");
43  }
44  MA::Tail.reset(this);
45  MA_BIND_TRANSITION_ACTION(MATailController, Wag);
46  MA_BIND_TRANSITION(MATailController, ToBack, IsAtBack);
47 }
48 
49 
51 {
52  if (MA::Tail.get() == this)
53  MA::Tail.release();
54 }
55 
56 
58 {
59  state.Torso->TailPan = (int)TailPan->GetSensorValue();
60  state.Torso->TailPanForce = (int)TailPan->GetForce();
61  state.Torso->TailTilt = (int)TailTilt->GetSensorValue();
62  state.Torso->TailTiltForce = (int)TailTilt->GetForce();
63 }
64 
65 
66 MA::DeviceList MATailController::GetMotors() const
67 {
68  MA::DeviceList Motors;
69 
70  Motors.push_back(TailTilt.get());
71  Motors.push_back(TailPan.get());
72  return Motors;
73 }
74 
75 
76 void MATailController::SetPower(bool new_state)
77 {
78  // Clear the generators when switching off the joints
79  if (!new_state)
80  Stop();
81 
82  TailTilt->SetPower(new_state);
83  TailPan->SetPower(new_state);
84 }
85 
86 
87 bool MATailController::IsPowerOn()
88 {
89  return TailTilt->IsPowerOn() && TailPan->IsPowerOn();
90 }
91 
92 
93 bool MATailController::IsMoving()
94 {
95  return TailTilt->HasGenerator() || TailPan->HasGenerator();
96 }
97 
98 
99 void MATailController::Stop()
100 {
101  TailPan->ClearGenerators();
102  TailTilt->ClearGenerators();
103 }
104 
105 
107 MA::DeviceGeneratorsMap MATailController::Wag()
108 {
109  MA::DeviceGeneratorsMap DeviceGenerators;
110 
111  SetPower(true);
112  // Move close to the body
113  MASimpleGenerator* Generator = nullptr;
114  float OneThird = (float)MA::TailTiltMin+(float)(MA::TailTiltMax-MA::TailTiltMin) / 3;
115 
116  TailTilt->ClearGenerators();
117  Generator = new MASimpleGenerator(TailTilt->GetSensorValue(), (float)MA::TailTiltMin, 200);
118  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator));
119 
120  TailPan->ClearGenerators();
121  Generator = new MASimpleGenerator(TailPan->GetSensorValue(), 0.0, 200);
122  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailPan.get(), TailPan->AddGenerator(*Generator));
123 
124  // Start to wag the tail
125  MAPeriodicGenerator* Generator2 = nullptr;
126 
127  Generator2 = new MAPeriodicGenerator((float)MA::TailTiltMin, OneThird, 0, 200, 0, 200, 0);
128  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator2));
129  Generator2 = new MAPeriodicGenerator((float)MA::TailTiltMin, OneThird, 0, 200, 0, 200, 0);
130  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator2));
131  Generator2 = new MAPeriodicGenerator((float)MA::TailTiltMin, OneThird, 0, 200, 0, 200, 0);
132  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator2));
133  Generator2 = new MAPeriodicGenerator((float)MA::TailTiltMin, OneThird, 0, 200, 0, 200, 0);
134  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator2));
135  return DeviceGenerators;
136 }
137 
138 
139 MA::DeviceGeneratorsMap MATailController::ToBack()
140 {
141  MASimpleGenerator* Generator = nullptr;
142  MA::DeviceGeneratorsMap DeviceGenerators;
143 
144  SetPower(true);
145  TailTilt->ClearGenerators();
146  Generator = new MASimpleGenerator(TailTilt->GetSensorValue(), (float)MA::TailTiltMin, 500);
147  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), TailTilt->AddGenerator(*Generator));
148 
149  TailPan->ClearGenerators();
150  Generator = new MASimpleGenerator(TailPan->GetSensorValue(), 0.0, 500);
151  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailPan.get(), TailPan->AddGenerator(*Generator));
152  return DeviceGenerators;
153 }
154 
155 
156 bool MATailController::IsAtBack() const
157 {
158  bool Ret = true;
159 
160  Ret = Ret && MCRangeCheck((int)TailPan->GetSensorValue(), -20, 20);
161  Ret = Ret && MCRangeCheck((int)TailTilt->GetSensorValue(), -20, 20);
162  return Ret;
163 }
165 
166 
167 MA::DeviceGeneratorsMap MATailController::GetSkitTransitionGenerators(MA::SkitBaseSPtr skit)
168 {
169  MAMotionSkit* MotionSkit = dynamic_cast<MAMotionSkit*>(skit.get());
170 
171  if (!MotionSkit)
172  return MA::DeviceGeneratorsMap();
173 
174  MA::DeviceGeneratorsMap DeviceGenerators;
175  MAGeneratorContainer* Container = nullptr;
176 
177  SetPower(true);
178  // Tilt
179  Container = MotionSkit->GetGeneratorContainer(MA::TailTilt);
180  TailTilt->ClearGenerators();
181  TailTilt->AddGeneratorContainer(*Container);
182  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailTilt.get(), Container);
183  // Pan
184  Container = MotionSkit->GetGeneratorContainer(MA::TailPan);
185  TailPan->ClearGenerators();
186  TailPan->AddGeneratorContainer(*Container);
187  MA_INSERT_DEVICEGENERATOR(DeviceGenerators, TailPan.get(), Container);
188  return DeviceGenerators;
189 }
virtual MA::DeviceList GetMotors() const override
Get the list of the motors.
boost::shared_ptr< MADevice > TailPan
Tail pan.
bool MCRangeCheck(const T &value, const T &min, const T &max)
Range check of a value.
Definition: MCDefs.hpp:544
MATailController()
Class constructor.
virtual ~MATailController()
Class destructor.
#define MC_WARNING(...)
Warning macro.
Definition: MCLog.hpp:43
Base class for the controllers.
Simple generator class.
virtual void UpdateRobotState(MARobotState &state) override
Update the robot state.
virtual MA::DeviceGeneratorsMap GetSkitTransitionGenerators(MA::SkitBaseSPtr skit) override
Get skit transition generators.
boost::shared_ptr< MADevice > TailTilt
Tail tilt.
Generator container class.
MAGeneratorContainer * GetGeneratorContainer(MA::Leg::LegTypes leg, MA::LegJointsType joint) const
Get generator container for a leg joint.
Motion sequence (motion skit) class.
Tail controller class.
A wrapper class to cover boost::thread_specific_ptr/folly::ThreadLocal API on certain targets...
boost::scoped_ptr< MATorso > Torso
Torso.
Periodic generator class (waveform _/‾\_)
Robot state.