Add imu publish by sync
This commit is contained in:
parent
77e4411a4c
commit
c58dd28f63
|
@ -525,7 +525,7 @@ std::ostream &operator<<(std::ostream &os, const Extrinsics &ex);
|
||||||
struct MYNTEYE_API ImgData {
|
struct MYNTEYE_API ImgData {
|
||||||
/** Image frame id */
|
/** Image frame id */
|
||||||
std::uint16_t frame_id;
|
std::uint16_t frame_id;
|
||||||
/** Image timestamp in 0.01ms */
|
/** Image timestamp in 1us */
|
||||||
std::uint64_t timestamp;
|
std::uint64_t timestamp;
|
||||||
/** Image exposure time, virtual value in [1, 480] */
|
/** Image exposure time, virtual value in [1, 480] */
|
||||||
std::uint16_t exposure_time;
|
std::uint16_t exposure_time;
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<arg name="enable_disparity" default="false" />
|
<arg name="enable_disparity" default="false" />
|
||||||
<arg name="enable_disparity_norm" default="false" />
|
<arg name="enable_disparity_norm" default="false" />
|
||||||
<arg name="enable_points" default="false" />
|
<arg name="enable_points" default="false" />
|
||||||
<arg name="enable_depth" default="true" />
|
<arg name="enable_depth" default="false" />
|
||||||
|
|
||||||
<!-- device options, -1 will not set the value -->
|
<!-- device options, -1 will not set the value -->
|
||||||
|
|
||||||
|
|
|
@ -62,8 +62,13 @@ class ROSWrapperNodelet : public nodelet::Nodelet {
|
||||||
<< ", fps: " << (left_count_ / time_elapsed);
|
<< ", fps: " << (left_count_ / time_elapsed);
|
||||||
LOG(INFO) << "Right count: " << right_count_
|
LOG(INFO) << "Right count: " << right_count_
|
||||||
<< ", fps: " << (right_count_ / time_elapsed);
|
<< ", fps: " << (right_count_ / time_elapsed);
|
||||||
|
if (publish_imu_by_sync_) {
|
||||||
|
LOG(INFO) << "imu_sync_count: " << imu_sync_count_
|
||||||
|
<< ", hz: " << (imu_sync_count_ / time_elapsed);
|
||||||
|
} else {
|
||||||
LOG(INFO) << "Imu count: " << imu_count_
|
LOG(INFO) << "Imu count: " << imu_count_
|
||||||
<< ", hz: " << (imu_count_ / time_elapsed);
|
<< ", hz: " << (imu_count_ / time_elapsed);
|
||||||
|
}
|
||||||
|
|
||||||
// ROS messages could not be reliably printed here, using glog instead :(
|
// ROS messages could not be reliably printed here, using glog instead :(
|
||||||
// ros::Duration(1).sleep(); // 1s
|
// ros::Duration(1).sleep(); // 1s
|
||||||
|
@ -322,6 +327,21 @@ class ROSWrapperNodelet : public nodelet::Nodelet {
|
||||||
// imu_time_prev = data.imu->timestamp;
|
// imu_time_prev = data.imu->timestamp;
|
||||||
|
|
||||||
++imu_count_;
|
++imu_count_;
|
||||||
|
if (publish_imu_by_sync_) {
|
||||||
|
if (data.imu) {
|
||||||
|
if (data.imu->flag == 1) { // accelerometer
|
||||||
|
imu_accel_ = data.imu;
|
||||||
|
publishImuBySync(stamp);
|
||||||
|
} else if (data.imu->flag == 2) { // gyroscope
|
||||||
|
imu_gyro_ = data.imu;
|
||||||
|
publishImuBySync(stamp);
|
||||||
|
} else {
|
||||||
|
NODELET_WARN_STREAM("Imu type is unknown");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
NODELET_WARN_STREAM("Motion data is empty");
|
||||||
|
}
|
||||||
|
}
|
||||||
publishImu(data, imu_count_, stamp);
|
publishImu(data, imu_count_, stamp);
|
||||||
publishTemp(data.imu->temperature, imu_count_, stamp);
|
publishTemp(data.imu->temperature, imu_count_, stamp);
|
||||||
NODELET_DEBUG_STREAM(
|
NODELET_DEBUG_STREAM(
|
||||||
|
@ -484,6 +504,59 @@ class ROSWrapperNodelet : public nodelet::Nodelet {
|
||||||
pub_imu_.publish(msg);
|
pub_imu_.publish(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void publishImuBySync(ros::Time stamp) {
|
||||||
|
if (imu_accel_ == nullptr || imu_gyro_ == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sensor_msgs::Imu msg;
|
||||||
|
|
||||||
|
msg.header.seq = imu_sync_count_;
|
||||||
|
msg.header.stamp = stamp;
|
||||||
|
msg.header.frame_id = imu_frame_id_;
|
||||||
|
|
||||||
|
// acceleration should be in m/s^2 (not in g's)
|
||||||
|
msg.linear_acceleration.x = imu_accel_->accel[0] * gravity_;
|
||||||
|
msg.linear_acceleration.y = imu_accel_->accel[1] * gravity_;
|
||||||
|
msg.linear_acceleration.z = imu_accel_->accel[2] * gravity_;
|
||||||
|
|
||||||
|
msg.linear_acceleration_covariance[0] = 0;
|
||||||
|
msg.linear_acceleration_covariance[1] = 0;
|
||||||
|
msg.linear_acceleration_covariance[2] = 0;
|
||||||
|
|
||||||
|
msg.linear_acceleration_covariance[3] = 0;
|
||||||
|
msg.linear_acceleration_covariance[4] = 0;
|
||||||
|
msg.linear_acceleration_covariance[5] = 0;
|
||||||
|
|
||||||
|
msg.linear_acceleration_covariance[6] = 0;
|
||||||
|
msg.linear_acceleration_covariance[7] = 0;
|
||||||
|
msg.linear_acceleration_covariance[8] = 0;
|
||||||
|
|
||||||
|
// velocity should be in rad/sec
|
||||||
|
msg.angular_velocity.x = imu_gyro_->gyro[0] * M_PI / 180;
|
||||||
|
msg.angular_velocity.y = imu_gyro_->gyro[1] * M_PI / 180;
|
||||||
|
msg.angular_velocity.z = imu_gyro_->gyro[2] * M_PI / 180;
|
||||||
|
|
||||||
|
msg.angular_velocity_covariance[0] = 0;
|
||||||
|
msg.angular_velocity_covariance[1] = 0;
|
||||||
|
msg.angular_velocity_covariance[2] = 0;
|
||||||
|
|
||||||
|
msg.angular_velocity_covariance[3] = 0;
|
||||||
|
msg.angular_velocity_covariance[4] = 0;
|
||||||
|
msg.angular_velocity_covariance[5] = 0;
|
||||||
|
|
||||||
|
msg.angular_velocity_covariance[6] = 0;
|
||||||
|
msg.angular_velocity_covariance[7] = 0;
|
||||||
|
msg.angular_velocity_covariance[8] = 0;
|
||||||
|
|
||||||
|
pub_imu_.publish(msg);
|
||||||
|
|
||||||
|
publishTemp(imu_accel_->temperature, imu_sync_count_, stamp);
|
||||||
|
|
||||||
|
++imu_sync_count_;
|
||||||
|
imu_accel_ = nullptr;
|
||||||
|
imu_gyro_ = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void publishTemp(float temperature, std::uint32_t seq, ros::Time stamp) {
|
void publishTemp(float temperature, std::uint32_t seq, ros::Time stamp) {
|
||||||
if (pub_temp_.getNumSubscribers() == 0)
|
if (pub_temp_.getNumSubscribers() == 0)
|
||||||
return;
|
return;
|
||||||
|
@ -795,6 +868,10 @@ class ROSWrapperNodelet : public nodelet::Nodelet {
|
||||||
std::size_t left_count_ = 0;
|
std::size_t left_count_ = 0;
|
||||||
std::size_t right_count_ = 0;
|
std::size_t right_count_ = 0;
|
||||||
std::size_t imu_count_ = 0;
|
std::size_t imu_count_ = 0;
|
||||||
|
std::size_t imu_sync_count_ = 0;
|
||||||
|
std::shared_ptr<ImuData> imu_accel_;
|
||||||
|
std::shared_ptr<ImuData> imu_gyro_;
|
||||||
|
bool publish_imu_by_sync_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
MYNTEYE_END_NAMESPACE
|
MYNTEYE_END_NAMESPACE
|
||||||
|
|
Loading…
Reference in New Issue
Block a user