forked from IntelRealSense/realsense-ros
-
Notifications
You must be signed in to change notification settings - Fork 0
/
t265_realsense_node.cpp
119 lines (104 loc) · 4.6 KB
/
t265_realsense_node.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "../include/t265_realsense_node.h"
using namespace realsense2_camera;
T265RealsenseNode::T265RealsenseNode(ros::NodeHandle& nodeHandle,
ros::NodeHandle& privateNodeHandle,
rs2::device dev,
const std::string& serial_no) :
BaseRealSenseNode(nodeHandle, privateNodeHandle, dev, serial_no),
_wo_snr(dev.first<rs2::wheel_odometer>()),
_use_odom_in(false)
{
_monitor_options = {RS2_OPTION_ASIC_TEMPERATURE, RS2_OPTION_MOTION_MODULE_TEMPERATURE};
initializeOdometryInput();
}
void T265RealsenseNode::initializeOdometryInput()
{
std::string calib_odom_file;
_pnh.param("calib_odom_file", calib_odom_file, std::string(""));
if (calib_odom_file.empty())
{
ROS_INFO("No calib_odom_file. No input odometry accepted.");
return;
}
std::ifstream calibrationFile(calib_odom_file);
if (not calibrationFile)
{
ROS_FATAL_STREAM("calibration_odometry file not found. calib_odom_file = " << calib_odom_file);
throw std::runtime_error("calibration_odometry file not found" );
}
const std::string json_str((std::istreambuf_iterator<char>(calibrationFile)),
std::istreambuf_iterator<char>());
const std::vector<uint8_t> wo_calib(json_str.begin(), json_str.end());
if (!_wo_snr.load_wheel_odometery_config(wo_calib))
{
ROS_FATAL_STREAM("Format error in calibration_odometry file: " << calib_odom_file);
throw std::runtime_error("Format error in calibration_odometry file" );
}
_use_odom_in = true;
}
void T265RealsenseNode::publishTopics()
{
BaseRealSenseNode::publishTopics();
setupSubscribers();
}
void T265RealsenseNode::setupSubscribers()
{
if (not _use_odom_in) return;
std::string topic_odom_in;
_pnh.param("topic_odom_in", topic_odom_in, DEFAULT_TOPIC_ODOM_IN);
ROS_INFO_STREAM("Subscribing to in_odom topic: " << topic_odom_in);
_odom_subscriber = _node_handle.subscribe(topic_odom_in, 1, &T265RealsenseNode::odom_in_callback, this);
}
void T265RealsenseNode::odom_in_callback(const nav_msgs::Odometry::ConstPtr& msg)
{
ROS_DEBUG("Got in_odom message");
rs2_vector velocity {-(float)(msg->twist.twist.linear.y),
(float)(msg->twist.twist.linear.z),
-(float)(msg->twist.twist.linear.x)};
ROS_DEBUG_STREAM("Add odom: " << velocity.x << ", " << velocity.y << ", " << velocity.z);
_wo_snr.send_wheel_odometry(0, 0, velocity);
}
void T265RealsenseNode::calcAndPublishStaticTransform(const stream_index_pair& stream, const rs2::stream_profile& base_profile)
{
// Transform base to stream
tf::Quaternion quaternion_optical;
quaternion_optical.setRPY(M_PI / 2, 0.0, -M_PI / 2); //Pose To ROS
float3 zero_trans{0, 0, 0};
ros::Time transform_ts_ = ros::Time::now();
rs2_extrinsics ex;
try
{
ex = getAProfile(stream).get_extrinsics_to(base_profile);
}
catch (std::exception& e)
{
if (!strcmp(e.what(), "Requested extrinsics are not available!"))
{
ROS_WARN_STREAM(e.what() << " : using unity as default.");
ex = rs2_extrinsics({{1, 0, 0, 0, 1, 0, 0, 0, 1}, {0,0,0}});
}
else
{
throw e;
}
}
auto Q = rotationMatrixToQuaternion(ex.rotation);
Q = quaternion_optical * Q * quaternion_optical.inverse();
float3 trans{ex.translation[0], ex.translation[1], ex.translation[2]};
if (stream == POSE)
{
Q = Q.inverse();
publish_static_tf(transform_ts_, trans, Q, _frame_id[stream], _base_frame_id);
}
else
{
publish_static_tf(transform_ts_, trans, Q, _base_frame_id, _frame_id[stream]);
publish_static_tf(transform_ts_, zero_trans, quaternion_optical, _frame_id[stream], _optical_frame_id[stream]);
// Add align_depth_to if exist:
if (_align_depth && _depth_aligned_frame_id.find(stream) != _depth_aligned_frame_id.end())
{
publish_static_tf(transform_ts_, trans, Q, _base_frame_id, _depth_aligned_frame_id[stream]);
publish_static_tf(transform_ts_, zero_trans, quaternion_optical, _depth_aligned_frame_id[stream], _optical_frame_id[stream]);
}
}
}