C ++ Ünite Kitaplığı

WPILib’in 2020 sürümü, C ++ ekipleri için bir Units _ kitaplığı ile birleştirilmiştir. Bu kitaplık, C ++ tip sisteminden <https://docs.microsoft.com/en-us/cpp/cpp/cpp-type-system-modern-cpp?view=vs-2019> __ yararlanarak yöntem parametreleri, otomatik olarak birim dönüştürmeleri gerçekleştirir ve hatta kullanıcıların rastgele tanımlanmış birim türlerini tanımlamasına izin verir. C ++ tipi sistem derleme zamanında zorlandığından, kitaplığın esasen çalışma zamanı maliyeti yoktur.

Ü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.

Birim türleri sayısal değerler içeremezken, diğer birim türlerini oluşturmadaki kullanımları, bir tür veya yöntem bir şablon parametresi <http://www.cplusplus.com/doc/oldtutorial/templates/> __ kullandığında, boyutsallık, bu parametre bir birim türü olacaktır.

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ı

Bir kap türünü ham sayısal değere dönüştürmek için, şablon bağımsız değişkeninin temel tür olduğu “to <..> ()” yöntemi kullanılabilir.

units::meter_t distance = 6.5_m;
double distanceMeters = distance.to<double>();

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.