ROS节点解析GPS数据:GPRMC/GPFDP/HEADINGA

2023-05-16

数据解析,肯定是要知道数据格式的:

数据格式参考:(前人已经总结的比较齐全了)

https://blog.csdn.net/u010384390/article/details/78432016?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163031225416780274159663%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163031225416780274159663&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-78432016.pc_search_result_control_group&utm_term=headinga&spm=1018.2226.3001.4187

星网宇达的XW-GI类产品,GPS解析到的协议是GPFPD:GI定位定姿消息集。其数据格式如下所示:

最高输出速率:100HZ

举例:

 配置接收机的输出格式为:(使用cutecom接收,输出频率为5Hz)

[13:29:49:216] $GPFPD,1356,20.60,0.000,0.000,0.000,0.000000000,0.000000000,0.000,0.000,0.000,0.000,0.000,0,0,0*72␍␊

[13:29:49:225] $GPRMC,000006.60,V,0000.0000000,S,00000.0000000,W,0.000,0.0,010106,0.0,E,N*24␍␊

[13:29:49:230] #HEADINGA,COM1,0,0,FINESTEERING,1356,20.600,00000000,0000,0036;SOL_COMPUTED,NONE,0.000000000,0.000000000,0.000000000,0,0.000,0.000,"0000",0,0,0,0,00,00,30,17*3CB347CB␍␊

[13:29:49:416] $GPFPD,1356,20.80,0.000,0.000,0.000,0.000000000,0.000000000,0.000,0.000,0.000,0.000,0.000,0,0,0*7C␍␊

[13:29:49:425] $GPRMC,000006.80,V,0000.0000000,S,00000.0000000,W,0.000,0.0,010106,0.0,E,N*2A␍␊

[13:29:49:430] #HEADINGA,COM1,0,0,FINESTEERING,1356,20.800,00000000,0000,0036;SOL_COMPUTED,NONE,0.000000000,0.000000000,0.000000000,0,0.000,0.000,"0000",0,0,0,0,00,00,30,17*1A63E506␍

使用ROS编写节点进行解析,思路为:

1,配置串口,与接收机的波特率等设置保持一致;配置节点循环频率为5Hz,频率相同会简单很多;

2,打开串口,接收数据;

3,数据分割为三个部分,GPFPD/GPRMC/HEADINGA;

4,使用sscanf函数进行解析(也可以使用C++的分割函数,本人更熟悉C语言。。)

5,存放在结构体中,打印显示。

现实结果为:(terminal显示)

gpfpd=
$GPFPD,1356,13110.00,0.000,0.000,0.000,0.000000000,0.000000000,0.000,0.000,0.000,0.000,0.000,0,0,0*44
gprmc=
$GPRMC,033816.00,V,0000.0000000,S,00000.0000000,W,0.000,0.0,010106,0.0,E,N*2B
headingA=
#HEADINGA,COM1,0,0,FINESTEERING,1356,13110.000,00000000,0000,0036;SOL_COMPUTED,NONE,0.000000000,0.000000000,0.000000000,0,0.000,0.000,"0000",0,0,0,0,00,00,30,17*22C246A7

*************GPS_data*****************
utc_time:033816.00
status:V
latitude:S  0.000000000
longtitude:W  0.000000000
speed:0.000000
azimuth_angle:0.000000
utc_data:010106
isRTKstate:N
*************GPFDP_data*****************
GPSWeek:1356
GPSTime:13110.00
Heading:0.000000
Pitch:0.000000
Roll:0.000000
Latitude: 0.000000000
Longitude: 0.000000000
Altitude: 0.000000000
[Ve Vn Vu]=[0.000000 0.000000 0.000000]
Baseline =0.000000
Status:0
*************HEADINGA_DATA*****************
cal_state=SOL_COMPUTED
pos_type=NONE
baseline=0.000000
HeadingA=0.000000
Pitch=0.000000

(以上为显示,下面上代码)

头文件gps.h

#ifndef __GPS_H__
#define __GPS_H__

