添加 IMU 节点时间戳,优化日志
This commit is contained in:
@@ -37,7 +37,7 @@ constexpr uint8_t MSG_AHRS = 0x41; // 航姿参考系统数据
|
|||||||
constexpr uint8_t MSG_BODY_ACCELERATION = 0x62; // 机体系加速度数据
|
constexpr uint8_t MSG_BODY_ACCELERATION = 0x62; // 机体系加速度数据
|
||||||
|
|
||||||
// 默认串口设备
|
// 默认串口设备
|
||||||
constexpr const char *DEFAULT_SERIAL_PORT = "/dev/ttyUSB1";
|
constexpr const char *DEFAULT_SERIAL_PORT = "/dev/ttyIMU";
|
||||||
constexpr int DEFAULT_BAUDRATE = 921600;
|
constexpr int DEFAULT_BAUDRATE = 921600;
|
||||||
|
|
||||||
// 串口读取缓冲区大小 (921600bps ≈ 115KB/s, 缓冲区需要足够大)
|
// 串口读取缓冲区大小 (921600bps ≈ 115KB/s, 缓冲区需要足够大)
|
||||||
@@ -439,9 +439,28 @@ private:
|
|||||||
float q3 = *reinterpret_cast<const float *>(data + 32);
|
float q3 = *reinterpret_cast<const float *>(data + 32);
|
||||||
float q4 = *reinterpret_cast<const float *>(data + 36);
|
float q4 = *reinterpret_cast<const float *>(data + 36);
|
||||||
|
|
||||||
|
// 解析时间戳 (int64_t, us)
|
||||||
|
int64_t timestamp_us = *reinterpret_cast<const int64_t *>(data + 40);
|
||||||
|
|
||||||
|
// 将 IMU 时间戳转换为 ROS 时间
|
||||||
|
// 使用当前 ROS 时间作为基准,计算相对时间
|
||||||
|
rclcpp::Time current_time = this->now();
|
||||||
|
rclcpp::Time imu_time =
|
||||||
|
imu_base_time_ + rclcpp::Duration(0, timestamp_us * 1000);
|
||||||
|
|
||||||
|
// 如果是第一个数据包,初始化基准时间
|
||||||
|
if (!imu_time_initialized_) {
|
||||||
|
imu_base_time_ = current_time - rclcpp::Duration(0, timestamp_us * 1000);
|
||||||
|
imu_time = current_time;
|
||||||
|
imu_time_initialized_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存最新的 IMU 时间戳,供 BodyAcceleration 使用
|
||||||
|
latest_imu_timestamp_ = imu_time;
|
||||||
|
|
||||||
// 发布 IMU 消息
|
// 发布 IMU 消息
|
||||||
sensor_msgs::msg::Imu imu_msg;
|
sensor_msgs::msg::Imu imu_msg;
|
||||||
imu_msg.header.stamp = this->now();
|
imu_msg.header.stamp = imu_time;
|
||||||
imu_msg.header.frame_id = "imu_link";
|
imu_msg.header.frame_id = "imu_link";
|
||||||
|
|
||||||
// 角速度 (转换为 ROS 坐标系: x=roll, y=pitch, z=heading)
|
// 角速度 (转换为 ROS 坐标系: x=roll, y=pitch, z=heading)
|
||||||
@@ -465,9 +484,10 @@ private:
|
|||||||
// 根据 verbose 参数输出日志
|
// 根据 verbose 参数输出日志
|
||||||
bool verbose = this->get_parameter("verbose").as_bool();
|
bool verbose = this->get_parameter("verbose").as_bool();
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
RCLCPP_INFO(this->get_logger(),
|
RCLCPP_INFO(
|
||||||
"AHRS - Roll: %.3f, Pitch: %.3f, Heading: %.3f rad", roll,
|
this->get_logger(),
|
||||||
pitch, heading);
|
"AHRS - Roll: %.3f, Pitch: %.3f, Heading: %.3f rad, Time: %ld us",
|
||||||
|
roll, pitch, heading, timestamp_us);
|
||||||
} else {
|
} else {
|
||||||
RCLCPP_DEBUG(this->get_logger(),
|
RCLCPP_DEBUG(this->get_logger(),
|
||||||
"AHRS - Roll: %.3f, Pitch: %.3f, Heading: %.3f rad", roll,
|
"AHRS - Roll: %.3f, Pitch: %.3f, Heading: %.3f rad", roll,
|
||||||
@@ -488,6 +508,12 @@ private:
|
|||||||
// 解析重力加速度
|
// 解析重力加速度
|
||||||
float g_force = *reinterpret_cast<const float *>(data + 12);
|
float g_force = *reinterpret_cast<const float *>(data + 12);
|
||||||
|
|
||||||
|
// 使用与 AHRS 相同的时间戳(如果可用),否则使用当前时间
|
||||||
|
rclcpp::Time msg_time = latest_imu_timestamp_;
|
||||||
|
if (msg_time.nanoseconds() == 0) {
|
||||||
|
msg_time = this->now();
|
||||||
|
}
|
||||||
|
|
||||||
// 发布机体系加速度
|
// 发布机体系加速度
|
||||||
geometry_msgs::msg::Vector3 acc_msg;
|
geometry_msgs::msg::Vector3 acc_msg;
|
||||||
acc_msg.x = acc_x;
|
acc_msg.x = acc_x;
|
||||||
@@ -504,11 +530,11 @@ private:
|
|||||||
bool verbose = this->get_parameter("verbose").as_bool();
|
bool verbose = this->get_parameter("verbose").as_bool();
|
||||||
if (verbose) {
|
if (verbose) {
|
||||||
RCLCPP_INFO(this->get_logger(),
|
RCLCPP_INFO(this->get_logger(),
|
||||||
"BodyAcc - X: %.3f, Y: %.3f, Z: %.3f m/s², G: %.3f", acc_x,
|
"BodyAcc - X: %.3f, Y: %.3f, Z: %.3f m/s2, G: %.3f", acc_x,
|
||||||
acc_y, acc_z, g_force);
|
acc_y, acc_z, g_force);
|
||||||
} else {
|
} else {
|
||||||
RCLCPP_DEBUG(this->get_logger(),
|
RCLCPP_DEBUG(this->get_logger(),
|
||||||
"BodyAcc - X: %.3f, Y: %.3f, Z: %.3f m/s², G: %.3f", acc_x,
|
"BodyAcc - X: %.3f, Y: %.3f, Z: %.3f m/s2, G: %.3f", acc_x,
|
||||||
acc_y, acc_z, g_force);
|
acc_y, acc_z, g_force);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,6 +565,11 @@ private:
|
|||||||
std::atomic<size_t> ahrs_count_;
|
std::atomic<size_t> ahrs_count_;
|
||||||
std::atomic<size_t> body_acc_count_;
|
std::atomic<size_t> body_acc_count_;
|
||||||
|
|
||||||
|
// IMU 时间戳同步
|
||||||
|
bool imu_time_initialized_ = false;
|
||||||
|
rclcpp::Time imu_base_time_;
|
||||||
|
rclcpp::Time latest_imu_timestamp_;
|
||||||
|
|
||||||
rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr ahrs_pub_;
|
rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr ahrs_pub_;
|
||||||
rclcpp::Publisher<geometry_msgs::msg::Vector3>::SharedPtr body_acc_pub_;
|
rclcpp::Publisher<geometry_msgs::msg::Vector3>::SharedPtr body_acc_pub_;
|
||||||
rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr g_force_pub_;
|
rclcpp::Publisher<std_msgs::msg::Float32>::SharedPtr g_force_pub_;
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ private:
|
|||||||
snprintf(buf, sizeof(buf), "%02X ", frame[i]);
|
snprintf(buf, sizeof(buf), "%02X ", frame[i]);
|
||||||
frame_hex += buf;
|
frame_hex += buf;
|
||||||
}
|
}
|
||||||
RCLCPP_INFO(this->get_logger(), "[发包](%d字节): %s", FRAME_LENGTH,
|
RCLCPP_INFO(this->get_logger(), "[TX](%dB): %s", FRAME_LENGTH,
|
||||||
frame_hex.c_str());
|
frame_hex.c_str());
|
||||||
|
|
||||||
// 发送数据
|
// 发送数据
|
||||||
@@ -321,7 +321,7 @@ private:
|
|||||||
|
|
||||||
// 输出详细日志
|
// 输出详细日志
|
||||||
RCLCPP_INFO(this->get_logger(),
|
RCLCPP_INFO(this->get_logger(),
|
||||||
"[收包]: %02X %02X | x:%d y:%d yaw:%d "
|
"[RX]: %02X %02X | x:%d y:%d yaw:%d "
|
||||||
"pitch:%d feed:%d | L:%d R:%d | CRC:%02X | %02X",
|
"pitch:%d feed:%d | L:%d R:%d | CRC:%02X | %02X",
|
||||||
frame_buffer[0], frame_buffer[1], x_move, y_move,
|
frame_buffer[0], frame_buffer[1], x_move, y_move,
|
||||||
yaw, pitch, feed, left_switch, right_switch,
|
yaw, pitch, feed, left_switch, right_switch,
|
||||||
|
|||||||
Reference in New Issue
Block a user