ROS采集安卓手机图像和IMU输出数据(时间戳对齐)

 

  • 手机与Ubuntu14.04下的ROS连接,

  • 生成 xxxx.bag文件,

  • 解析 xxxx.bag文件得到图像(主要是可以对提取的图片进行标定,修改  VINs-Mono  的手机camera内参)

  • 将xxxx.bag文件的IMU和image时间戳对齐生成新的 .bag文件(不对齐的话VINs-Mono  在rviz中是不显示轨迹的)

一、手机与ROS连接

1、下载手机apk和程序

git clone https://github.com/hitcm/Android_Camera-IMU.git    

2、在终端输入:(indigo是Ubuntu14.04,kinetic是ubuntu16.04)

sudo apt-get install ros-indigo-imu-tools

3、首先保证pc和安卓手机置于同一局域网下,然后终端输入

roscore

 接下来需要获得pc地址

ifconfig

4、打开安卓上的应用,修改ip地址为pc的ip地址,注意port(:11311/)不需要修改。修改完毕后点击Connect,则连接成功,进入相机界面。

ROS采集安卓手机图像和IMU输出数据(时间戳对齐)_第1张图片

5、在pc上执行rostopic list,可以看到相机数据和imu数据的名字如下,前三个topic即是

ROS采集安卓手机图像和IMU输出数据(时间戳对齐)_第2张图片

6、执行命令cd到上面下载git的本地目录下,执行上述git提供的launch文件

roslaunch android_cam-imu.launch

7、添加topic进入rviz

ROS采集安卓手机图像和IMU输出数据(时间戳对齐)_第3张图片

点击By topic,里面添加imu和image

 

ROS采集安卓手机图像和IMU输出数据(时间戳对齐)_第4张图片

rviz中的设置

二、ROS生成 xxxx.bag

1、完成第一大步后,打开一新的终端输入

rosbag record /android/imu /camera/image_raw

可在当前终端目录下得到  xxxx.bag

三、提取xxxx.bag中的图片

首先创建一个  export.launch 文件输入


  
 
 
   
 
  



 (上述是以MH_01_easy.bag为例,第四行的"/cam0/image_raw"是该bag文件的topic)

 1、将.bag移动到这个文件夹下(可能需要安装image_view)

sudo apt-get install ros-indigo-image_view

sudo mv xxx.bag /opt/ros/kinetic/share/image_view

2、在export.launch文件中,修改.bag名字和topic

3、运行

roslaunch export.launch

4、此时得到的图片会保存在.ros文件中,然后新建一个test文件夹,从.ros中导出

mv ~/.ros/frame*.jpg test/

四、提取 xxxx.bag文件IMU数据

1、IMU时间戳数据终端显示

rostopic echo /android/imu/header

2、image时间戳数据终端显示

rostopic  echo /camera/image_raw/header

3 、然后运行一个.bag才可以看到上述数据(此bag的topic必须和上面的一样)

rosbag play  ~/test00000.bag

 4、最后截图展示(从图中可看出IMU和image时间戳没有对齐)

ROS采集安卓手机图像和IMU输出数据(时间戳对齐)_第5张图片

五、.bag中IMU与image时间戳对齐 

1、具体涉及ROS的一些知识(话题、消息、工作区、订阅者程序)

2、sensor_msgs中的image和imu类,参考http://docs.ros.org/api/sensor_msgs/html/index-msg.html

3、TimeSynchronizer  message_filters 同步回调

4、网上参考代码如下,但是一直运行失败

//wiki参考demo http://wiki.ros.org/message_filters
#include 
#include 
#include 
#include 
 
using namespace sensor_msgs;
using namespace message_filters;
 
void callback(const ImageConstPtr& image, const CameraInfoConstPtr& cam_info)  //回调中包含多个消息
{
  // Solve all of perception here...
}
 
int main(int argc, char** argv)
{
  ros::init(argc, argv, "vision_node");
 
  ros::NodeHandle nh;
 
  message_filters::Subscriber image_sub(nh, "image", 1);             // topic1 输入
  message_filters::Subscriber info_sub(nh, "camera_info", 1);   // topic2 输入
  TimeSynchronizer sync(image_sub, info_sub, 10);       // 同步
  sync.registerCallback(boost::bind(&callback, _1, _2));                   // 回调
 
  ros::spin();
 
  return 0;
}

 5、最后贴一张时间戳对齐的结果展示

 

参考:https://www.cnblogs.com/hitcm/p/5616364.html

参考:https://blog.csdn.net/u011988573/article/details/73740085

参考:http://www.cnblogs.com/GJGJH/p/9890210.html

参考:https://blog.csdn.net/zyh821351004/article/details/47758433

你可能感兴趣的:(ROS采集安卓手机图像和IMU输出数据(时间戳对齐))