Chassisを用いて手動制御、自己位置推定、自動制御を行う方法を示す。 下記の例ではMotor.hを使用している。
手動制御
frameモジュールを用いる。 例はOmniを制御するものである。
インスタンスの生成
Omni<3> omni{[](std::array<float, 3> pwm) {
for(int i = 0; i < 3; ++i) {
motors[i] = pwm[i];
}
}};
移動速度を渡してモータ出力を計算しモータにセットする。
Velocity vel = {0, 0.5, 0};
omni.move(vel);
自己位置推定
localizationモジュールを用いる。
3#include <../snippets/Motor.h>
19 odom.integrate({0, 0, 0});
25 auto now = timer.elapsed_time();
26 static decltype(
now)
pre = {};
35 printf(
"pos{x:%d,y:%d:,ang:%d}", (
int)
pos.x_milli, (
int)
pos.y_milli, (
int)(
pos.ang_rad * 180 /
M_PI));
36 printf(
"vel{x:%d,y:%d:,ang:%d}", (
int)
vel.x_milli, (
int)
vel.y_milli, (
int)(
vel.ang_rad * 180 /
M_PI));
自動制御
chassisモジュールを用いる。
3#include <../snippets/Motor.h>
7#include <PollingTimer.h>
19 for(
int i = 0;
i < 3; ++
i) {
31 odom.integrate({0, 0, 0});
32 auto now = timer.elapsed_time();
bool check_reached(const Coordinate &dst, const Coordinate &pos)
hoge
足回りの位置のPID制御を行うChassisAutoを提供する。
constexpr float distance(const Coordinate &p1, const Coordinate &p2)
2つの座標間の距離を計算する。
4輪独立ステアリング
インスタンスの生成
for(
int i = 0;
i < 4; ++
i) {
}
}};
SteerDrive< 4 > steer
[construct]
出力
void move(const Velocity &vel, const float offset_rad=0.0)
モータへのPWM出力を計算する。その後callback関数にPWM出力を渡す。
utilityモジュール