In [1]:
import matplotlib.pyplot as plt
import rosbag_pandas

%matplotlib inline

In [10]:
rosbag_pandas.get_topics(rosbag_pandas.get_bag_info("bagfiles/2017-01-10-23-30-49.bigbag"))


Out[10]:
['/ardrone/camera_info',
 '/ardrone/front/camera_info',
 '/ardrone/front/image_raw',
 '/ardrone/ground_pose',
 '/ardrone/image_color',
 '/ardrone/image_mono',
 '/ardrone/image_proc_debayer/parameter_descriptions',
 '/ardrone/image_proc_debayer/parameter_updates',
 '/ardrone/image_proc_rectify_color/parameter_descriptions',
 '/ardrone/image_proc_rectify_color/parameter_updates',
 '/ardrone/image_proc_rectify_mono/parameter_descriptions',
 '/ardrone/image_proc_rectify_mono/parameter_updates',
 '/ardrone/image_raw',
 '/ardrone/image_rect',
 '/ardrone/image_rect_color',
 '/ardrone/imu',
 '/ardrone/land',
 '/ardrone/mag',
 '/ardrone/navdata',
 '/ardrone/odometry',
 '/ardrone/past_image',
 '/ardrone/past_pose',
 '/ardrone/pose',
 '/ardrone/reset',
 '/ardrone/slow_image_raw',
 '/ardrone/takeoff',
 '/ardrone/tracked',
 '/cmd_vel',
 '/diagnostics',
 '/joy',
 '/rosout',
 '/rosout_agg',
 '/tf']

Potentially useful:

  • /ardrone/ground_pose - yaw, x, y
  • /ardrone/imu - covariances (angular velocity, orientation), w, x, y, z
  • /ardrone/navdata - altd, accelerations, magnets, motors, pressure, rotation, state, temperature, time, velocities, wind angle/speed/compensation
  • /ardrone/odometry - pose, velocities, covariances
  • /ardrone/past_image
  • /ardrone/past_pose
  • /ardrone/pose
  • /ardrone/slow_image_raw
  • /ardrone/tracked
  • /ardrone/arrived <- New. Boolean.
  • /rosout - all console output
  • /rosout_agg - user console output?

navdata state is important.


In [262]:
df0.ardrone_odometry__twist_twist_linear_x.plot()


Out[262]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3ac5530d0>

In [261]:
df0.ardrone_navdata__vx.plot()


Out[261]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3b334e110>

In [254]:
df0.ardrone_navdata__state.plot()


Out[254]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3b3bd1250>

In [237]:
plt.plot(range(len(df0)), df0.ardrone_navdata__az)
plt.plot(range(len(df0)), df0.ardrone_imu__linear_acceleration_z/10)


Out[237]:
[<matplotlib.lines.Line2D at 0x7fd3ba64d110>]

In [35]:
df0 = rosbag_pandas.bag_to_dataframe("bagfiles/2017-01-10-23-30-49.bigbag", include=[
    "/ardrone/ground_pose", "/ardrone/imu", "/ardrone/mag", "/ardrone/navdata",
    "/ardrone/odometry", "/ardrone/past_pose", "/ardrone/pose", "/ardrone/tracked"])

In [36]:
df0.columns


Out[36]:
Index([u'ardrone_ground_pose__theta', u'ardrone_ground_pose__x',
       u'ardrone_ground_pose__y', u'ardrone_imu__angular_velocity_covariance0',
       u'ardrone_imu__angular_velocity_covariance1',
       u'ardrone_imu__angular_velocity_covariance2',
       u'ardrone_imu__angular_velocity_covariance3',
       u'ardrone_imu__angular_velocity_covariance4',
       u'ardrone_imu__angular_velocity_covariance5',
       u'ardrone_imu__angular_velocity_covariance6',
       ...
       u'ardrone_past_pose__pose_position_y',
       u'ardrone_past_pose__pose_position_z',
       u'ardrone_pose__pose_orientation_w',
       u'ardrone_pose__pose_orientation_x',
       u'ardrone_pose__pose_orientation_y',
       u'ardrone_pose__pose_orientation_z', u'ardrone_pose__pose_position_x',
       u'ardrone_pose__pose_position_y', u'ardrone_pose__pose_position_z',
       u'ardrone_tracked__data'],
      dtype='object', length=170)

