工作小结之——ROS收发不同类型Message(一)


任务介绍:

1:   分别发布高斯投影下的GPS消息和UTM下的GPS消息;

2:订阅GPS消息,并将激光检测到的平面的位置和角度通过自定义消息类型发布出去;

任务1:发布转换后的两种GPS

在/src下创建的gps.cpp文件(包含main()的文件)中:

需要为发布和订阅添加头文件:

```

#include "ros/ros.h"    //使用ROS必须包含的头文件
#include <geometry_msgs/PoseStamped.h> //发布的GPS消息类型属于geometry_msgs/PoseStamped

```

其中的geometry_msgs/PoseStamped.h可以在ROS官网中查到

这里先附上GPS转到高斯克吕格投影下和UTM坐标系下的函数:

        高斯克吕格投影:

```

void GaussProjCal(double longitude, double latitude, double &X, double &Y)
{
    int ProjNo = 0; int ZoneWide;     //带宽
    double longitude1, latitude1, longitude0, latitude0, X0, Y0, xval, yval;
    double a, f, e2, ee, NN, T, C, A, M, iPI;
    iPI = 0.0174532925199433;
    ZoneWide = 3;//wgs84  3度带
    a = 6378137;
    f = 1 / 298.2572236; //WGS84椭球参数
    //ProjNo = trunc((longitude - 1.5) / 3) + 1;//计算度带号
    ProjNo = 40;
    longitude0 = ProjNo * ZoneWide;//计算中央经线
    longitude0 = longitude0 * iPI;

    latitude0 = 0;
    longitude1 = longitude * iPI; //经度转换为弧度
    latitude1 = latitude * iPI; //纬度转换为弧度
    e2 = 2 * f - f*f;
    ee = e2 * (1.0 - e2);
    NN = a / sqrt(1.0 - e2 * sin(latitude1) * sin(latitude1));
    T = tan(latitude1) * tan(latitude1);
    C = ee * cos(latitude1) * cos(latitude1);
    A = (longitude1 - longitude0) * cos(latitude1);
    M = a * ((1 - e2 / 4 - 3 * e2 * e2 / 64 - 5 * e2 * e2 *e2 / 256) * latitude1
           - (3 * e2 / 8 + 3 * e2 * e2 / 32 + 45 * e2 * e2 * e2 / 1024) * sin(2 * latitude1)
           + (15 * e2 *e2 / 256 + 45 * e2*e2*e2 / 1024)*sin(4 * latitude1)
           - (35 * e2 * e2 * e2 / 3072) * sin(6 * latitude1));
    xval = NN * (A + (1 - T + C) * A * A * A / 6
                   + (5 - 18 * T + T*T + 72 * C - 58 * ee)* A * A * A * A * A / 120);
    yval = M + NN * tan(latitude1) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24
             + (61 - 58 * T + T * T + 600 * C - 330 * ee)* A * A * A * A * A * A / 720);
    X0 = /*1000000L * ProjNo*/ + 500000L;//3度带内的相对平面坐标
    Y0 = 0;
    xval = xval + X0; yval = yval + Y0;
    X = xval;
    Y = yval;
}
```

        UTM坐标系:

```

void GC2UTM(const double longitude_, const double latitude_, const double height_ellipsoid_,

double *utm_x, double *utm_y, double *utm_z)

{

int ProjNo = 0;

int ZoneWide = 0;

double longitude1, latitude1, longitude0, latitude0, X0, Y0, xval, yval;

double a, f, e2, ee, NN, T, C, A, M, iPI;

iPI = 0.017453293;//=DEGREE_TO_RADIAN;

ZoneWide = 3; //3 DEGREE width

a = 6378137;

f = 1 / 298.257223563;//earth ellipse constant

double longitude = longitude_;

double latitude = latitude_;

double altitude = height_ellipsoid_;

ProjNo = (int)(longitude / ZoneWide) ;

longitude0 = ProjNo * ZoneWide + ZoneWide / 2;

longitude0 = longitude0 * iPI ;

latitude0  = 0;

longitude1 = longitude * iPI ; //经度转换为弧度

latitude1 = latitude * iPI ; //纬度转换为弧度

e2 = 2 * f - f * f;

ee = e2 * (1.0 - e2);

NN = a / sqrt(1.0 - e2 * sin(latitude1) * sin(latitude1));

T = tan(latitude1) * tan(latitude1);

C = ee * cos(latitude1) * cos(latitude1);

A = (longitude1 - longitude0) * cos(latitude1);

M = a * ((1 - e2 / 4 - 3 * e2 * e2 / 64 - 5 * e2 * e2 * e2 / 256) * latitude1 -

(3 * e2 / 8 + 3 * e2 * e2 / 32 + 45 * e2 * e2 * e2 / 1024) * sin(2 * latitude1)+

(15 * e2 * e2 / 256 + 45 * e2 * e2 * e2 / 1024) * sin(4 * latitude1) -

(35 * e2 * e2 * e2 / 3072) * sin(6 * latitude1));

xval = NN * (A + (1 - T + C) * A * A * A /6 +

(5 - 18 * T + T * T + 72 * C - 58 * ee) *  A * A * A * A * A / 120);

yval = M + NN * tan(latitude1) * (A * A/2 + (5 - T + 9 * C + 4 *  C* C) * A * A * A * A / 24

+(61 - 58 * T + T * T + 600 * C - 330 * ee) * A * A * A * A * A * A / 720);

X0 = 1000000L * (ProjNo + 1) + 500000L;

Y0 = 0;

xval = xval + X0;

yval = yval + Y0;

*utm_x = xval;

*utm_y = yval;

*utm_z = altitude;

}

```

