diff --git a/real_robot/coordination_formation_control_pkg/CMakeLists.txt b/real_robot/coordination_formation_control_pkg/CMakeLists.txt
index eacdbb6c0a13c0bd6814c7c8c675757334906457..85257397996e2183d7ea01364ead6697c221e6df 100644
--- a/real_robot/coordination_formation_control_pkg/CMakeLists.txt
+++ b/real_robot/coordination_formation_control_pkg/CMakeLists.txt
@@ -13,6 +13,7 @@ find_package(catkin REQUIRED COMPONENTS
   roscpp
   dynamic_reconfigure
   message_generation
+  rosbag
 )
 find_package(catkin)
 
@@ -32,16 +33,18 @@ add_message_files(
   FILES
   coordination.msg
   waypoint.msg
+  logData.msg
 )
 
 generate_messages(
   DEPENDENCIES
   std_msgs
+  geometry_msgs
 )
 catkin_package(
 #  INCLUDE_DIRS include
 #  LIBRARIES coordination_formation_control_pkg
- CATKIN_DEPENDS crazyswarm geometry_msgs roscpp dynamic_reconfigure roscpp crazyswarm message_runtime
+ CATKIN_DEPENDS crazyswarm geometry_msgs roscpp dynamic_reconfigure roscpp crazyswarm message_runtime rosbag
 #  DEPENDS system_lib
 )
 ## Specify additional locations of header files
diff --git a/real_robot/coordination_formation_control_pkg/config/missionConfig.yaml b/real_robot/coordination_formation_control_pkg/config/missionConfig.yaml
index 3c5843c3bc8d207337a2319c0139b67dd64e2995..d9a7a3d6904517a740a1dfdb4c814a6acb63a140 100644
--- a/real_robot/coordination_formation_control_pkg/config/missionConfig.yaml
+++ b/real_robot/coordination_formation_control_pkg/config/missionConfig.yaml
@@ -4,6 +4,8 @@ hz_freq: 50 # controller frquency
 include_obstacle: false
 include_orientation: false
 n_obs: 0
+log_name: "experiment_1"
+enable_log: false
 
 # waypoint
 # x: 0
diff --git a/real_robot/coordination_formation_control_pkg/msg/logData.msg b/real_robot/coordination_formation_control_pkg/msg/logData.msg
index cc85513eacb161d24ffe89ef9560d040be59afa7..71b98b6dc35ea651bd06c630995aadfe829b0016 100644
--- a/real_robot/coordination_formation_control_pkg/msg/logData.msg
+++ b/real_robot/coordination_formation_control_pkg/msg/logData.msg
@@ -1,6 +1,6 @@
-std_msgs/Header # time
-geometry_msgs/Pose[] pose
-geometry_msgs/Twist[] twist
+std_msgs/Header header # time
+geometry_msgs/Pose[] current_pose
+geometry_msgs/Twist[] current_twist
 geometry_msgs/Pose2D command_pose
 geometry_msgs/Twist command_twist
 geometry_msgs/Pose2D input
diff --git a/real_robot/coordination_formation_control_pkg/package.xml b/real_robot/coordination_formation_control_pkg/package.xml
index 5791174e13faab074e5a468b29805c84530fa123..055559629935865823fec2dc329c7705483543cb 100644
--- a/real_robot/coordination_formation_control_pkg/package.xml
+++ b/real_robot/coordination_formation_control_pkg/package.xml
@@ -54,17 +54,20 @@
   <build_depend>roscpp</build_depend>
   <build_depend>dynamic_reconfigure</build_depend>
   <build_depend>message_generation</build_depend>
+  <build_depend>rosbag</build_depend>
 
   <build_export_depend>crazyswarm</build_export_depend>
   <build_export_depend>geometry_msgs</build_export_depend>
   <build_export_depend>roscpp</build_export_depend>
   <build_export_depend>dynamic_reconfigure</build_export_depend>