In [37]:
df0.plot.scatter("ardrone_odometry__pose_pose_position_x", "ardrone_odometry__pose_pose_position_y", c=df0.ardrone_odometry__pose_pose_position_z)
df0.plot.scatter("ardrone_pose__pose_position_x", "ardrone_pose__pose_position_y", c=df0.ardrone_pose__pose_position_z)


Out[37]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3e27c5950>

In [38]:
df0.plot.scatter("ardrone_odometry__pose_pose_position_x", "ardrone_odometry__pose_pose_position_y", c=df0.ardrone_tracked__data)


Out[38]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3e1838e50>

In [40]:
df0.tail()


Out[40]:
ardrone_ground_pose__theta ardrone_ground_pose__x ardrone_ground_pose__y ardrone_imu__angular_velocity_covariance0 ardrone_imu__angular_velocity_covariance1 ardrone_imu__angular_velocity_covariance2 ardrone_imu__angular_velocity_covariance3 ardrone_imu__angular_velocity_covariance4 ardrone_imu__angular_velocity_covariance5 ardrone_imu__angular_velocity_covariance6 ... ardrone_past_pose__pose_position_y ardrone_past_pose__pose_position_z ardrone_pose__pose_orientation_w ardrone_pose__pose_orientation_x ardrone_pose__pose_orientation_y ardrone_pose__pose_orientation_z ardrone_pose__pose_position_x ardrone_pose__pose_position_y ardrone_pose__pose_position_z ardrone_tracked__data
2017-01-10 23:32:34.828533504 NaN NaN NaN 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-01-10 23:32:34.829537280 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN 0.704793 -0.00165 0.003738 0.709401 -0.61043 -1.131244 0.090116 NaN
2017-01-10 23:32:34.829753088 1.577325 -0.61043 -1.131244 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2017-01-10 23:32:34.830032640 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0
2017-01-10 23:32:24.912652032 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.236234 0.334468 NaN NaN NaN NaN NaN NaN NaN NaN

5 rows × 170 columns


In [42]:
df0.fillna(method="pad", inplace=True)
df0.tail()


Out[42]:
ardrone_ground_pose__theta ardrone_ground_pose__x ardrone_ground_pose__y ardrone_imu__angular_velocity_covariance0 ardrone_imu__angular_velocity_covariance1 ardrone_imu__angular_velocity_covariance2 ardrone_imu__angular_velocity_covariance3 ardrone_imu__angular_velocity_covariance4 ardrone_imu__angular_velocity_covariance5 ardrone_imu__angular_velocity_covariance6 ... ardrone_past_pose__pose_position_y ardrone_past_pose__pose_position_z ardrone_pose__pose_orientation_w ardrone_pose__pose_orientation_x ardrone_pose__pose_orientation_y ardrone_pose__pose_orientation_z ardrone_pose__pose_position_x ardrone_pose__pose_position_y ardrone_pose__pose_position_z ardrone_tracked__data
2017-01-10 23:32:34.828533504 1.575929 -0.610407 -1.131377 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.236234 0.334468 0.705286 -0.002199 0.003388 0.708911 -0.610407 -1.131377 0.089994 1.0
2017-01-10 23:32:34.829537280 1.575929 -0.610407 -1.131377 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.236234 0.334468 0.704793 -0.001650 0.003738 0.709401 -0.610430 -1.131244 0.090116 1.0
2017-01-10 23:32:34.829753088 1.577325 -0.610430 -1.131244 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.236234 0.334468 0.704793 -0.001650 0.003738 0.709401 -0.610430 -1.131244 0.090116 1.0
2017-01-10 23:32:34.830032640 1.577325 -0.610430 -1.131244 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.236234 0.334468 0.704793 -0.001650 0.003738 0.709401 -0.610430 -1.131244 0.090116 1.0
2017-01-10 23:32:24.912652032 1.577325 -0.610430 -1.131244 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.236234 0.334468 0.704793 -0.001650 0.003738 0.709401 -0.610430 -1.131244 0.090116 1.0