#include<stdio.h>          
#include<stdlib.h>        
#include<unistd.h>       
#include<string.h>
#define GPS_LEN 512
#define BUF_SIZE 16
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;

typedef struct __gnrmc__
{
    u32 time;
    char pos_state;
    float latitude;
    float longitude;
    float speed;
    float direction;
    u32 date;
    float declination;
    char dd;
    char mode;
}GNRMC;
int gps_analyse(char *buff, GNRMC *gps_date);
int print_gps(GNRMC *gps_date);

// define GPS_INFO
typedef struct gps_info
{
	char utc_time[BUF_SIZE];
	char status;
	double latitude_value;
	char latitude;
	double longtitude_value;
	char longtitude;
	float speed;
	float azimuth_angle;
	char utc_data[BUF_SIZE];
	float magnetic_declination;
	char magnetic_declination_dir;
	char isRTKstate[4];
}GPS_INFO;

int gprmc_analyse(char *buff,GPS_INFO *gprmc_data);
int gprmc_print(GPS_INFO *gprmc_data);

//***********define GPFDP_info**************
typedef struct gpfpd_info
{
	unsigned int GPSWeek;		//自1980-1-6至当前的星期数
	char GPSTime[BUF_SIZE];		//本周00:00:00至当前的秒数
	float Heading;				//偏航角
	float Pitch;				//俯仰角
	float Roll;					//滚转角
	double Latitude;			//纬度 deg
	double Longitude;			//经度 deg
	float Altitude;				//高度 m
	float Ve;					//东 速度 m/s
	float Vn;					//北 速度 m/s
	float Vu;					//天 速度 m/s
	float Baseline;				//基线长度
	int NSV1;		//天线1卫星数
	int NSV2;		//天线2卫星数
	char Status[4];		//系统状态
}GPFPD_INFO;

int gpfdp_analyse(char *buff,GPFPD_INFO *gpfdp_data);
int gpdfp_print(GPFPD_INFO *gpfdp_data);

//***********define headingA_info**************
typedef struct headingA_info
{
	char cal_state[32];	//SOL_COMPUTED 完全解算 INSUFFICIENT_OBS 观测量不足 COLD_START 冷启动,尚未完全解算 
	char pos_type[16];	//NONE 未解算
						/*FIXEDPOS 已设置固定坐标
						SINGLE 单点解定位
						PSRDIFF 伪距差分解定位
						NARROW_FLOAT 浮点解
						WIDE_INT 宽带固定解
						NARROE_INT 窄带固定解
						SUPER WIDE_LINE 超宽带解 */
	float baseline;		//基线长度
	float HeadingA;		//方位角
	float Pitch;		//俯仰角
}HEADINGA_INFO;
int headingA_analyse(char *buff,HEADINGA_INFO *headinga_data);
int headingA_print(HEADINGA_INFO *headinga_data);
#endif

gps.cpp

