C ++ Ünite Kitaplığı

WPILib is coupled with a Units library for C++ teams. This library leverages the C++ type system to enforce proper dimensionality for method parameters, automatically perform unit conversions, and even allow users to define arbitrary defined unit types. Since the C++ type system is enforced at compile-time, the library has essentially no runtime cost.

Ünite Kitaplığını Kullanma

Birim kitaplığı, yalnızca başlık içeren bir kitaplıktır. Kullanmak istediğiniz birimler için kaynak dosyalarınıza ilgili başlığı eklemelisiniz. İşte mevcut birimlerin listesi.

#include <units/acceleration.h>
#include <units/angle.h>
#include <units/angular_acceleration.h>
#include <units/angular_velocity.h>
#include <units/area.h>
#include <units/capacitance.h>
#include <units/charge.h>
#include <units/concentration.h>
#include <units/conductance.h>
#include <units/current.h>
#include <units/curvature.h>
#include <units/data.h>
#include <units/data_transfer_rate.h>
#include <units/density.h>
#include <units/dimensionless.h>
#include <units/energy.h>
#include <units/force.h>
#include <units/frequency.h>
#include <units/illuminance.h>
#include <units/impedance.h>
#include <units/inductance.h>
#include <units/length.h>
#include <units/luminous_flux.h>
#include <units/luminous_intensity.h>
#include <units/magnetic_field_strength.h>
#include <units/magnetic_flux.h>
#include <units/mass.h>
#include <units/moment_of_inertia.h>
#include <units/power.h>
#include <units/pressure.h>
#include <units/radiation.h>
#include <units/solid_angle.h>
#include <units/substance.h>
#include <units/temperature.h>
#include <units/time.h>
#include <units/torque.h>
#include <units/velocity.h>
#include <units/voltage.h>
#include <units/volume.h>

units/math.h başlığı, units::math::abs() gibi birime duyarlı işlevler sağlar.

Ünite Tipleri ve Taşıyıcı Sınıf Tipleri

C ++ ünite kitaplığı iki tür tür tanımına dayanır: birim türleri ve kapsayıcı türleri.

Ünite Tipleri

Birim türleri, herhangi bir gerçek depolanmış değer olmaksızın soyut bir birim kavramına karşılık gelir. Birim türleri, birimler kitaplığının temel “building block-yapı taşı” dır , az sayıda “basic-temel” birim türünden (örneğin `` metre `` , `` saniye `` vb.) yapıcı bir şekilde (`` compound_unit-birleşik_birim`` şablonu kullanılarak) tanımlanır.

While unit types cannot contain numerical values, their use in building other unit types means that when a type or method uses a template parameter to specify its dimensionality, that parameter will be a unit type.

Container-Taşıyıcı Sınıf Türleri

Container-Taşıyıcı Sınıf türleri, bir birime göre boyutlandırılmış gerçek bir miktara karşılık gelir - yani, bunlar gerçekte sayısal değeri tutan şeydir. Container-Taşıyıcı Sınıf türleri, unit_t şablonuna sahip birim türlerinden oluşturulur. Çoğu birim türünün son eki _t ile aynı adı taşıyan karşılık gelen bir kap türü vardır - örneğin, birim türü units::meter, konteyner türü units::meter_t ye karşılık gelir.

