Ignition CitadelとROS1 Melodicをブリッジしてみる。
前提
・Ignition CitadelとROS1 Melodicがインストールされた環境
インストール
$ mkdir -p ~/bridge_ws/src $ cd ~/bridge_ws/src $ git clone https://github.com/osrf/ros_ign.git -b melodic
ROSの依存関係をインストール
$ cd ~/bridge_ws $ rosdep install --from-paths src -i -y --rosdistro melodic \ --skip-keys=ignition-gazebo2 \ --skip-keys=ignition-gazebo3 \ --skip-keys=ignition-msgs4 \ --skip-keys=ignition-msgs5 \ --skip-keys=ignition-rendering2 \ --skip-keys=ignition-rendering3 \ --skip-keys=ignition-sensors2 \ --skip-keys=ignition-sensors3 \ --skip-keys=ignition-transport7 \ --skip-keys=ignition-transport8
$ source /opt/ros/melodic/setup.bash $ cd ~/bridge_ws/ $ catkin_make install
実行
Core Publisher Bridge Subscriberを起動
Core
roscore
$ roscore
Publisher
とりあえず、joint_stateをPublishしているIgnitionのデモを実行する
$ ign gazebo /usr/share/ignition/ignition-gazebo3/worlds/lift_drag.sdf
Bridge
書式は
rosrun ros_ign_bridge parameter_bridge [Topic Name]@[ROS type]@[Ignition Type]
Ignition Typeの指定は
ignition::msgs::StringMsg
ではなく
ignition.msgs.StringMsg
なので注意
$ rosrun ros_ign_bridge parameter_bridge /world/lift_drag/model/lift_drag_demo_model/joint_state@sensor_msgs/JointState@ignition.msgs.Model
Subscriber
とりあえず、ros topicで表示してみる。
$ rostopic echo /world/lift_drag/model/lift_drag_demo_model/joint_state
そうすると以下のような値がゲットできる。
header: seq: 5104 stamp: secs: 1997 nsecs: 156000000 frame_id: '' name: [rod_1_joint, blade_1_joint, blade_2_joint] position: [-1.4130987461707797e-21, 0.0, 0.0] velocity: [-8.18722873613537e-21, 0.0, 0.0] effort: [0.0, 0.0, 0.0]
型は定義は sensor_msgs/JointState Documentation
ゆえにC++上でアクセスするには
sensor_msgs::JointState joint_state;
としてインスタンスを取得し、
int stamp = joint_state.header.stamp.secs; string name = joint_state.name; float64 position = joint_state.position; float64 velocity = joint_state.velocity; float64 effort = joint_state.effort;
のようにアクセスする。
課題
Ignition Gazeboはデフォルトだと1000HzでPublishするが、
これをそのままArduinoに1000Hzで伝えると、
Arduino上のコールバック関数が反応しなくなってしまう。
<update_rate>(publishする間隔)が対応しているignition::msgsは一部であり、全てに対応していない...。
なお、オプション -z (arg)でHzを変更し、シミュレーション空間のリアルタイムレートは遅くすることはできる。
<例>
$ ign gazebo -z 10 /usr/share/ignition/ignition-gazebo3/worlds/lift_drag.sdf