接下来在main函数内添加以下内容:

```

    ros::init(argc,argv,"gps_pub"); //初始化ROS,节点名称为gps_pub
    ros::NodeHandle n;                 //ROS系统通讯
    ros::Publisher gps_utm_puber = n.advertise<geometry_msgs::PoseStamped>("/gps_pose_utm", 1);   //定义 要publish的消息类型和消息名称,1为消息缓冲的数量 
    ros::Publisher gps_gauss_puber = n.advertise<geometry_msgs::PoseStamped>("/gps_pose_gauss", 1); 

    geometry_msgs::PoseStamped geo_utm_msg; //定义了 geometry_msgs::PoseStamped的对象 geo_utm_msg
    geometry_msgs::PoseStamped geo_gauss_msg; 

```

主函数分别调用GaussProjCal(lon, lat, x, y)和GC2UTM(lon, lat, hei, utm_x, utm_y, utm_z):

```

                    GaussProjCal(lon, lat, x, y);
                    gauss_msg.lon = x;
                    gauss_msg.lat = y;
                    gauss_msg.height = 0;
                    gauss_msg.yaw = gpsimu.yaw;
                    gauss_msg.roll = gpsimu.roll;
                    gauss_msg.pitch = gpsimu.pitch;

                    double hei = gpsimu.height;
                    geo_gauss_msg.header.stamp = ros::Time::now();
                    geo_gauss_msg.pose.position.x = x - origin_E;
                    geo_gauss_msg.pose.position.y = y - origin_N;
                    geo_gauss_msg.pose.position.z = 0;

                    Eigen::AngleAxisd rollAngle(0, Eigen::Vector3d::UnitX());
                    Eigen::AngleAxisd pitchAngle(0, Eigen::Vector3d::UnitY());
                    Eigen::AngleAxisd yawAngle( M_PI /2.0 - gpsimu.yaw / 180.0 * M_PI, Eigen::Vector3d::UnitZ());
                    Eigen::Quaterniond q = yawAngle * pitchAngle * rollAngle;
                    geo_gauss_msg.pose.orientation.w = q.w();
                    geo_gauss_msg.pose.orientation.x = q.x();
                    geo_gauss_msg.pose.orientation.y = q.y();
                    geo_gauss_msg.pose.orientation.z = q.z();
                    gps_gauss_puber.publish(geo_gauss_msg);//发布高斯GPS

                    GC2UTM(lon, lat, hei, utm_x, utm_y, utm_z);
                    geo_utm_msg.header.stamp = ros::Time::now();
                    geo_utm_msg.pose.position.x = *utm_x - origin_E; 
                    geo_utm_msg.pose.position.y = *utm_y - origin_N;
                    geo_utm_msg.pose.position.z = 0;
                    geo_utm_msg.pose.orientation.w = q.w();
                    geo_utm_msg.pose.orientation.x = q.x();
                    geo_utm_msg.pose.orientation.y = q.y();
                    geo_utm_msg.pose.orientation.z = q.z();
                    gps_utm_puber.publish(geo_utm_msg); //发布UTM_GPS

```

在CMakeLists.txt中找到## Declare a C++ executable,在下边添加

```

add_executable(${PROJECT_NAME}_node
    src/gps.cpp
    src/kvaserToDBC.cpp
    src/interpreter.cpp)

target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
   canlib
   kvadblib
 )

```

add_executable表示要添加一个可执行文件,${PROJECT_NAME}_node为这个可执行文件的名字,src/gps.cpp,src/kvaserToDBC.cpp和src/interpreter.cpp为编译这个工程的源文件位置;

target_link_libraries表示我们要将可执行文件链接到的库,因为原始的GPS是通过can发送过来的,所以用到了canlib和kvadblib

至此,编译,运行之后即实现了ROS下两种类型GPS的发布。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354