potblog

技術メモとかガジェットレビューとか

rosのpublisherで複数のメッセージを配信する

概要

オライリーのros本の3章トピック通信までを読んだので、理解の定着化のためにも rosで動く電卓ツールを作ってみた

プログラミングROS ―Pythonによるロボットアプリケーション開発 (オライリー・ジャパン)

プログラミングROS ―Pythonによるロボットアプリケーション開発 (オライリー・ジャパン)

環境

ubuntu 16.04

ROS KineticのUbuntu16.04 へのインストール

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full python-rosinstall
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

ワークスペースの初期化

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

プロジェクトの作成

cd ~/catkin_ws/src
catkin_create_pkg "new_pkg" rospy
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

新しくプロジェクトを作成した直後の~/catkin_ws/のディレクトリ構成をtreeコマンドにて確認する

.
├── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
└── ros_calc
    ├── CMakeLists.txt
    ├── package.xml
    └── src

電卓ツールの作成

作成した電卓ツールはrqt_graphを用いて以下のように表せる。

f:id:potblog:20180101165037p:plain
calc_rqt_graph

  • inputノードにて計算させたい四則演算を入力する。
    入力例は "3 + 22", "432 - 12", "2 * 3", "12 / 2"
    それらの入力を数値と演算子に分割し、定義した独自メッセージ型にてCalcElementトピックに配信する。

  • calculationノードにてCalcElementトピックを購読し四則演算を行う。
    計算結果をInt32でCalcAnserトピックに配信する。

  • outputノードにてCalcAnserトピックを購読し、その内容を表示する。

また最終的に~/catkin_ws/のディレクトリ構成は以下のようになる

.
├── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
└── ros_calc
    ├── CMakeLists.txt
    ├── launch
    │   └── calculator.launch
    ├── msg
    │   └── CalcElement.msg
    ├── package.xml
    └── src
        ├── calculation.py
        ├── input.py
        └── output.py

独自メッセージ型を用いるためros_calcディレクトリのCMakeLists.txtとpackage.xmlを変更する必要がある。

CMakeLists.txtを4箇所変更する

find_package(catkin REQUIRED COMPONENTS
  rospy
)
↓
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )
↓
## Generate messages in the 'msg' folder
add_message_files(
  FILES
  CalcElement.msg
#   Message2.msg
)

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs  # Or other packages containing msgs
# )
↓
## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs  # Or other packages containing msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES calc
#  CATKIN_DEPENDS rospy
#  DEPENDS system_lib
)
↓
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES calculator
  CATKIN_DEPENDS message_runtime
#  DEPENDS system_lib
)

package.xmlの以下のコメントアウトを外す

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • CalcElement.msgを以下に示す。
  • calculation.launchを以下に示す。launchを実行することで一度に複数のプログラムをrosrunできる

まとめ

電卓ツールの作成を通してrosのトピック通信の概念がわかった