UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
ServoSpeed.hpp
[詳解]
1//
2// サーボの動く速さを調整するクラス
3//
4// Copyright (c) 2022-2023 fujimoto ryo
5// Copyright (c) 2022-2024 udonrobo
6//
7
8//
9// 非常停止時に瞬時に止めることができる
10// 稼働速度は選択できるが、速度を上げすぎるとサーボが追い付かなくなるので注意
11//
12
13#pragma once
14
15#include <stdint.h>
16#include "Math.hpp"
17
18namespace Udon
19{
20
22 enum class ServoChoose : uint8_t
23 {
24 _20kg,
25 _30kg,
26 _60kg,
27 };
28
32 {
33 bool status = true;
34 unsigned int loopCycle, servo_preset = 0, target_angle = 0;
35 float move_angle = 0, next_angle = 0, value = 0, speed = 0, last_angle;
36
37 public:
42 ServoSpeed(unsigned int LoopCycle, ServoChoose Choose,
43 unsigned int Last_Angle = 0)
44 {
45 loopCycle = LoopCycle / 100;
46 last_angle = next_angle = static_cast<float>(Last_Angle);
47 switch (Choose)
48 {
50 // 20kgservo
51 servo_preset = 180;
52 break;
54 // 30kgservo
55 servo_preset = 180;
56 break;
58 // 60kgservo
59 servo_preset = 270;
60 break;
61 }
62 }
63
65 void update()
66 {
67 /*変化量の計算は少数で行い、計算後は整数型で返す*/
68 last_angle = next_angle; // 前周期のデータを保管しておく
69 move_angle =
70 static_cast<float>(target_angle) - static_cast<float>(last_angle);
71 if (move_angle == 0)
72 {
73 status = true;
74 }
75 else
76 {
77 status = false;
78 value = Udon::Constrain(speed / static_cast<float>(loopCycle),
79 Udon::Abs(move_angle) * -1, Udon::Abs(move_angle)) *
80 (move_angle < 0 ? -1 : 1);
81 next_angle += value;
82 next_angle = Udon::Constrain(next_angle, 0.0f, static_cast<float>(servo_preset));
83 }
84 }
85
89 void setAngle(unsigned int r, float s)
90 {
91 target_angle = r;
92 speed = s;
93 }
94
96 void stop() { next_angle = last_angle; }
97
100 bool getStatus() const { return status; }
101
104 unsigned int getAngle() const
105 {
106 return static_cast<unsigned int>(next_angle);
107 }
108
111 float speedValue() const { return speed; }
112 };
113} // namespace Udon
サーボ角度制御クラス
Definition ServoSpeed.hpp:32
bool getStatus() const
サーボの状態を返す
Definition ServoSpeed.hpp:100
void update()
サーボの状態を更新する関数 毎周期実行する
Definition ServoSpeed.hpp:65
void stop()
非常停止 今周期のデータを捨てる
Definition ServoSpeed.hpp:96
void setAngle(unsigned int r, float s)
サーボの次の動きをセットする
Definition ServoSpeed.hpp:89
ServoSpeed(unsigned int LoopCycle, ServoChoose Choose, unsigned int Last_Angle=0)
ServoSpeedのコンストラクタ
Definition ServoSpeed.hpp:42
float speedValue() const
現在設定されているサーボの稼働速度を返す
Definition ServoSpeed.hpp:111
unsigned int getAngle() const
次の目標角度取得
Definition ServoSpeed.hpp:104
Definition Bit.hpp:12
constexpr T Abs(const T &rhs)
絶対値を返す (std::abs)
Definition Math.hpp:98
constexpr A Constrain(const A &amt, const B &low, const C &high)
値を指定された範囲内に収める (std::clamp)
Definition Math.hpp:68
ServoChoose
サーボの種類選択
Definition ServoSpeed.hpp:23