** TimeBase基類**
首先看time.h文件,它定義了一個叫TimeBase的類。注釋中說,TimeBase是個基類,定義了兩個成員變量uint32_t sec, nsec,還重載了+ ++、? -?、< <<、> >>、= ==等運算符。
成員變量uint32_t sec, nsec其實就是時間的秒和納秒兩部分,它們合起來構(gòu)成一個完整的時刻。
至于為啥要分成兩部分而不是用一個來定義,可能是考慮到整數(shù)表示精度的問題。
因為32位整數(shù)最大表示的數(shù)字是2147483647。如果我們要用納秒這個范圍估計是不夠的。
你可能會問,機器人系統(tǒng)怎么會使用到納秒這么高精度的時間分辨率,畢竟控制器的定時器最高精度可能也只能到微秒?
如果你做過自動駕駛項目,有使用過GPS和激光雷達傳感器的經(jīng)驗,就會發(fā)現(xiàn)GPS的時鐘精度就是納秒級的,它可以同步激光雷達每個激光點的時間戳。
還有,為什么定義TimeBase這個基類,原因大家很容易就能猜到。
因為在程序里,時間本質(zhì)上就是一個數(shù)字而已,數(shù)字系統(tǒng)的序關(guān)系(能比較大?。┖瓦\算(加減乘除)也同樣適用于時間這個東西。
當然,這里只有加減沒有乘除,因為時間的乘除沒有意義。
Time類
緊接著TimeBase類的是Time類,它是TimeBase的子類。我們做機器人應用程序開發(fā)時用不到TimeBase基類,但是Time類會經(jīng)常使用。
now()函數(shù)
Time類比TimeBase類多了now()函數(shù),它是我們的老熟人了。在開發(fā)應用的時候,我們直接用下面的代碼就能得到當前的時間戳:
ros::Time begin = ros::Time::now(); //獲取當前時間
now()函數(shù)的定義在rostimesrctime.cpp里,因為它很常用很重要,筆者就把代碼粘貼在這里,如下。
函數(shù)很簡單,可以看到,如果定義了使用仿真時間(g_use_sim_time為true),那就使用仿真時間,否則就使用墻上時間。
Time Time::now()
{
if (!g_initialized)
throw TimeNotInitializedException();
if (g_use_sim_time)
{
boost::mutex::scoped_lock lock(g_sim_time_mutex);
Time t = g_sim_time;
return t;
}
Time t;
ros_walltime(t.sec, t.nsec);
return t;
}
在ROS里,時間分成兩類,一種叫仿真時間,一種叫墻上時間。
顧名思義,墻上時間就是實際的客觀世界的時間,它一秒一秒地流逝,誰都不能改變它,讓它快一點慢一點都不可能,除非你有超能力。
仿真時間則是可以由你控制的,讓它快它就快。之所以多了一個仿真時間,是因為有時我們在仿真機器人希望可以自己控制時間,例如為了提高驗證算法的效率,讓它按我們的期望速度推進。
在使用墻上時間的情況下,now()函數(shù)調(diào)用了ros_walltime函數(shù),這個函數(shù)也在rostimesrctime.cpp里。
剝開層層洋蔥皮,最后發(fā)現(xiàn),這個ros_walltime函數(shù)才是真正調(diào)用操作系統(tǒng)時間函數(shù)的地方,而且它還是個跨平臺的實現(xiàn)(Windows和Linux)。
如果操作系統(tǒng)是Linux,那它會使用clock_gettime函數(shù),在筆者使用的Ubuntu 18.04系統(tǒng)中這個函數(shù)在usrinclude路徑下。
但是萬一缺少這個函數(shù),那么ROS會使用gettimeofday函數(shù),但是gettimeofday沒有clock_gettime精確,clock_gettime能提供納秒的精確度。
如果操作系統(tǒng)是Windows,那它會使用標準庫STL的chrono庫獲取當前的時刻,要用這個庫只需要引用它的頭文件,所以在time.cpp中引用了#include。
具體使用的函數(shù)就是
std::chrono::system_clock::now().time_since_epoch()。
當然,時間得是秒和納秒的形式,所以用了count方法:
uint64_t now_ns = std::chrono::duration_cast< std::chrono::nanoseconds >
(std::chrono::system_clock::now().time_since_epoch()).count();
WallTime類
后面又接著聲明了WallTime類和SteadyTime類。
-
控制器
+關(guān)注
關(guān)注
114文章
17799瀏覽量
193437 -
定時器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123731 -
文件
+關(guān)注
關(guān)注
1文章
594瀏覽量
26068 -
ROS
+關(guān)注
關(guān)注
1文章
293瀏覽量
18748
發(fā)布評論請先 登錄
如何在ROS中調(diào)用.so文件
怎么解決依賴關(guān)系中vi沖突?
【Toybrick RK3399Pro AI開發(fā)板試用體驗】Fedora系統(tǒng)安裝ROS
ROS是否適用于工業(yè)?
在Android中使用ROS
ROS與STM32之間的聯(lián)系
在FirePrime開發(fā)板上編譯安裝ROS jade
如何在IDEA中查看依賴關(guān)系
ROS是如何設(shè)計的 ROS客戶端庫
Unity與ROS鏈接介紹
ROS文件間的依賴關(guān)系
評論