diff --git a/CMakeLists.txt b/CMakeLists.txt index 772a84fab7bccae47793e6404d4d05d74bc3274b..528813e83836e9853bce99a308a8f802352c2510 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,10 +6,11 @@ find_package(catkin REQUIRED) # ******************************************************************** # Add catkin additional components here # ******************************************************************** -find_package(catkin REQUIRED COMPONENTS iri_base_algorithm sensor_msgs) +find_package(catkin REQUIRED COMPONENTS iri_base_algorithm tf2_ros sensor_msgs) ## System dependencies are found with CMake's conventions # find_package(Boost REQUIRED COMPONENTS system) +find_package(Eigen3 REQUIRED) # ******************************************************************** # Add system and labrobotica dependencies here @@ -60,7 +61,7 @@ catkin_package( # ******************************************************************** # Add ROS and IRI ROS run time dependencies # ******************************************************************** - CATKIN_DEPENDS iri_base_algorithm sensor_msgs + CATKIN_DEPENDS iri_base_algorithm tf2_ros sensor_msgs # ******************************************************************** # Add system and labrobotica run time dependencies here # ******************************************************************** @@ -76,6 +77,7 @@ catkin_package( # ******************************************************************** include_directories(include) include_directories(${catkin_INCLUDE_DIRS}) +include_directories(${EIGEN3_INCLUDE_DIR}) # include_directories(${<dependency>_INCLUDE_DIRS}) ## Declare a cpp library diff --git a/README.md b/README.md index 6554f000b6afcfd83b7ed9cdb34a2dc208929d9e..ce839a52bba7f9d2e5b5054712443092cbcfabee 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ The iri_collision_manager project description # ROS Interface ### Topic subscribers + - /**tf** (tf/tfMessage) + - /**tf** (tf/tfMessage) - ~**imu** (sensor_msgs/Imu.msg) ### Parameters diff --git a/cfg/CollisionManager.cfg b/cfg/CollisionManager.cfg index 65e993f5f7711e2e6617fd4bfa2c02c5cb706844..507c498416663e779f03fcd26422eec648112124 100755 --- a/cfg/CollisionManager.cfg +++ b/cfg/CollisionManager.cfg @@ -41,6 +41,8 @@ gen = ParameterGenerator() gen.add("rate", double_t, 0, "Main loop rate (Hz)", 10.0, 0.1, 1000.0) gen.add("collision_acc_th", double_t, 0, "Threshold to detect a collision", 9.8, 0.1, 40.0) gen.add("err_msg_rate", double_t, 0, "Rate to publish err messages", 0.5, 0.1, 1.0) +gen.add("fixed_frame", str_t, 0, "Fixed frame", "map") +gen.add("tf_timeout", double_t, 0, "Timeout to find a transform", 0.2, 0.1, 2.0) exit(gen.generate(PACKAGE, "CollisionManagerAlgorithm", "CollisionManager")) \ No newline at end of file diff --git a/config/params.yaml b/config/params.yaml index cf5c09c3fc359fce5a7a81c8d85829c383cf1f07..440b9a4469736b00a533533fef4f57aefec5591c 100644 --- a/config/params.yaml +++ b/config/params.yaml @@ -1,3 +1,5 @@ -rate: 10 -collision_acc_th: 9.8 +rate: 100 +tf_timeout: 0.2 +collision_acc_th: 5.0 err_msg_rate: 0.5 +fixed_frame: helena/base_link diff --git a/include/collision_manager_alg_node.h b/include/collision_manager_alg_node.h index 1990ed2880751e05abd00f8a3a6489d445d2763b..a08940da94906d64ceb465e67608914908268dd5 100644 --- a/include/collision_manager_alg_node.h +++ b/include/collision_manager_alg_node.h @@ -27,8 +27,11 @@ #include <iri_base_algorithm/iri_base_algorithm.h> #include "collision_manager_alg.h" +#include <Eigen/Eigen> // [publisher subscriber headers] +#include <tf2_geometry_msgs/tf2_geometry_msgs.h> +#include <tf2_ros/transform_listener.h> #include <sensor_msgs/Imu.h> // [service client headers] @@ -42,9 +45,19 @@ class CollisionManagerAlgNode : public algorithm_base::IriBaseAlgorithm<CollisionManagerAlgorithm> { private: + Eigen::Vector3d imu_local_acc_; ///< Local input linear acceleration. + bool new_imu_input_; ///< Flag to know that new input data has been received. + std::string imu_frame_; ///< IMU frame id. + Eigen::Transform<double,3,Eigen::Affine> tf_fixed_frame_imu_; ///< Transform from fixed frame to IMU frame. + bool tf_loaded_; ///< Flag to know that tf_fixed_frame_imu has been loaded before. + // [publisher attributes] // [subscriber attributes] + tf2_ros::Buffer tf2_buffer; + + tf2_ros::TransformListener tf2_listener; + ros::Subscriber imu_subscriber_; void imu_callback(const sensor_msgs::Imu::ConstPtr& msg); pthread_mutex_t imu_mutex_; @@ -85,6 +98,15 @@ class CollisionManagerAlgNode : public algorithm_base::IriBaseAlgorithm<Collisio ~CollisionManagerAlgNode(void); protected: + /** + * \brief Function to tranform linear local acceleration to fixed frame. + * + * This checks if imu frame id is different from fixed frame and if not already + * saved, it saves the transfrom. + * + * \param _global_acc The current global linear acceleration. + */ + bool get_global_acc(Eigen::Vector3d& _global_acc); /** * \brief main node thread * diff --git a/launch/rosbag_and_rviz.launch b/launch/rosbag_and_rviz.launch new file mode 100644 index 0000000000000000000000000000000000000000..87b62bd9f53e90839889cda0d65b2bf677e5c89d --- /dev/null +++ b/launch/rosbag_and_rviz.launch @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<launch> + + <arg name="output" default="screen"/> + <arg name="rviz" default="true"/> + <arg name="map" default="false"/> + <arg name="rviz_cfg" default="$(find iri_collision_manager)/rviz/dogs.rviz"/> + <arg name="rosbag_dir" default="$(find iri_collision_manager)/rosbag/"/> + <arg name="rosbag_file" default="ref.bag"/> + <param name="/use_sim_time" value="true" /> + <arg name="factor" default="1"/> + <arg name="sec" default="0"/> + <arg name="map_file" default="$(find iri_collision_manager)/rosbag/map/map.bag.yaml"/> + + <node name="player_iri_landmarks_tracker" + pkg ="rosbag" + type="play" + output="$(arg output)" + args="--clock -r $(arg factor) -s $(arg sec) --pause $(arg rosbag_dir)$(arg rosbag_file)"> + </node> + + <node name="rviz_iri_collision_manager" + pkg ="rviz" + type="rviz" + if ="$(arg rviz)" + args="-d $(arg rviz_cfg)"> + </node> + + <node name="map_server" + pkg="map_server" + type="map_server" + if="$(arg map)" + args="$(arg map_file)"> + </node> +</launch> diff --git a/launch/test.launch b/launch/test.launch index 88af9cfb25273b2805f0f848e5ef27874a1ff914..cdc21d29f953ef144ea54f6411df0916443db1c7 100644 --- a/launch/test.launch +++ b/launch/test.launch @@ -5,12 +5,17 @@ <arg name="launch_prefix" default=""/> <arg name="dr" default="false"/> <arg name="collision_config_file" default="$(find iri_collision_manager)/config/params.yaml"/> + <arg name="imu_topic" default="/helena/sensors/bno055_imu/imu"/> + + <arg name="sim_time" default="false"/> + <param name="/use_sim_time" value="$(arg sim_time)" /> <include file="$(find iri_collision_manager)/launch/node.launch"> <arg name="node_name" value="iri_collision_manager"/> <arg name="output" value="$(arg output)"/> <arg name="launch_prefix" value="$(arg launch_prefix)"/> <arg name="config_file" value="$(arg collision_config_file)"/> + <arg name="imu_topic" value="$(arg imu_topic)"/> </include> <node name="rqt_reconfigure_iri_collision_manager" diff --git a/package.xml b/package.xml index 8de7e139e2075b7088414ef4132eadf9a3de4c95..1342d3743761903e4469498994301c51fb85e666 100644 --- a/package.xml +++ b/package.xml @@ -52,6 +52,7 @@ <build_depend>iri_base_algorithm</build_depend> <build_export_depend>iri_base_algorithm</build_export_depend> <exec_depend>iri_base_algorithm</exec_depend> + <depend>tf2_ros</depend> <depend>sensor_msgs</depend> diff --git a/rviz/dogs.rviz b/rviz/dogs.rviz new file mode 100644 index 0000000000000000000000000000000000000000..e93389a4bdef6e7f6b81fc16a3dec81832f0627f --- /dev/null +++ b/rviz/dogs.rviz @@ -0,0 +1,319 @@ +Panels: + - Class: rviz/Displays + Help Height: 78 + Name: Displays + Property Tree Widget: + Expanded: + - /Global Options1 + - /Status1 + Splitter Ratio: 0.5058823823928833 + Tree Height: 728 + - Class: rviz/Selection + Name: Selection + - Class: rviz/Tool Properties + Expanded: + - /2D Pose Estimate1 + - /2D Nav Goal1 + - /Publish Point1 + Name: Tool Properties + Splitter Ratio: 0.5886790156364441 + - Class: rviz/Views + Expanded: + - /Current View1 + Name: Views + Splitter Ratio: 0.5 + - Class: rviz/Time + Experimental: false + Name: Time + SyncMode: 0 + SyncSource: LaserScan +Preferences: + PromptSaveOnExit: true +Toolbars: + toolButtonStyle: 2 +Visualization Manager: + Class: "" + Displays: + - Alpha: 0.5 + Cell Size: 1 + Class: rviz/Grid + Color: 160; 160; 164 + Enabled: true + Line Style: + Line Width: 0.029999999329447746 + Value: Lines + Name: Grid + Normal Cell Count: 0 + Offset: + X: 0 + Y: 0 + Z: 0 + Plane: XY + Plane Cell Count: 10 + Reference Frame: <Fixed Frame> + Value: true + - Class: rviz/TF + Enabled: true + Frame Timeout: 15 + Frames: + All Enabled: false + helena/base_footprint: + Value: false + helena/base_link: + Value: true + helena/camera_bottom_screw_frame: + Value: false + helena/camera_color_frame: + Value: false + helena/camera_color_optical_frame: + Value: false + helena/camera_depth_frame: + Value: false + helena/camera_depth_optical_frame: + Value: false + helena/camera_infra1_frame: + Value: false + helena/camera_infra1_optical_frame: + Value: false + helena/camera_infra2_frame: + Value: false + helena/camera_infra2_optical_frame: + Value: false + helena/camera_link: + Value: false + helena/front_left_axle: + Value: false + helena/front_left_hub: + Value: false + helena/front_left_wheel: + Value: false + helena/front_right_axle: + Value: false + helena/front_right_hub: + Value: false + helena/front_right_wheel: + Value: false + helena/front_sonar: + Value: false + helena/helena_box: + Value: false + helena/helena_realsense_support: + Value: false + helena/imu_bno055: + Value: true + helena/imu_bno055_base: + Value: false + helena/odom: + Value: true + helena/rear_left_axle: + Value: false + helena/rear_left_hub: + Value: false + helena/rear_left_wheel: + Value: false + helena/rear_right_axle: + Value: false + helena/rear_right_hub: + Value: false + helena/rear_right_wheel: + Value: false + helena/rear_sonar: + Value: false + helena/robosense: + Value: false + helena/robosense_base: + Value: false + helena/top_plate: + Value: false + Marker Scale: 1 + Name: TF + Show Arrows: true + Show Axes: true + Show Names: true + Tree: + helena/odom: + helena/base_footprint: + helena/base_link: + helena/front_left_axle: + helena/front_left_hub: + helena/front_left_wheel: + {} + helena/front_right_axle: + helena/front_right_hub: + helena/front_right_wheel: + {} + helena/front_sonar: + {} + helena/rear_left_axle: + helena/rear_left_hub: + helena/rear_left_wheel: + {} + helena/rear_right_axle: + helena/rear_right_hub: + helena/rear_right_wheel: + {} + helena/rear_sonar: + {} + helena/top_plate: + helena/helena_box: + {} + helena/helena_realsense_support: + helena/camera_bottom_screw_frame: + helena/camera_link: + helena/camera_color_frame: + helena/camera_color_optical_frame: + {} + helena/camera_depth_frame: + helena/camera_depth_optical_frame: + {} + helena/camera_infra1_frame: + helena/camera_infra1_optical_frame: + {} + helena/camera_infra2_frame: + helena/camera_infra2_optical_frame: + {} + helena/robosense_base: + helena/robosense: + {} + helena/imu_bno055_base: + helena/imu_bno055: + {} + Update Interval: 0 + Value: true + - Angle Tolerance: 0.10000000149011612 + Class: rviz/Odometry + Covariance: + Orientation: + Alpha: 0.5 + Color: 255; 255; 127 + Color Style: Unique + Frame: Local + Offset: 1 + Scale: 1 + Value: true + Position: + Alpha: 0.30000001192092896 + Color: 204; 51; 204 + Scale: 1 + Value: true + Value: true + Enabled: true + Keep: 100 + Name: Odometry + Position Tolerance: 0.10000000149011612 + Shape: + Alpha: 1 + Axes Length: 1 + Axes Radius: 0.10000000149011612 + Color: 255; 25; 0 + Head Length: 0.30000001192092896 + Head Radius: 0.10000000149011612 + Shaft Length: 1 + Shaft Radius: 0.05000000074505806 + Value: Arrow + Topic: /helena/odom + Unreliable: false + Value: true + - Alpha: 1 + Class: rviz_plugin_tutorials/Imu + Color: 204; 51; 204 + Enabled: false + History Length: 1 + Name: Imu + Topic: /helena/sensors/bno055_imu/imu + Unreliable: false + Value: false + - Alpha: 1 + Autocompute Intensity Bounds: true + Autocompute Value Bounds: + Max Value: 10 + Min Value: -10 + Value: true + Axis: Z + Channel Name: intensity + Class: rviz/LaserScan + Color: 138; 226; 52 + Color Transformer: FlatColor + Decay Time: 0 + Enabled: true + Invert Rainbow: false + Max Color: 255; 255; 255 + Min Color: 0; 0; 0 + Name: LaserScan + Position Transformer: XYZ + Queue Size: 10 + Selectable: true + Size (Pixels): 3 + Size (m): 0.009999999776482582 + Style: Points + Topic: /helena/sensors/scan + Unreliable: false + Use Fixed Frame: true + Use rainbow: true + Value: true + Enabled: true + Global Options: + Background Color: 48; 48; 48 + Default Light: true + Fixed Frame: helena/odom + Frame Rate: 30 + Name: root + Tools: + - Class: rviz/Interact + Hide Inactive Objects: true + - Class: rviz/MoveCamera + - Class: rviz/Select + - Class: rviz/FocusCamera + - Class: rviz/Measure + - Class: rviz/SetInitialPose + Theta std deviation: 0.2617993950843811 + Topic: /initialpose + X std deviation: 0.5 + Y std deviation: 0.5 + - Class: rviz/SetGoal + Topic: /move_base_simple/goal + - Class: rviz/PublishPoint + Single click: true + Topic: /clicked_point + Value: true + Views: + Current: + Class: rviz/Orbit + Distance: 25.189504623413086 + Enable Stereo Rendering: + Stereo Eye Separation: 0.05999999865889549 + Stereo Focal Distance: 1 + Swap Stereo Eyes: false + Value: false + Focal Point: + X: 1.3301063776016235 + Y: -0.2307669073343277 + Z: -2.2700793743133545 + Focal Shape Fixed Size: true + Focal Shape Size: 0.05000000074505806 + Invert Z Axis: false + Name: Current View + Near Clip Distance: 0.009999999776482582 + Pitch: 1.5697963237762451 + Target Frame: <Fixed Frame> + Value: Orbit (rviz) + Yaw: 1.5953969955444336 + Saved: ~ +Window Geometry: + Displays: + collapsed: false + Height: 1025 + Hide Left Dock: false + Hide Right Dock: false + QMainWindow State: 000000ff00000000fd00000004000000000000015600000363fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000363000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000363fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d00000363000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000073d0000003efc0100000002fb0000000800540069006d006501000000000000073d000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000004cc0000036300000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 + Selection: + collapsed: false + Time: + collapsed: false + Tool Properties: + collapsed: false + Views: + collapsed: false + Width: 1853 + X: 67 + Y: 27 diff --git a/src/collision_manager_alg_node.cpp b/src/collision_manager_alg_node.cpp index 33d0feb944e40a89ac2079a145593e995f93d35c..d578d06866751a2b9eb7246c78418fbb69003bc3 100644 --- a/src/collision_manager_alg_node.cpp +++ b/src/collision_manager_alg_node.cpp @@ -2,6 +2,7 @@ CollisionManagerAlgNode::CollisionManagerAlgNode(void) : algorithm_base::IriBaseAlgorithm<CollisionManagerAlgorithm>() + ,tf2_listener(tf2_buffer) { //init class attributes if necessary if(!this->private_node_handle_.getParam("rate", this->config_.rate)) @@ -11,6 +12,16 @@ CollisionManagerAlgNode::CollisionManagerAlgNode(void) : else this->setRate(this->config_.rate); + if(!this->private_node_handle_.getParam("fixed_frame", this->config_.fixed_frame)) + { + ROS_WARN("AdcLandmarksSlamSolverAlgNode::AdcLandmarksSlamSolverAlgNode: param 'fixed_frame' not found. Setting it to map."); + this->config_.fixed_frame = "map"; + } + + this->new_imu_input_ = false; + this->imu_frame_ = ""; + this->tf_loaded_ = false; + // [init publishers] // [init subscribers] @@ -36,17 +47,103 @@ CollisionManagerAlgNode::~CollisionManagerAlgNode(void) void CollisionManagerAlgNode::mainNodeThread(void) { //lock access to algorithm if necessary - this->alg_.lock(); - ROS_DEBUG("CollisionManagerAlgNode::mainNodeThread"); + // this->alg_.lock(); + // ROS_DEBUG("CollisionManagerAlgNode::mainNodeThread"); + this->imu_mutex_enter(); + + if (this->new_imu_input_) + { + Eigen::Vector3d global_acc; + if (get_global_acc(global_acc)) + { + double acc_norm_2d = std::sqrt(std::pow(global_acc(0),2) + std::pow(global_acc(1),2)); + double acc_angle_2d = std::atan2(global_acc(1), global_acc(0)); + while (acc_angle_2d >= M_PI) + acc_angle_2d -= 2*M_PI; + while (acc_angle_2d < -M_PI) + acc_angle_2d += 2*M_PI; + if (acc_norm_2d > this->config_.collision_acc_th) + ROS_INFO_STREAM("CollisionManagerAlgNode::mainNodeThread -> collision detected: acc = " << acc_norm_2d << "; angle = " << acc_angle_2d); + } + this->new_imu_input_ = false; + } + // [fill msg structures] + /* + //tf2_listener example BEGIN + try{ + std::string target_frame = "child_frame"; + std::string source_frame = "parent_frame"; + ros::Time time = ros::Time::now(); + ros::Duration timeout = ros::Duration(0.1); + this->alg_.unlock(); + bool tf2_exists = this->tf2_buffer.canTransform(target_frame, source_frame, time, timeout); + this->alg_.lock(); + if(tf2_exists){ + geometry_msgs::PoseStamped stamped_pose_in; + stamped_pose_in.header.stamp = time; + stamped_pose_in.header.frame_id = source_frame; + stamped_pose_in.pose.position.x = 1.0; + stamped_pose_in.pose.position.y = 0.0; + stamped_pose_in.pose.position.z = 0.0; + tf2::Quaternion quat_tf; + quat_tf.setRPY(0.0, 0.0, 1.5709); + geometry_msgs::Quaternion quat_msg; + tf2::convert(quat_tf, quat_msg); + stamped_pose_in.pose.orientation = quat_msg; + double yaw, pitch, roll; + tf2::Matrix3x3(tf2::Quaternion(quat_msg.x, quat_msg.y,quat_msg.z, quat_msg.w)).getEulerYPR(yaw, pitch, roll); + ROS_INFO("Original pose in '%s' frame, with (x,y,z)=[%f,%f,%f], (yaw,pitch,roll)=[%f,%f,%f]", stamped_pose_in.header.frame_id.c_str(), stamped_pose_in.pose.position.x, stamped_pose_in.pose.position.y, stamped_pose_in.pose.position.z, yaw, pitch, roll); + geometry_msgs::PoseStamped stamped_pose_out; + geometry_msgs::TransformStamped transform; + transform = this->tf2_buffer.lookupTransform(target_frame, source_frame, time); + quat_msg = transform.transform.rotation; + tf2::Matrix3x3(tf2::Quaternion(quat_msg.x, quat_msg.y,quat_msg.z, quat_msg.w)).getEulerYPR(yaw, pitch, roll); + ROS_INFO("Found transform betwen frames (%s-->%s) with (x,y,z)=[%f,%f,%f], (yaw,pitch,roll)=[%f,%f,%f]", source_frame.c_str(), target_frame.c_str(), transform.transform.translation.x, transform.transform.translation.y, transform.transform.translation.z, yaw, pitch, roll); + tf2::doTransform(stamped_pose_in, stamped_pose_out, transform); + quat_msg = stamped_pose_out.pose.orientation; + tf2::Matrix3x3(tf2::Quaternion(quat_msg.x, quat_msg.y,quat_msg.z, quat_msg.w)).getEulerYPR(yaw, pitch, roll); + ROS_INFO("Transformed pose in '%s' frame, with (x,y,z)=[%f,%f,%f], (yaw,pitch,roll)=[%f,%f,%f]", stamped_pose_out.header.frame_id.c_str(), stamped_pose_out.pose.position.x, stamped_pose_out.pose.position.y, stamped_pose_out.pose.position.z, yaw, pitch, roll); + ROS_INFO("---"); + }else{ + ROS_WARN("No transform found from '%s' to '%s'", source_frame.c_str(), target_frame.c_str()); } + }catch (tf2::TransformException &ex){ + ROS_ERROR("TF2 Exception: %s",ex.what()); } + //tf2_listener example END + */ + + // [fill srv structure and make request to the server] // [fill action structure and make request to the action server] // [publish messages] - - this->alg_.unlock(); + + this->imu_mutex_exit(); + // this->alg_.unlock(); +} + +bool CollisionManagerAlgNode::get_global_acc(Eigen::Vector3d& _global_acc) +{ + if (this->config_.fixed_frame != this->imu_frame_ || !this->tf_loaded_) + { + geometry_msgs::TransformStamped tf_fixed_frame_imu_msg; + if (!this->tf2_buffer.canTransform(this->config_.fixed_frame, this->imu_frame_, ros::Time::now(), ros::Duration(this->config_.tf_timeout))) + { + ROS_WARN_STREAM("CollisionManagerAlgNode::get_global_acc -> Can't transform from " << this->config_.fixed_frame << " to " << this->imu_frame_ << " at " << ros::Time::now()); + this->tf_loaded_ = false; + return false; + } + tf_fixed_frame_imu_msg = this->tf2_buffer.lookupTransform(this->config_.fixed_frame, this->imu_frame_, ros::Time::now()); + Eigen::Quaternion<double> rot( + tf_fixed_frame_imu_msg.transform.rotation.w, tf_fixed_frame_imu_msg.transform.rotation.x, tf_fixed_frame_imu_msg.transform.rotation.y, tf_fixed_frame_imu_msg.transform.rotation.z); + + this->tf_fixed_frame_imu_ = Eigen::Transform<double,3,Eigen::Affine>(rot); + this->tf_loaded_ = true; + } + _global_acc = this->tf_fixed_frame_imu_*this->imu_local_acc_; + return true; } /* [subscriber callbacks] */ @@ -57,14 +154,9 @@ void CollisionManagerAlgNode::imu_callback(const sensor_msgs::Imu::ConstPtr& msg //use appropiate mutex to shared variables if necessary //this->alg_.lock(); this->imu_mutex_enter(); - double acc_norm_2d = std::sqrt(std::pow(msg->linear_acceleration.x,2) + std::pow(msg->linear_acceleration.y,2)); - double acc_angle_2d = std::atan2(msg->linear_acceleration.y, msg->linear_acceleration.x); - while (acc_angle_2d >= M_PI) - acc_angle_2d -= 2*M_PI; - while (acc_angle_2d < -M_PI) - acc_angle_2d += 2*M_PI; - if (acc_norm_2d > this->config_.collision_acc_th) - ROS_INFO_STREAM("CollisionManagerAlgNode::imu_callback -> collision detected: acc = " << acc_norm_2d << "; angle = " << acc_angle_2d); + this->new_imu_input_ = true; + this->imu_frame_ = msg->header.frame_id; + this->imu_local_acc_ = Eigen::Vector3d(msg->linear_acceleration.x, msg->linear_acceleration.y, msg->linear_acceleration.z); //std::cout << msg->data << std::endl; //unlock previously blocked shared variables //this->alg_.unlock();