2. Adım: Aktarma Sistemi Modeli Oluşturmak
Fiziksel aktarma sisteminizin belirli motor voltaj girdilerine nasıl tepki vereceğini doğru bir şekilde belirlemek için aktarma sisteminizin doğru bir modeli oluşturulmalıdır. Bu model genellikle gerçek robotunuzun çeşitli fiziksel parametreleri ölçülerek oluşturulmaktadır. WPILib’de, bu aktarma sistemi simülasyon modeli DifferentialDrivetrainSim sınıfı ile temsil edilmektedir.
Fiziksel Ölçümler Üzerinden DifferentialDrivetrainSim Oluşturulması
DifferentialDrivetrainSim örneği oluşturmanın bir yolu, ya CAD yazılımı ya da gerçek dünya ölçümleri ile elde edilmiş aktarma sistemi ile robotun fiziksel ölçümlerini kullanmaktadır (gerçek dünya ölçümleri gerçeğe daha yakın olacağı için daha iyi sonuçlar verecektir). Bu constructor aşağıdaki parametreleri kabul etmektedir:
Aktarma sisteminin bir tarafındaki motorların türü ve sayısı.
Çıktı torque’u bölü girdi torque’u olarak motor ve tekerlekler arasındaki dişli oranı (aktarma sistemleri için bu sayı genellikle 1’den büyüktür).
Aktarma sisteminin eylemsizlik momenti (bu değer aktarma sisteminizin CAD modeli üzerinden elde edilebilmektedir. Genellikle değer 3 ila 8 \(kg m^2\)’dir).
Aktarma sisteminin kütlesi (yörünge izleme için robotunuzun hızlanma özelliklerini daha doğru bir şekilde modelleyeceği için tüm robotun kütlesinin kullanılması tavsiye edilmektedir).
Sürüş tekerleklerinin yarıçapı.
İz genişliği (sol ve sağ tekerlekler arasındaki mesafe).
Ölçüm gürültüsünün standart sapmaları: Bu, gerçek sensörlerinizden ne kadar ölçüm gürültüsü beklediğinizi göstermektedir. Ölçüm gürültüsü sırasıyla x, y, yön, sol hız, sağ hız, sol konum ve sağ konumdaki ölçüm gürültüsünün standart sapmasını temsil eden 7 öğeli bir dizidir. Bu seçenek, C++’da tamamen çıkarılabilmekte veya Java’da ölçüm gürültüsü istenmiyorsa
nullolarak ayarlanabilmektedir
Ölçmeye çalıştığınız durumun birden fazla veri noktasını ele alıp Python gibi bir araç ile standart sapmayı hesaplayarak sensörünüzün ölçüm gürültüsünü hesaplayabilirsiniz. Örneğin, kodlayıcılarınızın hız tahminindeki standart sapmayı hesaplamak için, robotunuzu sabit bir hızda hareket ettirip, birden fazla ölçüm alıp bilinen aritmetik ortalamasından yola çıkarak tahminin standart sapmasını hesaplayabilirsiniz. Bu işlem çok zahmetliyse, aşağıdaki örnekte kullanılan değerler kodlayıcılardan gelen ortalama gürültünün iyi bir temsili olacaktır.
Not
Bir ölçüm için gürültünün standart sapması, ölçümle aynı birimlere sahiptir. Örneğin, hız gürültüsünün standart sapması m/s biriminde hesaplanmaktadır.
Not
Java’da parametreleri iletimi sırasında SI birimlerinin (yani metre ve radyanın) kullanımı çok önemlidir. C++ ‘da, birimler kütüphanesi herhangi bir birim türünü belirtmek için kullanılabilmektedir.
// Create the simulation model of our drivetrain.
DifferentialDrivetrainSim m_driveSim = new DifferentialDrivetrainSim(
DCMotor.getNEO(2), // 2 NEO motors on each side of the drivetrain.
7.29, // 7.29:1 gearing reduction.
7.5, // MOI of 7.5 kg m^2 (from CAD model).
60.0, // The mass of the robot is 60 kg.
Units.inchesToMeters(3), // The robot uses 3" radius wheels.
0.7112, // The track width is 0.7112 meters.
// The standard deviations for measurement noise:
// x and y: 0.001 m
// heading: 0.001 rad
// l and r velocity: 0.1 m/s
// l and r position: 0.005 m
VecBuilder.fill(0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005));
#include <frc/simulation/DifferentialDrivetrainSim.h>
...
// Create the simulation model of our drivetrain.
frc::sim::DifferentialDrivetrainSim m_driveSim{
frc::DCMotor::GetNEO(2), // 2 NEO motors on each side of the drivetrain.
7.29, // 7.29:1 gearing reduction.
7.5_kg_sq_m, // MOI of 7.5 kg m^2 (from CAD model).
60_kg, // The mass of the robot is 60 kg.
3_in, // The robot uses 3" radius wheels.
0.7112_m, // The track width is 0.7112 meters.
// The standard deviations for measurement noise:
// x and y: 0.001 m
// heading: 0.001 rad
// l and r velocity: 0.1 m/s
// l and r position: 0.005 m
{0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005}};
SysId Kazançları Üzerinden DifferentialDrivetrainSim Oluşturulması
You can also use the gains produced by System Identification, which you may have performed as part of setting up the trajectory tracking workflow outlined here to create a simulation model of your drivetrain and often yield results closer to real-world behavior than the method above.
Önemli
Tespit aracından, bir tanesi düz bir doğrunun hareketinden diğeriyse durduğu yerde dönüşten elde edilmiş, iki çift Kv ve Ka kazancı elde edilmiş olmalıdır. Bu iki kazanç çiftini sırasıyla doğrusal ve açısal olarak adlandıracağız.
Bu constructor aşağıdaki parametreleri kabul etmektedir:
Aktarma sistemini temsil eden doğrusal bir sistem. Bu sistem tespit kazançları kullanılarak oluşturulabilmektedir.
İz genişliği (sol ve sağ tekerlekler arasındaki mesafe).
Aktarma sisteminin bir tarafındaki motorların türü ve sayısı.
Çıktı torque’u bölü girdi torque’u olarak motor ve tekerlekler arasındaki dişli oranı (aktarma sistemleri için bu sayı genellikle 1’den büyüktür).
Sürüş tekerleklerinin yarıçapı.
Ölçüm gürültüsünün standart sapmaları: Bu, gerçek sensörlerinizden ne kadar ölçüm gürültüsü beklediğinizi göstermektedir. Ölçüm gürültüsü sırasıyla x, y, yön, sol hız, sağ hız, sol konum ve sağ konumdaki ölçüm gürültüsünün standart sapmasını temsil eden 7 öğeli bir dizidir. Bu seçenek, C++’da tamamen çıkarılabilmekte veya Java’da ölçüm gürültüsü istenmiyorsa
nullolarak ayarlanabilmektedir
Ölçmeye çalıştığınız durumun birden fazla veri noktasını ele alıp Python gibi bir araç ile standart sapmayı hesaplayarak sensörünüzün ölçüm gürültüsünü hesaplayabilirsiniz. Örneğin, kodlayıcılarınızın hız tahminindeki standart sapmayı hesaplamak için, robotunuzu sabit bir hızda hareket ettirip, birden fazla ölçüm alıp bilinen aritmetik ortalamasından yola çıkarak tahminin standart sapmasını hesaplayabilirsiniz. Bu işlem çok zahmetliyse, aşağıdaki örnekte kullanılan değerler kodlayıcılardan gelen ortalama gürültünün iyi bir temsili olacaktır.
Not
Bir ölçüm için gürültünün standart sapması, ölçümle aynı birimlere sahiptir. Örneğin, hız gürültüsünün standart sapması m/s biriminde hesaplanmaktadır.
Not
Java’da parametreleri iletimi sırasında SI birimlerinin (yani metre ve radyanın) kullanımı çok önemlidir. C++ ‘da, birimler kütüphanesi herhangi bir birim türünü belirtmek için kullanılabilmektedir.
// Create our feedforward gain constants (from the identification
// tool)
static final double KvLinear = 1.98;
static final double KaLinear = 0.2;
static final double KvAngular = 1.5;
static final double KaAngular = 0.3;
// Create the simulation model of our drivetrain.
private DifferentialDrivetrainSim m_driveSim = new DifferentialDrivetrainSim(
// Create a linear system from our identification gains.
LinearSystemId.identifyDrivetrainSystem(KvLinear, KaLinear, KvAngular, KaAngular),
DCMotor.getNEO(2), // 2 NEO motors on each side of the drivetrain.
7.29, // 7.29:1 gearing reduction.
0.7112, // The track width is 0.7112 meters.
Units.inchesToMeters(3), // The robot uses 3" radius wheels.
// The standard deviations for measurement noise:
// x and y: 0.001 m
// heading: 0.001 rad
// l and r velocity: 0.1 m/s
// l and r position: 0.005 m
VecBuilder.fill(0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005));
#include <frc/simulation/DifferentialDrivetrainSim.h>
#include <frc/system/plant/LinearSystemId.h>
#include <units/acceleration.h>
#include <units/angular_acceleration.h>
#include <units/angular_velocity.h>
#include <units/voltage.h>
#include <units/velocity.h>
...
// Create our feedforward gain constants (from the identification
// tool). Note that these need to have correct units.
static constexpr auto KvLinear = 1.98_V / 1_mps;
static constexpr auto KaLinear = 0.2_V / 1_mps_sq;
static constexpr auto KvAngular = 1.5_V / 1_rad_per_s;
static constexpr auto KaAngular = 0.3_V / 1_rad_per_s_sq;
// The track width is 0.7112 meters.
static constexpr auto kTrackwidth = 0.7112_m;
// Create the simulation model of our drivetrain.
frc::sim::DifferentialDrivetrainSim m_driveSim{
// Create a linear system from our identification gains.
frc::LinearSystemId::IdentifyDrivetrainSystem(
KvLinear, KaLinear, KvAngular, KaAngular, kTrackWidth),
kTrackWidth,
frc::DCMotor::GetNEO(2), // 2 NEO motors on each side of the drivetrain.
7.29, // 7.29:1 gearing reduction.
3_in, // The robot uses 3" radius wheels.
// The standard deviations for measurement noise:
// x and y: 0.001 m
// heading: 0.001 rad
// l and r velocity: 0.1 m/s
// l and r position: 0.005 m
{0.001, 0.001, 0.001, 0.1, 0.1, 0.005, 0.005}};
KoP Şasisi için DifferentialDrivetrainSim Oluşturulması.
DifferentialDrivetrainSim sınıfı, standart Parça Kiti Şasi parametreleri kullanılarak DifferentialDrivetrainSim örneğini oluşturabilen statik bir createKitbotSim() (Java) / CreateKitbotSim() (C++) metoduna da sahiptir. Bu metod, ikisi isteğe bağlı, 5 bağımsız değişken kabul etmektedir:
Aktarma sisteminin bir tarafındaki motorların türü ve sayısı.
Çıktı torque’u bölü girdi torque’u olarak motor ve tekerlekler arasındaki dişli oranı (aktarma sistemleri için bu sayı genellikle 1’den büyüktür).
Aktarma sistemlerine takılı tekerleklerin çapı.
Sürüş tabanının eylemsizlik momenti (isteğe bağlı).
Ölçüm gürültüsünün standart sapmaları: Bu, gerçek sensörlerinizden ne kadar ölçüm gürültüsü beklediğinizi göstermektedir. Ölçüm gürültüsü sırasıyla x, y, yön, sol hız, sağ hız, sol konum ve sağ konumdaki ölçüm gürültüsünün standart sapmasını temsil eden 7 öğeli bir dizidir. Bu seçenek, C++’da tamamen çıkarılabilmekte veya Java’da ölçüm gürültüsü istenmiyorsa
nullolarak ayarlanabilmektedir
Ölçmeye çalıştığınız durumun birden fazla veri noktasını ele alıp Python gibi bir araç ile standart sapmayı hesaplayarak sensörünüzün ölçüm gürültüsünü hesaplayabilirsiniz. Örneğin, kodlayıcılarınızın hız tahminindeki standart sapmayı hesaplamak için, robotunuzu sabit bir hızda hareket ettirip, birden fazla ölçüm alıp bilinen aritmetik ortalamasından yola çıkarak tahminin standart sapmasını hesaplayabilirsiniz. Bu işlem çok zahmetliyse, aşağıdaki örnekte kullanılan değerler kodlayıcılardan gelen ortalama gürültünün iyi bir temsili olacaktır.
Not
Bir ölçüm için gürültünün standart sapması, ölçümle aynı birimlere sahiptir. Örneğin, hız gürültüsünün standart sapması m/s biriminde hesaplanmaktadır.
Not
Java’da parametreleri iletimi sırasında SI birimlerinin (yani metre ve radyanın) kullanımı çok önemlidir. C++ ‘da, birimler kütüphanesi herhangi bir birim türünü belirtmek için kullanılabilmektedir.
private DifferentialDrivetrainSim m_driveSim = DifferentialDrivetrainSim.createKitbotSim(
KitbotMotor.kDualCIMPerSide, // 2 CIMs per side.
KitbotGearing.k10p71, // 10.71:1
KitbotWheelSize.kSixInch, // 6" diameter wheels.
null // No measurement noise.
);
#include <frc/simulation/DifferentialDrivetrainSim.h>
...
frc::sim::DifferentialDrivetrainSim m_driveSim =
frc::sim::DifferentialDrivetrainSim::CreateKitbotSim(
frc::sim::DifferentialDrivetrainSim::KitbotMotor::DualCIMPerSide, // 2 CIMs per side.
frc::sim::DifferentialDrivetrainSim::KitbotGearing::k10p71, // 10.71:1
frc::sim::DifferentialDrivetrainSim::KitbotWheelSize::kSixInch // 6" diameter wheels.
);
Not
Parça Kiti Şasisinin yaygın olarak kullanılan yapılandırmalarını elde etmek için KitbotMotor, KitbotGearing ve KitbotWheelSize enum (Java) / struct (C++) kullanabilirsiniz.
Önemli
DifferentialDrivetrainSim örneğinizi bu şekilde oluşturmak yaklaşık bir öneriden ibarettir ve takımların hızlı bir şekilde simülasyon kullanmaya başlamasını sağlamayı amaçlamaktadır. Fiziksel robotunuzdan ölçülen deneysel değerleri kullanmak her zaman daha doğru sonuçlar verecektir.