背景
iPhoneのセンサーデータを使ってマニピュレータを動かせるのでは?と思いついたのが発端
調査していると以下の記事を発見しました
これは使えるのでは?と思い,試してみることにしたのですが,意外にハマって半日くらい消費したのでメモを共有します!
なお,こちらの記事はROS(Robot Operating System)に関する知識を有している方向けです.もしこちらに関して学びたい方はチュートリアルなどをご参照ください!
実行環境
-
センサーデータを送る側
- iPhone 8
- iOS version 16.3.1
- Sim有: Rakuten Mobile
- iPhone 8
-
センサーデータを受け取る側
- PC CPUやGPUの性能は省略
- Ubuntu 20.04
- ROS Noetic
- PC CPUやGPUの性能は省略
-
センサーデータをやり取りするためのネットワーク
自分の家のWifiがいいと思います!iPhoneとPCを同じネットワーク(よくわからない方は同じルーター)に接続してください.
事前準備
この記事を試すにはiOS用有料アプリ[SensorLog]が必要です.少しお高いですが,興味がある方はぜひお試しください!
環境構築
iPhone側の設定
iPhoneにSensorLogをインストール
設定を開いてWebサイトの例通りに設定を変えていきます
自分の設定もおいておくので参考にしてください!IPアドレス(青く隠しているところ)のところはつないだネットワークのIPが自動で設定されます.
Ubuntu側
まずはROSのワークスペースにgithubのパッケージをインストールします.
cd your/path/to/ros_ws
cd src
git clone https://github.com/pietrocolombo/imu_from_ios_sensorlog.git
続いてコードを少し修正します.
imu_from_ros_sensorlog_node/src/imu_from_ros_sensorlog_node.cpp
の26行目以降を以下のように修正します.
修正前
# line 26 - 40
ros::NodeHandle nh;
sensor_msgs::Imu msg_imu;
int port, maxline;
std::string ip, frame_id;
// param
nh.param("ip", ip, std::string("192.168.0.60"));
nh.param("port", port, 12000);
nh.param("maxline", maxline, 4096);
nh.param("frame_id", frame_id, std::string("imu_iphone"));
std::cout << "Params ---" << "ip:" << ip << " port:" << port << std::endl;
imu_pub = nh.advertise<sensor_msgs::Imu>("imu_iphone", 1);
修正後
# line 26 - 41
ros::NodeHandle nh;
ros::NodeHandle pnh("~");
sensor_msgs::Imu msg_imu;
int port, maxline;
std::string ip, frame_id;
// param
pnh.getParam("ip", ip);
pnh.getParam("port", port);
pnh.getParam("maxline", maxline);
pnh.getParam("frame_id", frame_id);
std::cout << "Params ---" << "ip:" << ip << " port:" << port << std::endl;
imu_pub = nh.advertise<sensor_msgs::Imu>("imu_iphone", 1);
更に,imu_from_ros_sensorlog_node/launch/imu_from_ios_sensorlog.launch
のパラメータを修正します.
IPアドレスとPortの番号を,SensorLogの設定画面で表示されたIP/Portに設定します.
デフォルト
<launch>
<arg name="topic" default="imu_iphone"/>
<node pkg="imu_from_ios_sensorlog" type="imu_from_ios_sensorlog_node" name="imu_from_ios_sensorlog_node" output="screen">
<param name="ip" value="192.168.0.60"/>
<param name="port" value="12000"/>
<param name="maxline" value="4096"/>
<param name="frame_id" value="imu_iphone"/>
<remap from="imu_iphone" to="$(arg topic)" />
</node>
</launch>
変更後
<launch>
<arg name="topic" default="imu_iphone"/>
<node pkg="imu_from_ios_sensorlog" type="imu_from_ios_sensorlog_node" name="imu_from_ios_sensorlog_node" output="screen">
<param name="ip" value="your ip address"/>
<param name="port" value="your port number"/>
<param name="maxline" value="4096"/>
<param name="frame_id" value="imu_iphone"/>
<remap from="imu_iphone" to="$(arg topic)" />
</node>
</launch>
変更できたらビルドします.
cd path/to/your/ros_ws
catkin build # or catkin_make
一旦これで準備完了です!
いざ試す
始める前にiPhoneとUbuntuPCを同じネットワークに接続してください.
その後,iPhone側の設定で,Cellular通信をオフにします(何故かこれをしないと私の環境では動きませんでした どなたか理由わかる方いたら教えてください).
その後SensorLogを起動した状態でUbuntuPCでROSノードを起動します.
cd path/to/your/ros_ws
source devel/setup.bash
roslaunch imu_from_ios_sensorlog imu_from_ios_sensorlog.launch
接続がうまく行くとSensorLogでこんな感じのメッセージが出ます
これで接続完了です.
アプリの左下の録画ボタンを押すとデータが送信されます.
(https://pietrocolombo.medium.com/use-iphone-as-imu-in-ros-2b3afbc50184から拝借)
echoするとこんな感じ
https://drive.google.com/file/d/1cme3RZ9zOkC0kLcheaMLVp3kUJFnnRFJ/view?usp=sharing
RVIZに表示させてみるとおいているだけなのにブレがすんごい
https://drive.google.com/file/d/1jX3mC94_m5bI4OQ-JPkGRhPYiWcE4X3H/view?usp=sharing
意外に大変でしたが以上です! IMUはフィルタかけて使わないと無理そうですね...。