|
@@ -1,11 +1,11 @@
|
|
|
/*****************************************************************
|
|
|
- * Copyright:2016-2021 www.corvin.cn ROS小课堂
|
|
|
+ * Copyright:2016-2022 www.corvin.cn ROS小课堂
|
|
|
* Description:使用串口来读取IMU模块的数据,并通过ROS话题topic将
|
|
|
* 数据发布出来.芯片中默认读取出来的加速度数据单位是g,需要将其
|
|
|
* 转换为ROS中加速度规定的m/s2才能发布.
|
|
|
* Author: corvin
|
|
|
* History:
|
|
|
- * 20200403: init this file.
|
|
|
+ * 20200403:init this file.
|
|
|
* 20200406:增加发布yaw数据的话题.
|
|
|
* 20200703:修改三轴加速度数据正负,按照ROS规定沿着各轴
|
|
|
* 正方向时数据为正,否则为负.单位m/s2。
|
|
@@ -18,6 +18,8 @@
|
|
|
* 20210321:增加可以设置D0,D1,D2,D3共4个IO引脚输出数字高低电平
|
|
|
* 的服务,这里的高电平为3.3V.增加通过服务方式获取yaw数据.
|
|
|
* 20211003:增加发布pitch和roll数据的话题.
|
|
|
+ * 20220220:修改三轴加速度数据正负值,ROS中使用ENU坐标系,规定Z轴线
|
|
|
+ * 加速度的正方向为下,所以IMU静止时G为正值.
|
|
|
*****************************************************************/
|
|
|
#include <ros/ros.h>
|
|
|
#include <tf/tf.h>
|
|
@@ -30,24 +32,22 @@
|
|
|
#include "serial_imu_hat_6dof/setPinOutHL.h"
|
|
|
#include "serial_imu_hat_6dof/getYawData.h"
|
|
|
|
|
|
-
|
|
|
static float g_yawData; //全局变量,存储当前yaw值,可以通过服务来得到该值
|
|
|
|
|
|
-/**********************************************************
|
|
|
- * Description:将yaw角度归零的话题回调函数,只要往话题中
|
|
|
- * 发布一条Empty消息,即可将yaw角度归零.
|
|
|
- *********************************************************/
|
|
|
+/***********************************************************
|
|
|
+ * Description:将yaw角度归零的话题回调函数,只要往话题中发布一条
|
|
|
+ * std_msgs::Empty类型消息,即可将yaw角度归零.
|
|
|
+ **********************************************************/
|
|
|
void yawZeroCallback(const std_msgs::Empty::ConstPtr& msg)
|
|
|
{
|
|
|
makeYawZero();
|
|
|
}
|
|
|
|
|
|
/******************************************************************
|
|
|
- * Description:使用service方式来进行yaw角度归零,这里是服务的回调
|
|
|
- * 函数,当有客户端发送yaw归零的服务时,自动调用该函数,如果正确
|
|
|
- * 执行了yaw归零,则response反馈为0,如果为其他负数则表明yaw归零
|
|
|
- * 命令执行失败.
|
|
|
- *****************************************************************/
|
|
|
+ * Description:使用service方式来进行yaw角度归零,这里是服务的回调函数,
|
|
|
+ * 当有客户端发送yaw归零的服务时,自动调用该函数,如果正确执行了yaw归零,
|
|
|
+ * 则response反馈为0,如果为其他负数则表明yaw归零命令执行失败.
|
|
|
+ ******************************************************************/
|
|
|
bool yawZeroService(serial_imu_hat_6dof::setYawZero::Request &req,
|
|
|
serial_imu_hat_6dof::setYawZero::Response &res)
|
|
|
{
|
|
@@ -112,15 +112,15 @@ int main(int argc, char **argv)
|
|
|
std::string yaw_data_service;
|
|
|
|
|
|
int pub_topic_hz = 0; //话题发布imu数据的频率
|
|
|
- float degree2Rad = 3.1415926/180.0;
|
|
|
- float acc_factor = 9.806;
|
|
|
+ const float degree2Rad = 0.017453292; //3.1415926/180.0 角度转换为弧度的系数
|
|
|
+ const float acc_factor = 9.806; //重力加速度常量
|
|
|
|
|
|
ros::init(argc, argv, "imu_data_pub_node");
|
|
|
ros::NodeHandle handle;
|
|
|
|
|
|
//launch文件中加载yaml配置文件,然后从配置文件中读取参数
|
|
|
- ros::param::get("~imu_dev", imu_dev);
|
|
|
- ros::param::get("~baud_rate", baud);
|
|
|
+ ros::param::get("~imu_dev", imu_dev);
|
|
|
+ ros::param::get("~baud_rate", baud);
|
|
|
ros::param::get("~imu_link_name", imu_link_name);
|
|
|
ros::param::get("~pub_topic_hz", pub_topic_hz);
|
|
|
ros::param::get("~pub_data_topic", imu_topic_name);
|
|
@@ -189,7 +189,7 @@ int main(int argc, char **argv)
|
|
|
imu_msg.orientation_covariance = {0.0025, 0, 0,
|
|
|
0, 0.0025, 0,
|
|
|
0, 0, 0.0025};
|
|
|
-
|
|
|
+ //三轴角速度数据
|
|
|
imu_msg.angular_velocity.x = getAngular(0)*degree2Rad;
|
|
|
imu_msg.angular_velocity.y = getAngular(1)*degree2Rad;
|
|
|
imu_msg.angular_velocity.z = getAngular(2)*degree2Rad;
|
|
@@ -197,10 +197,10 @@ int main(int argc, char **argv)
|
|
|
0, 0.02, 0,
|
|
|
0, 0, 0.02};
|
|
|
|
|
|
- //ROS_INFO("acc_x:%f acc_y:%f acc_z:%f",getAcc(0), getAcc(1), getAcc(2));
|
|
|
- imu_msg.linear_acceleration.x = -getAcc(0)*acc_factor;
|
|
|
- imu_msg.linear_acceleration.y = -getAcc(1)*acc_factor;
|
|
|
- imu_msg.linear_acceleration.z = -getAcc(2)*acc_factor;
|
|
|
+ //三轴线加速度数据,这里都为正值
|
|
|
+ imu_msg.linear_acceleration.x = getAcc(0)*acc_factor;
|
|
|
+ imu_msg.linear_acceleration.y = getAcc(1)*acc_factor;
|
|
|
+ imu_msg.linear_acceleration.z = getAcc(2)*acc_factor;
|
|
|
imu_msg.linear_acceleration_covariance = {0.04, 0, 0,
|
|
|
0, 0.04, 0,
|
|
|
0, 0, 0.04};
|
|
@@ -212,4 +212,4 @@ int main(int argc, char **argv)
|
|
|
|
|
|
closeSerialPort(); //关闭与IMU模块的串口连接
|
|
|
return 0;
|
|
|
-}
|
|
|
+}
|