Bir birimin belirli bir miktarı kullanıldığında (değişken veya yöntem parametresi olarak), bu, Container-Taşıyıcı Sınıf türünün bir örneği olacaktır. Varsayılan olarak, Container-Taşıyıcı Sınıf türleri gerçek değeri `` double`-çift`` olarak depolar - ileri düzey kullanıcılar bunu manuel olarak unit_t şablonunu çağırarak değiştirebilir.

Birim ve Container-Taşıyıcı Sınıf türler türlerinin tam listesi documentation <https://github.com/nholthaus/units#namespaces> __ belgelerinde bulunabilir.

Ünite Örnekleri Oluşturma

Belirli bir ünitenin örneğini oluşturmak için, container türünün bir örneğini oluşturuyoruz:

// The variable speed has a value of 5 meters per second.
units::meter_per_second_t speed{5.0};

Alternatif olarak, ünite kitaplığı, daha yaygın kap türlerinden bazıları için tanımlanmış type literals sahiptir. Bunlar, bir birimi daha kısa ve öz bir şekilde tanımlamak için tür çıkarımı ile birlikte kullanılabilir:

// The variable speed has a value of 5 meters per second.
auto speed = 5_mps;

Türler birbirleri arasında dönüştürülebildiği sürece, birimler başka bir container türünün değeri kullanılarak da başlatılabilir. Örneğin, bir foot_t değerinden bir meter_t değeri oluşturulabilir.

auto feet = 6_ft;
units::meter_t meters{feet};

Aslında, dönüştürülebilir birim türlerini temsil eden tüm kap türleri implicitly convertible. Bu nedenle, aşağıdakiler tamamen doğrudur:

units::meter_t distance = 6_ft;

Kısacası, kodumuzun herhangi bir yerinde * herhangi bir -any other* uzunluk birimi * yerine * herhangi-any * uzunluk birimini kullanabiliriz; birimler kitaplığı bizim için otomatik olarak doğru dönüşümü gerçekleştirecektir.

Hesap Yapma Ünitesi

Container-Taşıyıcı türleri, işlemin * boyutsal olarak * sağlam olması gerektiği ek koşuluyla, temel alınan veri türlerinin tüm sıradan aritmetik işlemlerini destekler. Bu nedenle, ekleme her zaman iki uyumlu container türünde yapılmalıdır:

// Add two meter_t values together
auto sum = 5_m + 7_m; // sum is 12_m

// Adds meters to feet; both are length, so this is fine
auto sum = 5_m + 7_ft;

// Tries to add a meter_t to a second_t, will throw a compile-time error
auto sum = 5_m + 7_s;

Çarpma, herhangi bir kap türü çiftinde gerçekleştirilebilir ve bir bileşik birimin kap türünü verir:

Not

Bir hesaplama bir bileşik birim türü verdiğinde, bu tür yalnızca sonuç türü açıkça belirtilmişse işlem noktasında geçerlilik açısından kontrol edilecektir. `` auto-otomatik`` kullanılırsa, bu kontrol yapılmayacaktır. Örneğin, mesafeyi zamana böldüğümüzde, sonucun gerçekten bir hız olmasını sağlamak isteyebiliriz (yani, `` units :: meter_per_second_t ``). İade türünün `` auto-otomatik `` olarak bildirilmesi durumunda bu kontrol yapılmayacaktır.

// Multiply two meter_t values, result is square_meter_t
auto product = 5_m * 7_m; // product is 35_sq_m
// Divide a meter_t value by a second_t, result is a meter_per_second_t
units::meter_per_second_t speed = 6_m / 0.5_s; // speed is 12_mps

Fonksiyonlar

Bazı standart işlevler (`` kelepçe-clamp`` gibi), aritmetik işlemlerin gerçekleştirilebileceği herhangi bir türü kabul edecek şekilde şablonlanmıştır. container-konteyner türleri olarak depolanan miktarlar bu işlevlerle sorunsuz çalışacaktır.

Bununla birlikte, diğer standart işlevleri yalnızca sıradan sayısal türlerde çalışır (örneğin, double). Birim kitaplığının `` units :: math`` ad alanı, birimleri kabul eden bu işlevlerin birçoğu için sarmalayıcılar içerir. Bu tür işlevlere örnek olarak `` sqrt ``, `` pow ``,vb. verilebilir.

auto area = 36_sq_m;
units::meter_t sideLength = units::math::sqrt(area);

Ünite/Birim Sargısının Çıkarılması

To convert a container type to its underlying value, use the value() method. This serves as an escape hatch from the units type system, which should be used only when necessary.

units::meter_t distance = 6.5_m;
double distanceMeters = distance.value();

WPILib Kodundaki Ünite Kitaplığı Örneği

WPILib’in yeni özelliklerindeki yöntemler için çeşitli argümanlar (ör kinematics) Birimler kitaplığını kullanır. İşte bir örnek yörüngeyi örneklemek.

// Sample the trajectory at 1.2 seconds. This represents where the robot
// should be after 1.2 seconds of traversal.
Trajectory::State point = trajectory.Sample(1.2_s);

// Since units of time are implicitly convertible, this is exactly equivalent to the above code
Trajectory::State point = trajectory.Sample(1200_ms);

Bazı WPILib sınıfları, birden çok birim türü seçeneğiyle doğal olarak çalışabilen nesneleri temsil eder - örneğin, bir hareket profili doğrusal mesafede (ör. Metre) veya açısal mesafede (ör. Radyan) çalışabilir. Bu tür sınıflar için, birim türü şablon parametresi olarak gereklidir:

// Creates a new set of trapezoidal motion profile constraints
// Max velocity of 10 meters per second
// Max acceleration of 20 meters per second squared
frc::TrapezoidProfile<units::meters>::Constraints{10_mps, 20_mps_sq};

// Creates a new set of trapezoidal motion profile constraints
// Max velocity of 10 radians per second
// Max acceleration of 20 radians per second squared
frc::TrapezoidProfile<units::radians>::Constraints{10_rad_per_s, 20__rad_per_s / 1_s};

Daha ayrıntılı belgeler için lütfen birim kitaplığı için resmi `GitHub sayfasını <https://github.com/nholthaus/units>” _ ziyaret edin.