ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

【ROS】ros_ignを試してみる

github.com

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