#include "/home/ling/catkin_ws/src/serialdemo/include/serialdemo/gps.h"
//************************get-gnrmc-data***************************
int gps_analyse (char *buff,GNRMC *gps_data)
{
    char *ptr = NULL;

    if(gps_data == NULL)
    {
        return -1;
    }

    if(strlen(buff)<10)
    {
        return -1;
    }
    //如果buff字符串中包含字符"$GNRMC"则将$GNRMC的地址赋值给ptr
    if(NULL==(ptr=strstr(buff,"$GNRMC")))
    {
        return -1;
    }
    sscanf(ptr,"$GNRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_data->time),&(gps_data->pos_state),&(gps_data->latitude),&(gps_data->longitude),&(gps_data->speed),&(gps_data->direction),&(gps_data->date),&(gps_data->mode));
//sscanf函数为从字符串输入,上面这句话的意思是将ptr内存单元的值作为输入分别输入到后面的结构体成员
    return 0;
} 

int print_gps (GNRMC *gps_data)
{
    printf("===========================================================\n");
    printf("==   GPS状态位 : %c  [A:有效状态 V:无效状态]              \n",gps_data->pos_state);
    printf("==   GPS模式位 : %c  [A:自主定位 D:差分定位]               \n", gps_data->mode);
    printf("==   日期 : 20%02d-%02d-%02d                                  \n",gps_data->date%100,(gps_data->date%10000)/100,gps_data->date/10000);
    printf("==   时间 : %02d:%02d:%02d                                   \n",(gps_data->time/10000+8)%24,(gps_data->time%10000)/100,gps_data->time%100);
    printf("==   纬度 : 北纬:%d度%d分%d秒                              \n", ((int)gps_data->latitude) / 100, (int)(gps_data->latitude - ((int)gps_data->latitude / 100 * 100)), (int)(((gps_data->latitude - ((int)gps_data->latitude / 100 * 100)) - ((int)gps_data->latitude - ((int)gps_data->latitude / 100 * 100))) * 60.0));
    printf("==   经度 : 东经:%d度%d分%d秒                              \n", ((int)gps_data->longitude) / 100, (int)(gps_data->longitude - ((int)gps_data->longitude / 100 * 100)), (int)(((gps_data->longitude - ((int)gps_data->longitude / 100 * 100)) - ((int)gps_data->longitude - ((int)gps_data->longitude / 100 * 100))) * 60.0));
    printf("==   速度 : %.3f  m/s                                      \n",gps_data->speed);
    printf("============================================================\n");

    return 0;
} 
//***************************get gprmc data**************************
int gprmc_analyse(char *buff,GPS_INFO *gprmc_data)
{
	char *wellhandled_string;
	size_t i=0,readcnt=0;
	if(strlen(buff)<32)
	{
		// length of frame is 72,if datalength is too short,return.
		return -1;
	}
	if ((wellhandled_string = strstr(buff,"$GPRMC")) != NULL)
	{
		    for (i=0; i<strlen(wellhandled_string); i++)
		    {
		            if (wellhandled_string[i] == '\n')
		            {
		                    wellhandled_string[i] = '\0'; //replace ‘/n’ with null
		            }
		    }
	}
	readcnt=sscanf(wellhandled_string,"$GPRMC,%[^,],%c,%lf,%c,%lf,%c,%f,%f,%[^,],%*f,%*c,%[^*]",
            gprmc_data->utc_time,\
            &(gprmc_data->status),&(gprmc_data->latitude_value),&(gprmc_data->latitude),\
            &(gprmc_data->longtitude_value),&(gprmc_data->longtitude),&(gprmc_data->speed),\
            &(gprmc_data->azimuth_angle),\
            gprmc_data->utc_data,gprmc_data->isRTKstate);
	//printf("readcnt=%d\n",readcnt);
	return 0;
}
int gprmc_print(GPS_INFO *gprmc_data)
{
	printf("*************GPS_data*****************\n");
	printf("utc_time:%s\n",gprmc_data->utc_time); 
    printf("status:%c\n",gprmc_data->status); 
    printf("latitude:%c ",gprmc_data->latitude); 
    printf("%12.9lf\n",gprmc_data->latitude_value); 
    printf("longtitude:%c ",gprmc_data->longtitude); 
    printf("%12.9lf\n",gprmc_data->longtitude_value);  
    printf("speed:%f\n",gprmc_data->speed); 
    printf("azimuth_angle:%f\n",gprmc_data->azimuth_angle); 
    printf("utc_data:%s\n",gprmc_data->utc_data); 
	//printf("magnetic_declination:%f %c\n",gprmc_data->magnetic_declination,gprmc_data->magnetic_declination_dir);
    printf("isRTKstate:%c\n",gprmc_data->isRTKstate[0]); 
}
//***************************get gpfdp data**************************

int gpfdp_analyse(char *buff,GPFPD_INFO *gpfdp_data)
{
	char *wellhandled_temp;
	size_t i=0,reti=0;
	if(strlen(buff)<32)
	{
		return -1;// length of frame is 98,if datalength is too short,return.
	}
	if ((wellhandled_temp = strstr(buff,"$GPFPD")) != NULL)
	{
		for (i=0; i<strlen(wellhandled_temp); i++)
		{
	        if (wellhandled_temp[i] == '\n')
	        {
                wellhandled_temp[i] = '\0'; 
	        }
		}
	}
	//printf("wellhandled_temp=%s\n\n",wellhandled_temp);
	reti=sscanf(wellhandled_temp,"$GPFPD,%d,%[^,],%f,%f,%f,%lf,%lf,%f,%f,%f,%f,%f,%i,%i,%[^*]",
            &(gpfdp_data->GPSWeek),gpfdp_data->GPSTime,&(gpfdp_data->Heading),&(gpfdp_data->Pitch),&(gpfdp_data->Roll), \
			&(gpfdp_data->Latitude),&(gpfdp_data->Longitude),&(gpfdp_data->Altitude),\
			&(gpfdp_data->Ve),&(gpfdp_data->Vn),&(gpfdp_data->Vu),\
			&(gpfdp_data->Baseline),&(gpfdp_data->NSV1),&(gpfdp_data->NSV2),\
			gpfdp_data->Status);
	//printf("reti=%d\n",reti);	
	
	//wellhandled_temp=$GPFPD,1356,9013.40,0.000,0.000,0.000,0.000000000,0.000000000,0.000,0.000,0.000,0.000,0.000,0,0,0*79
	return 0;
}
int gpdfp_print(GPFPD_INFO *gpfdp_data)
{
	printf("*************GPFDP_data*****************\n");
	printf("GPSWeek:%d\n",gpfdp_data->GPSWeek); 
    printf("GPSTime:%s\n",gpfdp_data->GPSTime); 
    printf("Heading:%f\n",gpfdp_data->Heading); 
    printf("Pitch:%f\n",gpfdp_data->Pitch); 
    printf("Roll:%f\n",gpfdp_data->Roll); 
    printf("Latitude:%12.9lf\n",gpfdp_data->Latitude);  
    printf("Longitude:%12.9lf\n",gpfdp_data->Longitude); 
    printf("Altitude:%12.9lf\n",gpfdp_data->Altitude); 
    printf("[Ve Vn Vu]=[%f %f %f]\n",gpfdp_data->Ve,gpfdp_data->Vn,gpfdp_data->Vu); 
	printf("Baseline =%f\n",gpfdp_data->Baseline);
    printf("Status:%s\n",gpfdp_data->Status);
}

//***************************get headingA data**************************
int headingA_analyse(char *buff,HEADINGA_INFO *headinga_data)
{
	char *headingA_temp;
	size_t i=0,reti=0;
	if(strlen(buff)<100)
	{
		return -1;
	}
	if ((headingA_temp = strstr(buff,";")) != NULL)
	{
		for (i=0; i<strlen(headingA_temp); i++)
		{
	        if (headingA_temp[i] == '\n')
	        {
                headingA_temp[i] = '\0'; 
	        }
		}
	}
	//printf("headingA_temp=%s\n\n",headingA_temp);
	reti=sscanf(headingA_temp,";%[^,],%[^,],%f,%f,%f",
            headinga_data->cal_state,headinga_data->pos_type,&(headinga_data->baseline),\
			&(headinga_data->HeadingA),&(headinga_data->Pitch));
	//printf("reti=%d\n",reti);
}
int headingA_print(HEADINGA_INFO *headinga_data)
{
	printf("*************HEADINGA_DATA*****************\n");
	printf("cal_state=%s\n",headinga_data->cal_state);
	printf("pos_type=%s\n",headinga_data->pos_type);
	printf("baseline=%f\n",headinga_data->baseline);
	printf("HeadingA=%f\n",headinga_data->HeadingA);
	printf("Pitch=%f\n",headinga_data->Pitch);
}

主节点:

serial_port.cpp

//serial_port.cpp
#include <ros/ros.h>
#include <serial/serial.h>
#include <iostream>
#include "/home/ling/catkin_ws/src/serialdemo/include/serialdemo/gps.h"

GPS_INFO gps_info;
GPS_INFO *rmc_info=&gps_info;
GPFPD_INFO gpfdp_info;
GPFPD_INFO *gpfdp_pdata=&gpfdp_info;
HEADINGA_INFO headingA_info;
HEADINGA_INFO *headingA_pdata=&headingA_info;
char buff[2048];
char GPFPD_buf[1024];
char GPRMC_buf[1024];
char HEADINGA_buf[1024];
int main(int argc, char** argv)
{
    ros::init(argc, argv, "serial_port");
    //创建句柄(虽然后面没用到这个句柄,但如果不创建,运行时进程会出错)
    ros::NodeHandle n;
    
    //创建一个serial类
    serial::Serial sp;
    //创建timeout
    serial::Timeout to = serial::Timeout::simpleTimeout(1000);
    //设置要打开的串口名称
    sp.setPort("/dev/ttyUSB0");
	//sp.setPort("/dev/ttyS0");
    //设置串口通信的波特率
    sp.setBaudrate(115200);
    //串口设置timeout
    sp.setTimeout(to);
 
    try
    {
        //打开串口
        sp.open();
    }
    catch(serial::IOException& e)
    {
        ROS_ERROR_STREAM("Unable to open port.");
        return -1;
    }
    
    //判断串口是否打开成功
    if(sp.isOpen())
    {
        ROS_INFO_STREAM("/dev/ttyUSB0 is opened.");
    }
    else
    {
        return -1;
    }
    
    ros::Rate loop_rate(5);
    while(ros::ok())
    {
        //获取缓冲区内的字节数
        size_t n = sp.available();
        if(n!=0)
        {
            uint8_t buffer[2048];
            //读出数据
            n = sp.read(buffer, n);
            for(int i=0; i<n; i++)
            {
                //16进制的方式打印到屏幕
                //std::cout << std::hex << (buffer[i] & 0xff) << " ";
                buff[i]=buffer[i];
                //printf("%c",buff[i]);
                if(buffer[i]=='$'&&buffer[i+1]=='G'&&buffer[i+2]=='P'&&buffer[i+3]=='F'&&buffer[i+4]=='P' && buffer[i+5]=='D')
                {
                	for(int j=0;j<102 && buffer[i+j] != '\n';j++)
                	{
                		GPFPD_buf[j]=buffer[i+j];
                	}
                	printf("gpfpd=\n%s\n",GPFPD_buf);
                }
                if(buffer[i]=='$'&&buffer[i+1]=='G'&&buffer[i+2]=='P'&&buffer[i+3]=='R'&&buffer[i+4]=='M' && buffer[i+5]=='C')
                {
                	for(int j=0;j<100 && buffer[i+j] != '\n';j++)
                	{
                		GPRMC_buf[j]=buffer[i+j];
                	}
                	printf("gprmc=\n%s\n",GPRMC_buf);
                } 
                if(buffer[i]=='#'&&buffer[i+1]=='H'&&buffer[i+2]=='E'&&buffer[i+3]=='A'&&buffer[i+4]=='D' && buffer[i+5]=='I')
                {
                	for(int j=0;j<300 && buffer[i+j] != '\n';j++)
                	{
                		HEADINGA_buf[j]=buffer[i+j];
                	}
                	printf("headingA=\n%s\n",HEADINGA_buf);
                } 
            }
            std::cout << std::endl;
            //jiexie gps
			gprmc_analyse(GPRMC_buf,rmc_info);
			gprmc_print(rmc_info);				
			
			gpfdp_analyse(GPFPD_buf,gpfdp_pdata);
			gpdfp_print(gpfdp_pdata);
			
			headingA_analyse(HEADINGA_buf,headingA_pdata);
			headingA_print(headingA_pdata);
            //把数据发送回去
            //sp.write(buffer, n);
        }
        memset(buff,'\0',sizeof(buff));
        loop_rate.sleep();
    }
    
    //关闭串口
    sp.close();
 
    return 0;
}

越来越发现使用ROS可以很方便的连接起来各种传感器,彼此之间通信特别方便。以上过程中,遇到的问题有:linux中的串口配置,ros的seria功能包是使用,ros如何使用自己定义的头文件和源文件,sscanf函数的具体使用等。遇到问题欢迎留言交流~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS节点解析GPS数据:GPRMC/GPFDP/HEADINGA 的相关文章

  • 如何测试GPS状态?

    我现在创建一个应用程序来通过 GPS 检测设备的位置 我对 GPS 状态有疑问 我查看 GpsStatus Listener 但它很复杂 因为我是 Android 新手 这是我尝试对 GPS 状态执行的操作 我是否走在正确的轨道上 fina
  • 如何在 Android 中找到附近的应用程序用户?

    我正在制作一个应用程序 需要能够找到附近的人 他们是我的应用程序的用户 我看了很多类似问题的答案 似乎我别无选择 只能不断将用户的当前位置上传到服务器 并在必要时获取附近的用户列表 那么我的问题是 1 要获取附近的列表 应该有一些计算距离的
  • 如何确定当前用户位置是否在我的 MKCooperativeRegion 内?

    我有一个坐标区域 我已确定该区域包含我想要为我的应用程序显示的内容的限制 我已将其设置为具有中心点纬度 经度和跨度的 MKCooperativeRegion 如何确定当前 userLocation 是否在我的坐标区域内 使用地图矩形 这是使
  • Java中的多点三边测量算法

    我正在尝试在我的 Android 应用程序中实现三边测量算法来确定用户的室内位置 我正在使用超宽带信标来获取到固定点的距离 我能够采用中建议的方法三边测量法 Android Java https stackoverflow com ques
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 无法在 Ubuntu 20.04 上安装 ROS Melodic

    我正在尝试使用这些命令在 Ubuntu 20 04 上安装 ROS Melodic sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc
  • 使用 GPS 获取 Android 手机的位置

    我还有一个关于基本 Android 编程的问题 如何访问 GPS 来获取运行应用程序的手机的当前位置 检索信息需要多长时间 在这种情况下 GPS 可能被禁用 如何再次启用 禁用它 必须在 andorid 清单中授予哪些权限 问候并感谢您的回
  • Google 地图 (Android) 中的位置更新率

    我正在编写一个简单的基于 GPS 的应用程序 用于位置感知 每当启用 GPS 时 应用程序都会请求位置更新并以格式打印纬度和经度 TextView 如果 GPS 被禁用 位置提供商会回退到LocationManager NETWORK PR
  • 根据步行速度在 2 个 GPS 位置之间进行插值

    Problem 给定两个位置 L1 latitude1 longitude1 timestamp1 L2 latitude2 longitude2 timestamp2 以及可配置但恒定的移动速度 v 1 39 米每秒 例如 How can
  • 使用纬度/经度计算从 A 点到线段的距离

    我正在开发一个使用 GPS 的 Android 应用程序 我想知道如果 新位置 C 点 距离线段 AB 太远 是否有办法可以丢弃 GPS 位置数据 我正在使用发现的点到线段公式在维基百科上 http en wikipedia org wik
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件
  • 如何知道jar文件是否已经在运行?

    经过谷歌研究后 我找到了很好的答案 例如 1 using jps or jps l让 jars 在 JVM 下运行 这个答案可以 但是如果用户根本没有安装java并且我使用例如 bat文件和带有java JRE的文件夹运行我的jar 另外
  • Fused Location Provider 是不错的选择吗?

    我正在开发一个应用程序 我想在其中使用融合位置提供程序 但我有一些疑问 还有几个问题 当 GPS 关闭并且我将优先级设置为 HIGH 时 是否意味着 GPS 会自动打开 我可以根据需要将 UpdateLocation 设置为具有高优先级的
  • 如何请求用户开启定位服务

    我需要我的应用程序来访问用户的当前位置 它在应用程序开始时检查用户是否已设置 如果没有 我需要应用程序显示提示以使其使用位置服务 就像警报视图一样 点击按钮 它应该会带您进入 iPhone 上的位置服务屏幕 您可以通过以下代码检查 loca
  • 在android API 23中获取用户的位置

    我可以编写获取用户位置的代码 并且在 API 更多细节 我手动启用设备的 GPS 第一次运行应用程序请求权限并且没有日志返回 在下次运行应用程序时 返回我准备好的 Toast 检查您的提供商 这是我写的代码 public class Mai
  • 使用 WiFi 获取位置详细信息

    我正在 Android 中创建一个小应用程序 它指向当前位置 我已经使用了 GPS 提供商 但发现在某些地方我无法使用 GPS 提供商获取数据 任何人都可以帮我得到这个吗 如果您已连接到 WIFI 则只需使用网络提供商即可更新您的位置 他们
  • Android:CellID 不适用于所有运营商?

    当我请求 Cell ID 和 LAC 信息时 在某些设备上我无法检索它们 我使用这段代码 TelephonyManager tm TelephonyManager getSystemService Context TELEPHONY SER
  • 从iOS iphone中相机返回的图像中读取GPS数据

    我需要获取使用 iOS 设备相机拍摄的图像的 GPS 坐标 我不关心相机胶卷图像 只关心使用 UIImagePickerController SourceType Camera 拍摄的图像 我读过很多 stackoverflow 答案 比如
  • 在 Google Colaboratory 上运行gym-gazebo

    我正在尝试在 Google Colaboratory 上运行gym gazebo 在Colab上运行gazebo服务器 没有gui的gazebo 有问题 显示警告 Unable to create X window Rendering wi
  • GPSTracker 类不工作

    我尝试在我的应用程序中使用我在网上找到的 GPSTracker 类 并且我之前让它工作过 但现在似乎莫名其妙地不起作用 public class GPSTracker extends Service implements LocationL

随机推荐

  • mbedtls学习(6)RSA算法

    RSA算法 RSA算法是一种非对称加密算法 xff0c 特点时加密解密算法不同且加密解密密钥不同 xff0c 即一般公钥加密 xff0c 私钥解密 下面时RSA算法关键参数 n 模数 xff0c 位长度为1024比特或者2048比特e 公开
  • LVGL lv_label标签控件(5)

    lv label 相关API在lv label h中 文本模式 span class token keyword enum span span class token punctuation span span class token co
  • LVGL lv_page页面控件(23)

    lv page 页面控件 xff0c 是由2个lv cont容器控件构成 xff0c 其中一个容器作为lv page页面控件的背景层 xff0c 另一个容器作为lv page页面控件的载体 xff0c 此载体存放其他任何子对象 xff0c
  • FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤

    文章目录 消息队列消息队列结构读队列步骤写队列步骤 作用 信号量信号量结构 获取信号量释放信号量 互斥量 xff08 锁 xff09 互斥量结构 获取互斥量释放互斥量 递归互斥量 xff08 递归锁 xff09 获取递归互斥量释放递归互斥量
  • GDB调试宏

    参考 GDB需要调试宏只需用 g3选项编译 g 默认选项 xff0c 同 g2 g0 不生成任何调试信息 xff0c 和编译时不加 g 是一样的 g1 生成最少量的调试信息 xff0c 这些信息足够用来通过backtrace查看调用栈符号信
  • GDB格式化打印结构体

    参考 GDB pretty print set print pretty on GDB 打印数组索引 set print array span class token operator span indexes on 例子 span cla
  • 8080接口

    文章目录 简介引脚写时序读时序 简介 8080接口是由英特尔设计 xff0c 是一种并行 异步 半双工通信协议 xff0c 作用是用于外扩RAM ROM xff0c 后面也用于LCD接口 引脚 写时序 先拉低选中器件 xff0c 如果要写入
  • Centos 7离线安装最新版mysql

    测试环境 CentOS Linux release 7 9 2009 Core 1 准备工作 下载离线安装包 xff1a 1 1 浏览器打开地址 xff1a https dev mysql com downloads mysql 1 2 选
  • C语言UDP socket编程

    C语言UDP socket编程 UDP 服务器步骤如下 xff1a 1 创建等链接套接字fd 61 socket 2 绑定待链接套接字bind fd 服务器ip和端口 3 等待信息recvfrom fd 对端地址 UDP 客户端步骤如下 x
  • MQTT学习笔记(4)报文分析之PUBLISH

    PUBLISH xff08 发布消息 xff09 含义 xff1a 客户端到服务端或者服务端到客户端发布消息控制报文 xff0c 是双向的 一 固定报头 DUP 重发标志 当DUP被设置为0 xff0c 表示客户端或者服务器是第一次发送这个
  • MQTT学习笔记(6)搭建本地MQTT服务器

    目前主流的Broker有以下3个 xff1a Mosquitto xff1a https mosquitto org VerneMQ xff1a https vernemq com EMQTT xff1a http emqtt io 我们使
  • nrf52832学习笔记(4)修改蓝牙名称,掉电不丢失

    这篇主要介绍如何在手机端修改设备参数 xff0c 比如设备名称 且实现掉电不丢失 思路 xff1a 把需要修改的参数发送给设备 xff0c 设备根据uuid来分辨是参数 xff0c 并保存在flash中 xff0c 重启服务 xff0c 这
  • IIC协议总结

    这篇总结下IIC协议 简介 IIC xff0c Inter Integrated Circuit xff0c 集成电路总线 xff0c 需要2根线连接拓扑 xff0c 是半双工 xff0c 适用于 34 字节型 34 设备 特点 拓扑如下
  • ros+gazebo学习(持续更新)

    由于实习需要 xff0c 开始学习ROS的东西 这篇博客主要是记录在ROS 43 gazebo学习中遇到的各种坑 xff08 掩面 xff09 xff0c 希望能对一些也在该领域的同志提供一点小小帮助 安装问题 xff08 gazebo 4
  • TX2 ubuntu18.04 arm64架构 桌面系统为lxde 系统为轻量级 成功安装ros

    如标题所述 xff1a 硬件采用 xff1a TX2 ubuntu18 04 arm64架构 桌面系统为lxde 来安装ros xff0c 安装了两次都意外失败了 xff0c 后来终于找到了问题 在ros wiki 官网 xff08 htt
  • 解决NVIDIA jetson NX 板卡安装镜像之后,SD卡容量变小的问题

    解决NVIDIA jetson NX 板卡安装镜像之后 xff0c SD卡容量变小的问题 问题描述 xff1a 本人使用的SD卡为64G xff0c 安装了一个约30g的 img镜像 xff0c 之后插入NX板卡 xff0c 系统正常启动
  • USB接线定义和链接摄像头

    原文链接 xff1a https www cnblogs com chinalantian articles 2131361 html 写本文的意义在于了解USB的接线定义和实现使用手机数据线读取摄像头图像 USB接口定义 颜色 一般的排列
  • C语言 VC6.0控制台编写一个贪吃蛇游戏

    最近看到有人发布贪吃蛇的编码实现 xff0c 想到了自己多年之前也实现过一个 xff0c 发布在这里 xff0c 做一下回忆 C语言面向过程编码 xff0c 基本功能实现以函数为单位 xff0c 重点就是各个函数的设计和实现 本篇使用VC6
  • 笔记本外接键盘解决方案:禁用笔记本自带键盘

    适用场景 xff1a 笔记本外接键盘时 xff0c 有时会将外接键盘放置在笔记本自带键盘上 xff0c 加上现代笔记本设计轻薄 xff0c 外接键盘 xff08 尤其是108键的 xff09 在使用过程中经常触碰自带键盘 xff0c 禁用自
  • ROS节点解析GPS数据:GPRMC/GPFDP/HEADINGA

    数据解析 xff0c 肯定是要知道数据格式的 xff1a 数据格式参考 xff1a xff08 前人已经总结的比较齐全了 xff09 https blog csdn net u010384390 article details 784320