Ignition CitadelとROS2 Dashingをブリッジしてみる。
環境
Ubuntu18.04
導入手順 | |
---|---|
ROS2 Dashing | Installing ROS 2 via Debian Packages |
Ignition Citadel | https://ignitionrobotics.org/docs/citadel/install_ubuntu |
まだ、Nvidiaのドライバを入れていなければ、下記を実行。
$ sudo ubuntu-drivers autoinstall
インストール
$ mkdir -p ~/bridge_ws/src $ cd ~/bridge_ws/src $ git clone https://github.com/osrf/ros_ign.git -b dashing
まだ、rodep updateしていないなら下記を実行。
$ sudo apt install python-rosdep2 $ sudo rosdep init $ rosdep update
ROSの依存関係をインストール
$ cd ~/bridge_ws $ rosdep install --from-paths src -i -y --rosdistro dashing \ --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
まだ、colconをインストールしてないなら下記を実行
$ sudo apt install python3-colcon-common-extensions
ビルド
$ source /opt/ros/dashing/setup.bash $ cd ~/bridge_ws/ $ colcon build
実行
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
なので注意。
また、
ROS2は
名前空間msgが追加されたので注意。
$ . ~/bridge_ws/install/setup.bash $ ros2 run ros_ign_bridge parameter_bridge /world/lift_drag/model/lift_drag_demo_model/joint_state@sensor_msgs/msg/JointState@ignition.msgs.Model
Subscriber
とりあえず、ros topicで表示してみる。
$ ros2 topic 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;
のようにアクセスする。