2
1

More than 3 years have passed since last update.

ROS講座110 ROSでntpをする

Last updated at Posted at 2020-03-08

環境

この記事は以下の環境で動いています。

項目
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic

インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。

概要

ロボットシステム、特にROSは時刻についてべったり依存していて、Rvizの表示などでは時刻が正しいことが前提です。しかしロボットシステムが複数のPCに分かれていて、かつインターネットにつながっていない状態では時刻がずれることがあります。
前回はchronyを直接使って時刻を合わせましたが、今回はROSのntpd_driverを使って時刻合わせをしてみます。

設定

インストール

ntpd_driverはntpdとchronyの両方に対応しているようですが今回はchronyを使います。

インストール
sudo apt-get install chrony
sudo apt install ros-kinetic-ntpd-driver 

設定ファイルの追加

/etc/chrony/chrony.confに追加
### SHM driver
refclock SHM 0:perm=0666 delay 0.5 refid ROS

chronyに対してshared memory経由で時刻合わせのコマンドを送れるようにしています。perm=0666は読み書き権限でこれがないと一般ユーザーから命令ができません。

chronyの再起動

sudo systemctl restart chrony

もしくはPCの再起動をします。

共有メモリの確認

chronyが共有メモリを張っているかをipcsコマンドで確認できます。

ipcsコマンドの結果
------ メッセージキュー --------
キー     msqid      所有者  権限     使用済みバイト数 メッセージ

------ 共有メモリセグメント --------
キー     shmid      所有者  権限     バイト  nattch     状態      
0x00000000 1409024    ubuntu     600        16777216   2          対象       
0x00000000 819201     ubuntu     600        16777216   2                       
0x00000000 688130     ubuntu     600        524288     2          対象       
0x00000000 983043     ubuntu     600        524288     2          対象       
0x4e545030 458756     root       666        96         1                       
0x00000000 1245189    ubuntu     600        524288     2          対象       
0x00000000 1114118    ubuntu     600        524288     2          対象       
0x00000000 1343495    ubuntu     600        524288     2          対象       
0x00000000 1507336    ubuntu     600        524288     2          対象       
0x00000000 1867786    ubuntu     600        524288     2          対象       
0x00000000 1736715    ubuntu     600        524288     2          対象       
0x00000000 1900556    ubuntu     600        393216     2          対象       
0x00000000 1998861    ubuntu     600        393216     2          対象       
0x00000000 2031630    ubuntu     600        524288     2          対象       
0x00000000 2261007    ubuntu     600        524288     2          対象       

------ セマフォ配列 --------
キー     semid      所有者  権限     nsems   

0x4e545030 458756 root 666 96 1がchronyの共有メモリを表しています。

使い方

一度時刻を過去にセットする。

ntpd_driverの仕様で、時刻が一定(2009/02/14 08:31:30)よりも過去でないと時刻を書き換えないようになっています。
ubuntuのguiで時刻を書き換えるかdateコマンドを使います。

時刻変更
sudo date -s "01/1 13:00 2000"

ntpd_driverノードの起動

1つ目のターミナル
roscore
2つ目のターミナル
rosrun ntpd_driver shm_driver _shm_unit:=0 _fixup_date:=true

時刻の変更

時刻変更のrostopicの送信
rostopic pub -1 /ntpd_shm/time_ref sensor_msgs/TimeReference "header:
  seq: 0
  stamp:
    secs: 0
    nsecs: 0
  frame_id: ''
time_ref:
  secs: 600000000
  nsecs: 0
source: ''" 

このように time_refのフィールドに設定したい時刻を投げます。するとntpd_driverを起動している画面で以下のように出て時刻が変更されます。

時刻変更をしたログ
[ INFO] [946760738.650489385]: Setting system date to: 600000000.000000
[ INFO] [600000000.002175932]: The system date is set.

コメント

今回の例だけではただ時刻設定をROSからできるだけですが、例えばntpd_driverをロボットで起動して、操作側のノートPCから/time_refのコマンドを送ればノートPCの時刻にロボットの時刻を合わせられます。
またGPSモジュールが接続されている場合はGPSの時刻に合わせるという使い方もできます。

参考

ntpd_driver

目次ページへのリンク

ROS講座の目次へのリンク

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1