+  <build_export_depend>rosbag</build_export_depend>
 
   <exec_depend>crazyswarm</exec_depend>
   <exec_depend>geometry_msgs</exec_depend>
   <exec_depend>roscpp</exec_depend>
   <exec_depend>dynamic_reconfigure</exec_depend>
   <exec_depend>message_runtime</exec_depend>
+  <exec_depend>rosbag</exec_depend>
 
 
   <!-- The export tag contains other, unspecified, tags -->
diff --git a/real_robot/coordination_formation_control_pkg/src/drone_node.cpp b/real_robot/coordination_formation_control_pkg/src/drone_node.cpp
index 4adc2076d302d644d30d4e60505276d6d3d0fb87..5707b2d8809c5480d64d2d1a89887a8ed8426de0 100644
--- a/real_robot/coordination_formation_control_pkg/src/drone_node.cpp
+++ b/real_robot/coordination_formation_control_pkg/src/drone_node.cpp
@@ -6,6 +6,8 @@
 #include "swamControllerAlg.h"
 #include "coordination_formation_control_pkg/coordination.h"
 #include "coordination_formation_control_pkg/waypoint.h"
+#include "coordination_formation_control_pkg/logData.h"
+#include <rosbag/bag.h>
 
 #include "crazyswarm/Hover.h"
 #include "crazyswarm/Land.h"
@@ -17,13 +19,16 @@
 /* global variables*/
 coordination_formation_control_pkg::coordination *coord_config;
 coordination_formation_control_pkg::waypoint *next_waypoint;
+coordination_formation_control_pkg::logData *logdata;
+std::stringstream ss_log_naming;
+rosbag::Bag bag;
 
 bool waypoint_received = false;
 
 
 void configurationCallback(const coordination_formation_control_pkg::coordination::ConstPtr& msg );
 void waypointCallback(const coordination_formation_control_pkg::waypoint::ConstPtr& msg);