5 rows × 170 columns


In [44]:
df0.fillna(method="backfill", inplace=True)
df0.head()


Out[44]:
ardrone_ground_pose__theta ardrone_ground_pose__x ardrone_ground_pose__y ardrone_imu__angular_velocity_covariance0 ardrone_imu__angular_velocity_covariance1 ardrone_imu__angular_velocity_covariance2 ardrone_imu__angular_velocity_covariance3 ardrone_imu__angular_velocity_covariance4 ardrone_imu__angular_velocity_covariance5 ardrone_imu__angular_velocity_covariance6 ... ardrone_past_pose__pose_position_y ardrone_past_pose__pose_position_z ardrone_pose__pose_orientation_w ardrone_pose__pose_orientation_x ardrone_pose__pose_orientation_y ardrone_pose__pose_orientation_z ardrone_pose__pose_position_x ardrone_pose__pose_position_y ardrone_pose__pose_position_z ardrone_tracked__data
2017-01-10 23:30:49.844509440 -0.000011 -1.152442 1.261761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.261762 0.378911 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.26176 0.378907 1.0
2017-01-10 23:30:49.845169408 -0.000011 -1.152442 1.261761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.261762 0.378911 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.26176 0.378907 1.0
2017-01-10 23:30:49.845954816 -0.000011 -1.152442 1.261761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.261762 0.378911 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.26176 0.378907 1.0
2017-01-10 23:30:49.850543616 -0.000011 -1.152442 1.261761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.261762 0.378911 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.26176 0.378907 1.0
2017-01-10 23:30:49.853647360 -0.000011 -1.152442 1.261761 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 1.261762 0.378911 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.26176 0.378907 1.0

5 rows × 170 columns


In [45]:
len(df0)


Out[45]:
61720

In [47]:
df0.plot.scatter("ardrone_odometry__pose_pose_position_x", "ardrone_odometry__pose_pose_position_y")


Out[47]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3e21a8890>

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [41]:
df1 = rosbag_pandas.bag_to_dataframe("bagfiles/2017-01-10-23-30-49.bigbag", include="/ardrone/pose")
df1.columns = ["d", "a", "b", "c", "x", "y", "z"]
df1.head()


Out[41]:
d a b c x y z
2017-01-10 23:30:50.001575936 1.0 -0.000005 0.000029 -0.000001 -1.152437 1.261760 0.378907
2017-01-10 23:30:50.010031872 1.0 0.000024 0.000035 -0.000008 -1.152439 1.261770 0.378910
2017-01-10 23:30:50.018437888 1.0 -0.000022 0.000031 -0.000009 -1.152441 1.261760 0.378907
2017-01-10 23:30:50.026855424 1.0 0.000003 0.000018 -0.000007 -1.152443 1.261770 0.378905
2017-01-10 23:30:50.034953728 1.0 0.000004 0.000045 -0.000003 -1.152443 1.261762 0.378900

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:
df2 = rosbag_pandas.bag_to_dataframe("bagfiles/2017-01-10-23-34-26.bigbag", include="/ardrone/pose")
df2.columns = ["d", "a", "b", "c", "x", "y", "z"]
df2.head()

In [62]:
from collections import namedtuple
Coords = namedtuple("Coords", "x y")

In [63]:
def load_bag(bagfile, topics="/ardrone/pose"):
    return rosbag_pandas.bag_to_dataframe(bagfile, include=topics)

def load_pose(bagfile):
    df = load_bag(bagfile)
    df.columns = ["d", "a", "b", "c", "x", "y", "z"]
    return df

In [82]:
df0.plot.scatter("ardrone_ground_pose__x", "ardrone_ground_pose__y", c=df0.index)


Out[82]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3e13a0390>

