はじめに
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 コマンドを実行
- 今日の日付文字列を含んだファイル名
- サブプロセスでコマンド実行(画像撮影)
- 以下(↓)は対応する部分
# 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)
- Rapbian OS の raspistill コマンドを実行
-
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 を使用し読み込み)
- 以下(↓)は対応する部分
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()
- Publish 頻度に合わせて rate を設定(1秒当たりの回数)
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