-
+void logCallback(const ros::TimerEvent& event);
 int main(int argc, char **argv) {
   ros::init(argc, argv, "~");
   int robotid = std::atoi(argv[1]);
@@ -48,6 +53,9 @@ int main(int argc, char **argv) {
   coord_config->initialize_robot = false;
   /* current waypoint*/
   next_waypoint = new coordination_formation_control_pkg::waypoint();
+  logdata = new coordination_formation_control_pkg::logData();
+  logdata->current_pose.resize(n_drones);
+  logdata->current_pose.resize(n_drones);
   /* current command*/
   crazyswarm::Hover current_command;
   current_command.vx = 0;
@@ -134,12 +142,27 @@ int main(int argc, char **argv) {
 
   /* TODO publisher to publish results and rosbag it*/
 
+  ros::Timer writeTobagfileTimer = nh.createTimer(ros::Duration(1.0/10.0), logCallback);
+  std::string log_data_name;
+  bool enable_log;
+  nh.getParam("/enable_log", enable_log);
+  nh.getParam("/log_name", log_data_name);
+  ss_log_naming << log_data_name << "_crazyflie_" << std::to_string(robotid) << "_logdata.bag";
+
+  // bag_ptr = new rosbag::bag();
+
+  if(enable_log)
+  {
+    bag.open(log_data_name.c_str(),rosbag::bagmode::Write);
+  }
+
 
 
   /*create a list of drones to subscribe to*/
   std::vector<robotState *> uavs;
   robot_ind_t uav_def;
   bool sucess_initialization;
+  input_vector_t input;
   for (int i = 1; i <= n_drones; i++)
   {
     uav_def.robot_name = "cf";
@@ -228,7 +251,7 @@ int main(int argc, char **argv) {
         }
 
         /* call controller*/
-        input_vector_t input = swam_controller.controller(uav_state_q, uav_state_p,current_waypoint,current_obs);
+        input = swam_controller.controller(uav_state_q, uav_state_p,current_waypoint,current_obs);
         /* integrate acceleration*/
         Eigen::Vector2d vel_command = acc_int.integrate(input(0,0), input(1,0));
         /* reached a certain waypoint and we want to stop sending command*/
@@ -283,6 +306,38 @@ int main(int argc, char **argv) {
       break;
 
 
+    }
+
+    if(enable_log)
+    {
+      logdata->header.stamp = ros::Time::now();
+      logdata->header.frame_id = robot_ind.robot_name;
+      for(int i = 0; i <n_drones; i++)
+      {
+        logdata->current_pose[i].position.x = uav_state_q(0,i);
+        logdata->current_pose[i].position.y = uav_state_q(1,i);
+        logdata->current_twist[i].linear.x = uav_state_p(0,i);
+        logdata->current_twist[i].linear.y = uav_state_p(1,i);
+      }
+      logdata->command_pose.x = current_waypoint.q(0);
+      logdata->command_pose.y = current_waypoint.q(1);
+      logdata->command_pose.theta = current_waypoint.orientation;
+      logdata->command_twist.linear.x = current_waypoint.p(0);
+      logdata->command_twist.linear.y = current_waypoint.p(1);
+      logdata->input.x = input(0,0);
+      logdata->input.y = input(1,0);
+      logdata->input.x = input(0,1);
+      logdata->input_formation.y = input(1,1);
+      logdata->input_orientation.x = input(0,2);
+      logdata->input_orientation.y = input(1,2);
+      logdata->input_navigation.x = input(0,3);
+      logdata->input_navigation.y = input(1,3);
+      logdata->input_obstacle.x = input(0,4);
+      logdata->input_obstacle.y = input(1,4);
+      logdata->input_integration.x = input(0,5);
+      logdata->input_integration.y = input(1,5);
+
+
     }
 
     ros::spinOnce();
@@ -298,6 +353,10 @@ int main(int argc, char **argv) {
     std_msgs::Empty stop_drone;
     stop_robot_publisher.publish(stop_drone);
   }
+  if(enable_log)
+  {
+    bag.close();
+  }
 
   return 0;
 }
@@ -316,3 +375,10 @@ void waypointCallback(const coordination_formation_control_pkg::waypoint::ConstP
   waypoint_received = false;
   *next_waypoint = *msg;
 }
+
+void logCallback(const ros::TimerEvent& event)
+{
+  /* this can be an issue, concurrent read write can be a problem*/
+  bag.write(ss_log_naming.str(),logdata->header.stamp, *logdata);
+
+}
diff --git a/real_robot/coordination_formation_control_pkg/src/omniwheel_node.cpp b/real_robot/coordination_formation_control_pkg/src/omniwheel_node.cpp
index 5f5d1f4ca59ce274617745cd56b94109d832eb04..2b935494d60c52587bb2eabc883506965c9d824f 100644
--- a/real_robot/coordination_formation_control_pkg/src/omniwheel_node.cpp
+++ b/real_robot/coordination_formation_control_pkg/src/omniwheel_node.cpp
@@ -2,18 +2,25 @@
 #include "geometry_msgs/Twist.h"
 #include "coordination_formation_control_pkg/coordination.h"
 #include "coordination_formation_control_pkg/waypoint.h"
+#include "coordination_formation_control_pkg/logData.h"
+
 #include "robot_state.h"
 #include "shared_definitions.h"
 #include "swamControllerAlg.h"
+#include <rosbag/bag.h>
 
 /* global variables*/
 coordination_formation_control_pkg::coordination *coord_config;
 coordination_formation_control_pkg::waypoint *next_waypoint;
+coordination_formation_control_pkg::logData *logdata;
 
+std::stringstream ss_log_naming;
+rosbag::Bag bag;
 bool waypoint_received = false;
 
 void configurationCallback(const coordination_formation_control_pkg::coordination::ConstPtr& msg );
 void waypointCallback(const coordination_formation_control_pkg::waypoint::ConstPtr& msg);
+void logCallback(const ros::TimerEvent& event);
 
 
 
@@ -38,7 +45,9 @@ int main(int argc, char **argv) {
   coord_config->initialize_robot = false;
   /* current waypoint*/
   next_waypoint = new coordination_formation_control_pkg::waypoint();
-
+  logdata = new coordination_formation_control_pkg::logData();
+  logdata->current_pose.resize(n_ugvs);
+  logdata->current_pose.resize(n_ugvs);
   /*current command*/
   geometry_msgs::Twist current_command;
   current_command.linear.x = 0;
@@ -104,6 +113,20 @@ int main(int argc, char **argv) {
   ss << "/omniwheel"  << std::to_string(robotid) << "/vel_cmd";
   ros::Publisher vel_cmd_publisher = nh.advertise<geometry_msgs::Twist>(ss.str(),1);
 
+  /* TODO publisher to publish results and rosbag it*/
+  ros::Timer writeTobagfileTimer = nh.createTimer(ros::Duration(1.0/10.0), logCallback);
+  std::string log_data_name;
+  bool enable_log;
+  nh.getParam("/enable_log", enable_log);
+  nh.getParam("/log_name", log_data_name);
+  if(enable_log)
+  {
+    bag.open(log_data_name.c_str(),rosbag::bagmode::Write);
+  }
+  ss_log_naming << log_data_name << "_omniwheel_" << std::to_string(robotid) << "_logdata.bag";
+
+
+
   std::vector<robotState *> ugvs;
   robot_ind_t ugv_def;
   bool sucess_initialization;
@@ -123,6 +146,8 @@ int main(int argc, char **argv) {
     }
   }
 
+  input_vector_t input;
+
 
 
   ros::Rate loop_rate(hz_freq);
@@ -212,7 +237,7 @@ int main(int argc, char **argv) {
         }
       //
         /* call controller*/
-        input_vector_t input = swam_controller.controller(current_state_q, current_state_p,current_waypoint,current_obs);
+        input = swam_controller.controller(current_state_q, current_state_p,current_waypoint,current_obs);
         /* integrate acceleration*/
         if(next_waypoint->stop)
         {
@@ -246,10 +271,47 @@ int main(int argc, char **argv) {
 
     }
 
+    if(enable_log)
+    {
+      logdata->header.stamp = ros::Time::now();
+      logdata->header.frame_id = robot_ind.robot_name;
+      for(int i = 0; i <n_ugvs; i++)
+      {
+        logdata->current_pose[i].position.x = ugv_state_q(0,i);
+        logdata->current_pose[i].position.y = ugv_state_q(1,i);
+        logdata->current_twist[i].linear.x = ugv_state_p(0,i);
+        logdata->current_twist[i].linear.y = ugv_state_p(1,i);
+      }
+      logdata->command_pose.x = current_waypoint.q(0);
+      logdata->command_pose.y = current_waypoint.q(1);
+      logdata->command_pose.theta = current_waypoint.orientation;
+      logdata->command_twist.linear.x = current_waypoint.p(0);
+      logdata->command_twist.linear.y = current_waypoint.p(1);
+      logdata->input.x = input(0,0);
+      logdata->input.y = input(1,0);
+      logdata->input.x = input(0,1);
+      logdata->input_formation.y = input(1,1);
+      logdata->input_orientation.x = input(0,2);
+      logdata->input_orientation.y = input(1,2);
+      logdata->input_navigation.x = input(0,3);
+      logdata->input_navigation.y = input(1,3);
+      logdata->input_obstacle.x = input(0,4);
+      logdata->input_obstacle.y = input(1,4);
+      logdata->input_integration.x = input(0,5);
+      logdata->input_integration.y = input(1,5);
+
+
+    }
+
+
     ros::spinOnce();
     loop_rate.sleep();
   }
 
+  if(enable_log)
+  {
+    bag.close();
+  }
 
   return 0;
 }
@@ -267,3 +329,10 @@ void waypointCallback(const coordination_formation_control_pkg::waypoint::ConstP
   waypoint_received = false;
   *next_waypoint = *msg;
 }
+
+void logCallback(const ros::TimerEvent& event)
+{
+  /* this can be an issue, concurrent read write can be a problem*/
+  bag.write(ss_log_naming.str(),logdata->header.stamp, *logdata);
+
+}