In [281]:
def plot_xy(df, x="x", y="y", s="z", c=None, cmap="viridis", target_coords=(Coords(-1, 3.6), Coords(-2, 1.6)), target_color="r"):
    """
    Coords in real frame. +x is towards doors, +y is away from table.
    
    """
    if c is None:
        c = df.index
        if cmap is None:
            cmap = "viridis_r"
    else:
        c = df[c]
    if cmap is None:
        cmap = "viridis"
    p_init = Coords(df[x][0], df[y][0])
    plt.scatter(-df[x], -df[y], s=df[s]*25, c=c, cmap=cmap)
    plt.colorbar()
    plt.scatter(-p_init.x, -p_init.y, c=target_color)
    for coord in target_coords:
        plt.scatter(-(p_init.x - coord.x), -(p_init.y - coord.y), c=target_color)
    plt.axis("equal")

In [355]:
def plot_xy_if(df, df_if, x="x", y="y", s=None, c=None, cmap=None, cmap_if="gray", alpha=0.002,
               target_coords=(Coords(-1, 3.6), Coords(-2, 1.6)), target_color="r"):
    """
    Coords in real frame. +x is towards doors, +y is away from table.
    
    """
    if s is None:
        s = s_if = None
    else:
        s_if = df_if[s]*25
        s = df[s]*25
    if c is None:
        c_if = df_if.index
        c = df.index
        if cmap is None:
            cmap = "viridis_r"
    else:
        c_if = df_if[c]
        c = df[c]
    if cmap is None:
        cmap = "viridis"
    p_init = Coords(df[x][0], df[y][0])
    plt.scatter(-df[x],
                -df[y],
                s=s,
                c=c, cmap=cmap_if, alpha=alpha)
    plt.scatter(-df_if[x],
                -df_if[y],
                s=s_if,
                c=c_if, cmap=cmap)
    plt.colorbar()
    plt.scatter(-p_init.x, -p_init.y, c=target_color)
    for coord in target_coords:
        plt.scatter(-(p_init.x - coord.x), -(p_init.y - coord.y), c=target_color)
    plt.axis("equal")

In [356]:
plot_xy_if(df0, df0[df0.ardrone_navdata__state == 4], "ardrone_pose__pose_position_x", "ardrone_pose__pose_position_y",
        s="ardrone_pose__pose_position_z", c="ardrone_pose__pose_position_z", alpha = 0.002)



In [352]:
plot_xy_if(df0, df0[df0.ardrone_navdata__state == 4], "ardrone_pose__pose_position_x", "ardrone_pose__pose_position_y",
        c="ardrone_pose__pose_position_z", alpha = 0)



In [265]:
plot_xy(df0, "ardrone_odometry__pose_pose_position_x", "ardrone_odometry__pose_pose_position_y",
        s="ardrone_odometry__pose_pose_position_z")



In [250]:
df0.ardrone_past_pose__pose_position_x.plot()
df0.ardrone_pose__pose_position_x.plot()


Out[250]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3b9fbeed0>

In [251]:
df0.ardrone_past_pose__pose_position_y.plot()
df0.ardrone_pose__pose_position_y.plot()


Out[251]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3ba4b4d90>

In [252]:
df0.ardrone_past_pose__pose_position_z.plot()
df0.ardrone_pose__pose_position_z.plot()


Out[252]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fd3b8339b50>

In [123]:
plot_xy(df2)


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-123-fcbc1cd81797> in <module>()
----> 1 plot_xy(df2)

NameError: name 'df2' is not defined

In [47]:
dfnd = load_bag("2017-01-10-23-30-49.bag", topics="/ardrone/navdata")

In [59]:
dfnd.columns = "altd ax ay az batt magX magY magZ motor1 motor2 motor3 motor4 pressure rotX rotY rotZ state tags_count temp tm vx vy vz wind_angle wind_comp_angle wind_speed".split()
dfnd.columns


Out[59]:
Index([u'altd', u'ax', u'ay', u'az', u'batt', u'magX', u'magY', u'magZ',
       u'motor1', u'motor2', u'motor3', u'motor4', u'pressure', u'rotX',
       u'rotY', u'rotZ', u'state', u'tags_count', u'temp', u'tm', u'vx', u'vy',
       u'vz', u'wind_angle', u'wind_comp_angle', u'wind_speed'],
      dtype='object')

In [63]:
plt.plot(dfnd.index, dfnd.altd)
plt.plot(df1.index, df1.z*1000)


Out[63]:
[<matplotlib.lines.Line2D at 0x7faee7af4f90>]

In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]: