はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。(連載記事です)
今回の記事の概要
- 以前の記事で定義したメッセージを使い、撮影した画像ファイルを配信(Publish)する ROS アプリを構築する
- 作成したソースファイルを GitHub に登録する
- 今回の記事に該当するソースファイルは、以下のアドレスから参照可能です
事前準備
- 今回の ROS アプリは、Raspberry PI のカメラを制御するため、Raspbian OS 環境で稼働することを想定しています
- ROS 環境を構築する場合は、@dyson8910 さんの記事「Raspberry Pi 3 にROS kinetic をインストールしてみました。」が参考になりました
- 最終的に(次回以降の記事で)は、RDBOX 環境にて Dockerコンテナ(raspbian)で動かします
- 今回の記事では、実際に環境構築せず雰囲気を感じてもらうだけでも十分です
構築
関連パッケージ
- 画像データ取り扱いに関連して OpenCV を使用している
$ sudo apt install -y python-opencv ros-melodic-cv-bridge
GitHub から clone
- GitHub から clone します
- 以前の記事「[はじめてのRDBOX(3)]rdbox使ってみました:ROSパッケージ作成編」などで作成(commit)したファイル一式を GitHub 経由で取得(※GitHub便利です!!)
$ mkdir -p ${HOME}/ros_ws/src
$ cd ${HOME}/ros_ws/src
$ git clone https://github.com/YourGitHubAccount/picam_ros.git
$ ls -lR picam_ros # msg/picam_photo.msg などが取得できているはずです
scripts/take_pub_photo.py
- 今回の記事のアプリソースファイルの作成
- 以下(↓)は具体的な手順(下記例では、GitHubよりファイルを取得)
$ mkdir -p ${HOME}/ros_ws/src/picam_ros/scripts
$ cd ${HOME}/ros_ws/src/picam_ros/scripts
$ curl -s -o take_pub_photo.py https://raw.githubusercontent.com/higuchi-toshio-intec/example-picam/master/picam_ros/scripts/take_pub_photo.py
$ chmod +x take_pub_photo.py
ソースファイルの主要部分説明
- 静止画撮影
- Rapbian OS の raspistill コマンドを実行
- 今日の日付文字列を含んだファイル名
- サブプロセスでコマンド実行(画像撮影)
- 以下(↓)は対応する部分
- Rapbian OS の raspistill コマンドを実行
#
filename = "%s/photo-%s.jpeg" % (dir_tmp, today.strftime("%Y%m%dT%H%M%S"), )
cmd = "raspistill -w %d -h %d -o %s" % (args.w, args.h, filename)
subprocess.call(cmd, shell=True)
- Publisherの生成
- トピック名称:example_picam_photo
- データ型:picam_photo
- キューサイズ:100
- latch:True
- True を設定することで Publisher と Subscriber 間でのデータ受け渡しがうまくできたため
- False でもよかったかもしれない
- 以下(↓)は対応する部分
def create_pub(node_name):
rospy.init_node(MyNodeName, anonymous=True)
staLatch = True
pub = rospy.Publisher('example_picam_photo', picam_photo, queue_size=100, latch=staLatch)
return pub
- 配信(Publish)
- Publish 頻度に合わせて rate を設定(1秒当たりの回数)
- 今回の記事のようなケースでは、もっと小さな値でも OK
- データ型 picam_photo の変数(msg)を作成し以下の情報を格納
- 現在時刻
- 端末ID
- 画像データ(OpenCV を使用し読み込み)
- 以下(↓)は対応する部分
- Publish 頻度に合わせて rate を設定(1秒当たりの回数)
def pub_photo(pub, file_photo):
#
pub_rate = rospy.Rate(30)
#
msg = picam_photo()
#
print("[INFO] reading... " + file_photo)
photo_cv2 = cv2.imread(file_photo, cv2.IMREAD_COLOR)
#
msg.timestamp = rospy.Time.now()
msg.edge_id = MyNodeName
#
msg.picam_photo = GV_cv_bridge.cv2_to_imgmsg(photo_cv2)
#
pub.publish(msg)
pub_rate.sleep()
GitHub への登録
- 作成したファイル全てを GitHub に登録
- 以下(↓)は具体的な手順
$ cd ${HOME}/ros_ws/src/picam_ros
$ git add .
$ git commit -m 'CommitMessage'
$ git push
catkin_make
-
コンパイル実行
- 実行コマンドは catkin_make
- 「catkin_make: command not found」となった場合は、以下のコマンドを実行
$ source /opt/ros/${ROS_DISTRO}/setup.bash
以下(↓)は具体的な手順
$ cd ${HOME}/ros_ws/
$ catkin_make
アプリ起動
- 以下(↓)は具体的な手順
$ cd ${HOME}/ros_ws
$ source /opt/ros/${ROS_DISTRO}/setup.bash
$ source devel/setup.bash
$ rosrun picam_ros take_pub_photo.py