大陆毫米波雷达ARS408-21xx(内附毫米波雷达使用说明书)使用记录:第一期

2023-05-16

文章目录

  • 前言
  • 一、硬件链接
  • 二、代码如何使用
  • 三、大陆毫米波雷达ARS408-21XX解析代码说明
  • 总结


前言

从我个人的学习成长历程来看,从0到1确实很难。我个人在对这款毫米波雷达的学习的过程中也比较痛苦,资料缺乏,自己的能力也不是很厉害,而且我们这边的实验室之前也没有师兄们搞过,一个人在探索,所有学习资料都从github和其他优秀的博主中获取。这边推荐我在学习这款大陆毫米波雷达时,经常看的一些好的博客,这边感谢他们的知识分享,同时也感谢其他帮助过我的前辈:

  1. 博客1
  2. 博客2
  3. 博客3

Tips:大陆毫米波雷达ASR408-21XX的相关资料包见如下的链接: ARS408-21XX说明资料

Tips:github上也已经有了关于这款ARS408-21XX毫米波雷达的开源代码(基于ROS,主要语言是C/C++),其功能是实现了数据解析和发送,我这边已经下载好了,链接如下: ARS408雷达github开源代码

但是,因为我个人的能力有限而且时间不是很充裕(暑假得将matlab下大论文的代码转成C++语言和弄大论文数据),所以我个人还没我完全吃透这个代码,因此我在使用这款代码时,我借鉴了这个开源代码,自己写了一个ARS408-21XX毫米波雷达解析程序,比较简单,但足够我使用了,我这边仅使用毫米波雷达的object目标模式,没使用cluster点云。最后还基于rviz做了个简单目标可视化,方便对radar进行空间标定,这边提供了该代码的下载链接: 本人撰写的关于ARS408-21XX解析代码(仅供参考)


一、硬件链接

我这边使用的can卡是peakcan,关于如何将其部署到自己的电脑上,参考我的这篇博客:
peakcan驱动安装

二、代码如何使用

当完成硬件连接之后,并下载了我这边提供的仅供参考的radar解析程序后,进入代码的工作空间,使用catkin_make进行编译(该代码基于ROS,使用了C语言)。
打开两个终端,一个启动roscore,一个进入radar_byqjj_ws后,执行如下指令

$ source devel/setup.bash 
$ rosrun pro_can radarCan_solve

若出现如下警告:说找不到can0设备,这边建议您,先执行Ctrl+z退出该程序,然后稍微等待几秒,再重新执行“rosrun pro_can radarCan_solve”指令,因为有时候电脑搜索该can卡比较慢,所以需要稍微等待一小会,若还不行,请重试这个步骤。
请添加图片描述图1

当程序成功运行起来之后,再打开一个新的终端,执行以下指令,打开rviz:

$ rosrun rviz rviz

然后点击rviz左上角的flie,选择open config,然后选择我代码包里面提供的sensor_obj_visional.rviz配置文件,如下图所示
请添加图片描述
图2

效果如下图所示:请添加图片描述
图3
周围环境如下:
请添加图片描述图4

三、大陆毫米波雷达ARS408-21XX解析代码说明

提示:大陆毫米波雷达ASR408-21XX解析代码如下所示,因为我这边用的是object模式,所以我只写了object的解析代码。

#define down "sudo ip link set down can0"							//关闭CAN0
#define command "sudo ip link set can0  type can bitrate 500000" //大陆ars408_radar的波特率为500Kbps
#define up "sudo ip link set up can0"									 //打开CAN0
/* 用于设置 :can_frame*/
#define CAN_EFF_FLAG 0x80000000U //扩展 帧的标识
#define CAN_RTR_FLAG 0x40000000U //远程 帧的标识
#define CAN_ERR_FLAG 0x20000000U //错误 帧的标识,用于错误检查
/* 用于设置:can_filter*/
#define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */
#define CAN_EFF_MASK 0x1FFFFFFFU /* extended frame format (EFF) */
#define CAN_ERR_MASK 0x1FFFFFFFU /* omit EFF, RTR, ERR flags */
 
using namespace std;
Radar_408_60b radar_60b = {0,0,0,0,0,0,0};//dbc结构体
Radar_408_200 radar_200 = {0,0,0,0,0,0,0};//dbc结构体
Radar_408_202 radar_202 = {0,0,0,0,0,0};//dbc结构体
pro_can::sensorData sensor_data;//实例化的msg对象
 
bool once1 = true;
/*rviz可视化函数*/
void visualization(float & obj_x, float & obj_y, float & obj_Vx, int obj_ID, ros::Publisher & markerArrayPub){
     visualization_msgs::MarkerArray marker_array;
     //********************图形数组*********************//
     visualization_msgs::Marker marker_1;

     if (once1) {
     marker_1.action = visualization_msgs::Marker::DELETEALL;
          once1 = false;
     } 
     else{
          marker_1.action = visualization_msgs::Marker::ADD;
     }
     marker_1.header.frame_id = "sensor_frame";
     marker_1.header.stamp = ros::Time::now();
     marker_1.id = obj_ID;
     marker_1.type = visualization_msgs::Marker::CUBE;//设置目标物体的形状
     //设置物体的大小:
     marker_1.scale.x = 0.5;
     marker_1.scale.y = 0.5;
     marker_1.scale.z = 0.5;
     //物体的颜色
     marker_1.color.r = 2;//radar红色
     marker_1.color.g = 0;
     marker_1.color.b = 0;
     //设置透明程度  0:透明    1:不透明
     marker_1.color.a = 1;     
     //物体的坐标(物体中心为质点)
     marker_1.pose.position.x = obj_x;
     marker_1.pose.position.y = obj_y;  
     marker_1.pose.position.z = 0.25;   
     //物体显示在rviz的时间
     marker_1.lifetime = ros::Duration(0.01);//存在0.01s
     marker_array.markers.push_back(marker_1);     
     //********************文字数组*********************//
     visualization_msgs::Marker marker_2;     
     marker_2.action = visualization_msgs::Marker::ADD; 
     marker_2.header.frame_id = "sensor_frame";
     marker_2.header.stamp = ros::Time::now();
     marker_2.id = obj_ID + 100;
     marker_2.type = visualization_msgs::Marker::TEXT_VIEW_FACING;//设置目标物为文本格式 
     //设置字体的大小:
     marker_2.scale.x = 0.5;
     marker_2.scale.y = 0.5;
     marker_2.scale.z = 0.5;    
     //字体的颜色
     marker_2.color.r = 2;//radar红色
     marker_2.color.g = 0;
     marker_2.color.b = 0;    
     //设置字体透明程度  0:透明    1:不透明   
     marker_2.color.a = 0.4;  
     //字体的坐标
     marker_2.pose.position.x = obj_x;
     marker_2.pose.position.y = obj_y;
     marker_2.pose.position.z = 0.75;            
     //字体显示在rviz的时间
     marker_2.lifetime = ros::Duration(0.01);//存在0.01s 
     //设置---字体显示的内容
     ostringstream str;
     str<<"Radar "<<"x:"<<obj_x<<", "<<"y:"<<obj_y<<", "<<"Vx:"<<obj_Vx;
     marker_2.text=str.str();     
     marker_array.markers.push_back(marker_2);
     //***************发送至rviz
     markerArrayPub.publish(marker_array);
}
 



&&&&&&&&&&&&&&&&&&&&&&&&&&&&-------------------------------------&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
///*can解析函数*/
void Radar_can2value(can_frame & frame, ros::Publisher & pub, ros::Publisher & markerArrayPub){
      if (frame.can_id == 0x60b){
          //*************字节段按大端(或小端方式)拼接
          radar_60b.DATA0.D  = frame.data[0];
          radar_60b.DATA12.D = (frame.data[1] << 8) + frame.data[2];
          radar_60b.DATA23.D = (frame.data[2] << 8) + frame.data[3];
          radar_60b.DATA45.D = (frame.data[4] << 8) + frame.data[5];
          radar_60b.DATA56.D = (frame.data[5] << 8) + frame.data[6];
          float lat_distance = radar_60b.DATA23.bit.obj_lat*0.2 - 204.6;//横向距离(radar右手坐标系),统一用右手坐标系
          float long_distance= radar_60b.DATA12.bit.obj_long*0.2 - 500;//纵向距离
          //*************筛选
          if ( fabs(lat_distance) > 4.0){//横向绝对值大于4,表示若该障碍物的横向距离的绝对值在4.0米之外,则该帧不要
               return ;
          }
          else if(long_distance > 60.0){//大于60米,表示若该障碍物的纵向距离大于60m,则该帧不要
               return ;
          }
          else {
          //解析
          sensor_data.sensorType = 1;//------1表示radar
          sensor_data.obj_ID     = radar_60b.DATA0.bit.obj_id;
	       sensor_data.X          = radar_60b.DATA12.bit.obj_long*0.2 - 500;
	       sensor_data.Y          = radar_60b.DATA23.bit.obj_lat*0.2 - 204.6;
	       sensor_data.Vx         = radar_60b.DATA45.bit.obj_vlong*0.25 - 128;
	       sensor_data.Vy         = radar_60b.DATA56.bit.obj_vlat*0.25 - 64;
	       //--------获取系统时间戳
	       uint64_t sys_time=std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
          int32_t time_second   = sys_time / 1000000;
          int32_t time_nsecs    = sys_time % 1000000 * 1000;
          double timestamp_     = (double)time_second+1e-9*(double)time_nsecs;
          sensor_data.timestamp = timestamp_;//单位为:s
          
	       //--------rviz可视化
	       int obj_ID = sensor_data.obj_ID;
	       visualization(sensor_data.X, sensor_data.Y, sensor_data.Vx, obj_ID, markerArrayPub);
	       
	       //--------发往数据链队列
	       pub.publish(sensor_data);
	       printf("Topic(sensorRawData)-----radar:目标ID%d------纵向距离%f-----纵向速度%f\n", sensor_data.obj_ID, sensor_data.X, sensor_data.Vx); 
          }
   }
   return;


}                     
                                        


/*radar配置函数*/
bool radar_cfg(int & skt){
   struct can_frame frame[2];

   //struct Radar_408_200 radar_200;
   //radar配置使能
   radar_200.DATA0.bit.RadarCfg_MaxDistance_Valid = 1;//允许配置最大距离
   radar_200.DATA0.bit.RadarCfg_SensorID_Valid    = 1;//允许配置radarID
   radar_200.DATA0.bit.RadarCfg_RadarPower_Valid  = 1;//允许配置radar功率
   radar_200.DATA0.bit.RadarCfg_OutputType_Valid  = 1;//允许配置radar输出模式
   radar_200.DATA0.bit.RadarCfg_SendQuality_Valid = 1;//允许配置radar输出cluster和object的质量信息
   radar_200.DATA0.bit.RadarCfg_SendExtInfo_Valid = 1;//允许配置radar输出object的扩展信息
   radar_200.DATA0.bit.RadarCfg_SortIndex_Valid   = 1;//Object目标列表的当前排序索引值配置
   radar_200.DATA0.bit.RadarCfg_StoreInNVM_Valid  = 1;//使能;+++++++++++++++++++++++++++++++++
   //radar相关参数配置
   //最大距离设置
   radar_200.DATA12.bit.RadarCfg_MaxDistance = ((150 - 0)/2);//150为真实物理值:150m
   radar_200.DATA12.bit.reserved             =0;
   //保留位
   radar_200.DATA3.bit.reserved              =0;
   //设置radarID,输出类型,radar功率
   radar_200.DATA4.bit.RadarCfg_sensorID   = (0-0)/1;//radarID:为0
   radar_200.DATA4.bit.RadarCfg_OutputType = (1-0)/1;//object模式
   radar_200.DATA4.bit.RadarCfg_RadarPower = (1-0)/1;//标准发射功率
   //
   radar_200.DATA5.bit.RadarCfg_CtrlRelay_Valid = 0;
   radar_200.DATA5.bit.RadarCfg_CtrlRelay       = 0;
   radar_200.DATA5.bit.RadarCfg_SendQuality     = 1;
   radar_200.DATA5.bit.RadarCfg_SendExtInfo     = 1;
   radar_200.DATA5.bit.RadarCfg_SortIndex       = 1;//按距离排序输出
   radar_200.DATA5.bit.RadarCfg_StoreInNVM      = 1;//使能;+++++++++++++++++++++++++++++++++
   //
   radar_200.DATA6.bit.RadarCfg_RCS_threshold_Valid   = 1;
   radar_200.DATA6.bit.RadarCfg_RCS_threshold         = 0;//标准灵敏度
   radar_200.DATA6.bit.RadarCfg_InvalidClusters_Valid = 0;
   radar_200.DATA6.bit.reserved                       = 0;
   //
   radar_200.DATA7.bit.RadarCfg_InvalidClusters       = 0;
   //radar基本属性配置
   frame[0].can_id = 0x200;//这样赋值默认标准帧。如果为扩展帧,那么 frame.can_id = CAN_EFF_FLAG | 0x123;
   frame[0].can_dlc = 8; //数据长度为 8个字节
   frame[0].data[0] = radar_200.DATA0.D;
   frame[0].data[2] = radar_200.DATA12.D;
   frame[0].data[1] = radar_200.DATA12.D >> 8;
   frame[0].data[3] = radar_200.DATA3.D;
   frame[0].data[4] = radar_200.DATA4.D;
   frame[0].data[5] = radar_200.DATA5.D;
   frame[0].data[6] = radar_200.DATA6.D;
   frame[0].data[7] = radar_200.DATA7.D;
   //radar过滤器配置----------
   frame[1].can_id = 0x202;//这样赋值默认标准帧
   frame[1].can_dlc = 8; //数据长度为 8个字节
   //过滤器使能
   radar_202.DATA0.bit.reserved         = 0;
   radar_202.DATA0.bit.FilterCfg_Valid  = 1;//使能过滤器  
   radar_202.DATA0.bit.FilterCfg_Active = 1;//激活过滤器
   radar_202.DATA0.bit.FilterCfg_Index  = 0x9;//筛选y方向的距离用过滤条件为:0x9(长度为12bit),0x5为
   radar_202.DATA0.bit.FilterCfg_Type   = 1;//object过滤器
   //最小距离设置
   radar_202.DATA12.bit.FilterCfg_Min_X =(-1.8 + 409.5)/0.2;//车头右边1.8米以外的目标筛选掉
   radar_202.DATA12.bit.reserved        = 0;
   //最大距离设置   
   radar_202.DATA34.bit.FilterCfg_Max_X =(1.8 + 409.5)/0.2;//车头左边1.8米以外的目标筛选掉
   radar_202.DATA34.bit.reserved        = 0;
   radar_202.DATA5.bit.reserved = 0;
   radar_202.DATA6.bit.reserved = 0;
   radar_202.DATA7.bit.reserved = 0;
   frame[1].data[0] = radar_202.DATA0.D;
   frame[1].data[2] = radar_202.DATA12.D;
   frame[1].data[1] = radar_202.DATA12.D >> 8;
   frame[1].data[4] = radar_202.DATA34.D;
   frame[1].data[3] = radar_202.DATA34.D >> 8;
   frame[1].data[5] = radar_202.DATA5.D;
   frame[1].data[6] = radar_202.DATA6.D;
   frame[1].data[7] = radar_202.DATA7.D;
   
	 int nbytes = write(skt, &frame[0], sizeof(frame[0])); //发送数据,第三个参数表示:需要发送的字节数
   if(nbytes != sizeof(frame[0])){ //如果 nbytes 不等于帧长度,就说明发送失败
			 printf("Error\n!");
			 return false;
	 }//配置失败,返回false
	 int nbytes2_ = write(skt, &frame[1], sizeof(frame[1])); //发送数据,第三个参数表示:需要发送的字节数
   if(nbytes != sizeof(frame[1])){ //如果 nbytes 不等于帧长度,就说明发送失败
			 printf("Error\n!");
			 return false;
	 }//配置失败,返回false
	 return true;

}


/*检查radar配置的函数*/
bool check_radar_cfg(int & skt){
     
     struct can_frame recFrame;
     int nbytes = read(skt, &recFrame, sizeof(recFrame)); 
     if(nbytes != sizeof(recFrame)){ //如果 nbytes 不等于帧长度,就说明发送失败
				  printf("Error\n!");
				  return false;
	  }
	  //该帧不是所需要的帧,返回false
	  if(recFrame.can_id == 0x201){
	        struct Radar_408_201 radar_201;
	        radar_201.DATA0.D  = recFrame.data[0];
	        radar_201.DATA12.D = (recFrame.data[1] << 8) + recFrame.data[2];
	        radar_201.DATA34.D = (recFrame.data[3] << 8) + recFrame.data[4];
	        radar_201.DATA5.D  = recFrame.data[5];
	        radar_201.DATA6.D  = recFrame.data[6];
	        radar_201.DATA7.D  = recFrame.data[7];
	        
	        printf("当前radar的ID为:%d\n",radar_201.DATA34.bit.RadarState_SensorID);
	        //radar功率
	        if(radar_201.DATA34.bit.RadarState_RadarPowerCfg == 0){
	               printf("当前radar的发射功率:std\n");
	        }
	        else if(radar_201.DATA34.bit.RadarState_RadarPowerCfg == 1){
	               printf("当前radar的发射功率:3db\n");
	        }
	        else if(radar_201.DATA34.bit.RadarState_RadarPowerCfg == 2){
	               printf("当前radar的发射功率:6db\n");
	        }	        
	        else if(radar_201.DATA34.bit.RadarState_RadarPowerCfg == 3){
	               printf("当前radar的发射功率:9db\n");
	        }	     
	        
	        //radar输出模式
	        if(radar_201.DATA5.bit.RadarState_OutputTypeCfg == 0){
	               printf("当前radar的输出模式:不输出目标\n");
	        }
	        else if(radar_201.DATA5.bit.RadarState_OutputTypeCfg == 1){
	               printf("当前radar的输出模式:object模式\n");
	        }
	        else if(radar_201.DATA5.bit.RadarState_OutputTypeCfg == 2){
	               printf("当前radar的输出模式:cluster模式\n");
	        }	           	       	
	        sleep(1);
	        return true;
	  }
	  else {
	        return false;
	  }
}



//***************************************功能函数******************************************************//
void process_1(int & can_skt, struct ifreq ifr, struct sockaddr_can addr){
            
            can_skt = socket(PF_CAN, SOCK_RAW, CAN_RAW);//创建 SocketCAN 套接字
            strcpy(ifr.ifr_name, "can0" );//指定 can0 设备------------更换其他路 can,改动此
            ioctl(can_skt, SIOCGIFINDEX, &ifr);
            addr.can_family = AF_CAN;
            addr.can_ifindex = ifr.ifr_ifindex;
            while(bind(can_skt, (struct sockaddr *)&addr, sizeof(addr))  < 0){
	         if (bind(can_skt, (struct sockaddr *)&addr, sizeof(addr))  > 0){
	               break;
	         }
	               printf("继续bind\n");
	               sleep(1);
	         }     
	         printf("Bind success.\n"); 
	         
	         return;
}


void process_2(int & can_skt){
            while(radar_cfg(can_skt)==false){
	               if (radar_cfg(can_skt)==true){
	                        break;
	               }
	               printf("Radar继续配置.\n");
	               sleep(1);
	         }
	         
	         printf("Radar配置完成.\n");
	         return;
}
 

void process_3(int & can_skt){
	         while(check_radar_cfg(can_skt)==false){
	               if (check_radar_cfg(can_skt)==true){
	                        break;
	               }
	               printf("Radar继续查看.\n");
	               sleep(1);
	         }
            return;

}

void process_5(int can_skt, ros::Publisher pub, ros::Publisher markerArrayPub){
      printf("主线程继续");
      struct can_frame recFrame;
	   int bytes;
	   while (true)//一帧一帧的读取
	   {
		         bytes = read(can_skt, &recFrame, sizeof(recFrame)); //接收总线上的报文保存在recFrame中
		         if (bytes != sizeof(recFrame))
		         {
			            printf("rec  Error\n!");
			            break;
		         }
		         else
		         {
			            Radar_can2value(recFrame,pub,markerArrayPub);
		         }
		         //usleep(10000);
	   }
}
 
 
 
 

int main(int argc, char **argv)
{
    //向ros系统注册节点
    ros::init(argc, argv, "radarCan_solve");
    
    
    //数据链话题
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<pro_can::sensorData>("sensorRawData", 10);
    //rviz可视化话题
    ros::NodeHandle nh;
    ros::Publisher markerArrayPub = nh.advertise<visualization_msgs::MarkerArray>("visualization_marker_radar", 10);
    system(down);//0路给的是:radar和vision
	 system(command);
	 system(up); 

    //*******1******创建用于can收发的socket_can文件描述符
    int can_skt;
    struct ifreq ifr;
    struct sockaddr_can addr;
    //--------------   
	 process_1(can_skt, ifr, addr);
    //*******1******创建socket_can文件描述符号
    
    
    //******2******radar_配置
	 process_2(can_skt);
	 //******2******radar_配置
	

	 //******3******查看radar_配置
	 //process_3(can_skt);
	 //******3******查看radar_配置
	
		
	 //******5*******解析can帧并发送实际物理值
	 process_5(can_skt, pub, markerArrayPub);
	 //******5*******解析can帧并发送实际物理值	
	
	
	close(can_skt);
	//******4*******解析can帧并发送实际物理值	
   return 0;
}

总结

查看该代码可知,此代码只是提供了object模式的数据解析,实现了障碍物相对于毫米波雷达的坐标发布,以及横纵向速度的发布,并简单做了筛选,仅此而已。后期将继续上传更新优化后的解析、筛选程序。

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

大陆毫米波雷达ARS408-21xx(内附毫米波雷达使用说明书)使用记录:第一期 的相关文章

  • 教妹学Java(二十 七):this 关键字的用法

    你好呀 xff0c 我是沉默王二 xff0c xff08 目前是 xff09 CSDN 周排名前十的博客专家 这是 教妹学 Java 专栏的第二十七篇 xff0c 今天我们来谈谈 Java 的 this 关键字 this 关键字有哪些用法
  • PID控制原理

    PID控制原理 PID即 xff1a Proportional xff08 比例 xff09 Integral xff08 积分 xff09 Differential xff08 微分 xff09 的缩写 xff0c PID控制算法是结合比
  • ROS入门:IMU&GPS融合定位实例

    1 声明 xff1a a 本文主要针对IMU amp GPS融合定位仿真环境的搭建过程进行讲解 xff0c 而没有对具体原理的介绍 b 本人作为技术小白 xff0c 完全参考了https zhuanlan zhihu com p 15266
  • vSLAM研究综述:2010-2016

    作为vSLAM领域小白 xff0c 学习完 视觉SLAM十四讲 后 xff0c 抱着学习的心态研究了论文Visual SLAM algorithms a survey from 2010 to 2016 作为入门的第一步 xff0c 会有很
  • ROS学习:cv_bridge与opencv版本冲突三种解决方案

    cv bridge与opencv版本冲突三种解决方案 1 问题描述 xff1a 2 解决方案 xff1a 2 1 不使用cv bridge包2 2 令cv bridge使用opencv版本切换为自己工程所使用的版本2 3 下载cv brid
  • Kubernetes实战指南(三十四): 高可用安装K8s集群1.20.x

    文章目录 1 安装说明2 节点规划3 基本配置4 内核配置5 基本组件安装6 高可用组件安装7 集群初始化8 高可用Master9 添加Node节点10 Calico安装11 Metrics Server部署12 Dashboard部署 1
  • 烤四轴

    烤四轴方法 xff0c 先盗图一张 先调试内环后外环 xff08 不明白自行搜索串级PID xff09 1 在飞机的起飞油门基础上进行 PID 参数的调整 xff1b 2 将角度外环去掉 xff0c 将打舵量作为内环的期望 xff1b 3
  • 最全面的linux信号量解析

    2012 06 28 15 08 285人阅读 评论 0 收藏 编辑 删除 信号量 一 xff0e 什么是信号量 信号量的使用主要是用来保护共享资源 xff0c 使得资源在一个时刻只有一个进程 xff08 线程 xff09 所拥有 信号量的
  • ubuntu(20):xargs:clang-format: 没有那个文件或目录与ubuntu18.04安装clang-format

    1 报错排查 xff1a xargs clang format 没有那个文件或目录 运行脚本中的命令如下 xff1b 需要注意这里的clang format后面没有跟数字 修改前脚本 find dogm demo dogm include
  • ORA-28000 the account is locked处理办法

    启动项目的时候提示ORA 28000 the account is locked 这是因为用户被锁定了 oracle11g中默认在default概要文件中设置了 FAILED LOGIN ATTEMPTS 61 10次 xff0c 当输入密
  • 安卓手机 相机和IMU数据获取标定 在VINS-MONO运行自己的数据集(含打包方法) (非常详细一步一步来)

    Android手机上图像和IMU数据采集的方法 网上有相关的教程 xff0c 但都讲的很模糊 xff0c 而且不全 xff0c 甚至还有人要收费 自己完整做了一遍发现还是有些麻烦 xff0c 固记录下来供大家参考 xff0c 希望能帮到大家
  • ros学习笔记--如何看可视化的话题与节点

    输入 rosrun rqt graph rqt graph 可以打开一个界面观察节点与话题的关系 绿色和蓝色的是节点 红色的是话题
  • opencv 环境相关

    拷贝志强服务器的环境需要配置下opencv 安装opencv的一些依赖项 xff0c 防止编译不通过 1 拷贝的库放在 opt下 xff0c 改名字为libs x64 2 安装opencv的依赖项 sudo apt get install
  • ROS CMakeLists 写法

    SET CMAKE BUILD TYPE 34 Debug 34 SET CMAKE CXX FLAGS DEBUG 34 ENV CXXFLAGS O0 Wall g ggdb 34 SET CMAKE CXX FLAGS RELEASE
  • SLAM中的小工具

    g2o中有用的小工具 ifndef G2O STUFF MISC H define G2O STUFF MISC H include 34 macros h 34 include lt cmath gt ifndef M PI define
  • Windows中公用网络与专用网络的区别

    当我们第一次打开一个Windows网络应用程序时 xff0c 会弹出选择网络类型 xff1a 专用网络 xff0c 公用网络 这个的确令人费解 xff0c 相信很多人都不知所措过 有的人干脆都选上 xff0c 这样就避免了被防火墙挡住 这里
  • ubuntu服务器修改ssh登录用户名及端口

    1 如果默认的ssh登录用户名为ubuntu xff0c 需要开通root账户 xff0c 添加密码 xff1a passwd root 还需修改配置 xff0c 具体方法 xff1a vi etc ssh sshd config 确保一下
  • 针对Android MediaCodec解码延时问题的替代解决方案

    如题 xff0c 本人在jni层实现了avc hevc的解码 xff0c 避免了在java上层调用系统的MediaCodec解码出现的延时问题 xff0c 完美支持1080P xff0c 4K xff08 具体看手机性能 xff09 xff
  • 系统环境变量path的列表不见了

    如题 xff0c 在编辑系统环境变量时 xff0c 发现path的环境变量原先是列表显示的 xff0c 看起来比较清晰 xff0c 而现在变成了一个文本框了 xff0c 就不那么一目了然了 于是在网上找到下面这个文章 xff0c 能很好解决
  • gazebo(1):gazebo常见问题及解决办法

    目录 1 将自己创建的gazebo模型导入后 xff0c 模型不停得抖动 xff0c 翻转 2 save world as 之后卡死 3 下载gazebo官方模型 xff1a 4 gazebo更新后无法打开 5 运行gazebo后报错 6

随机推荐

  • Makefile中的$(1)是什么

    Linux工程的编译要用到make工具 xff0c 平台不一样 xff0c 只是工具链不同 xff0c 但Makefile是编译系统的关键所在 xff0c 因此掌握Makefile的编写规则是非常重要的 尽管有了cmake这样更容易使用的编
  • gl的矩阵模式及其相应的矩阵变换函数

    以Android的GL10为例 xff0c 说明一下矩阵模式及其相应的矩阵变换函数 矩阵模式一共分为两种 xff1a gl glMatrixMode GL10 GL MODELVIEW 和 gl glMatrixMode GL10 GL P
  • 对md5sum程序的修改

    linux下自带md5sum工具 xff0c 可以对文件计算md5值 xff0c 但这个命令行工具不能直接对字符串求md5 xff0c 而对一个字符串求md5是一个比较有用的需求 xff0c 比如计算签名 于是对源码md5sum c修改了一
  • 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP

    原文链接 xff1a https blog csdn net lightrain0 article details 84343857 AMQP amp MQTT amp DDS https www youtube com watch v 6
  • 门电路逻辑符号大全(三态门,同或门,异或门,或非门,与或非门, 传输门,全加器,半加器等)

    最近要研究一下滤波器设计的无乘法器的实现 xff0c 所以要学习一下加法器的电路 xff0c 丢了一段时间 xff0c 忘的差不多了 xff0c 这里罗列一下常用的门电路的符号 这是一个1位全加器的数字电路组成 xff1a 以下两幅图可以复
  • 实函数傅里叶变换的奇偶虚实特性

    本文内容来源于他人的PPT xff0c 经本人整理而成 xff0c 算是对数字信号处理的复习吧 而实偶函数的傅里叶变换仍然是一个实偶函数的性质正是DCT的基础 xfeff xfeff
  • 多面体及欧拉公式及广义欧拉公式

    像正方体 xff0c 四棱锥这样的平面多面体属于简单多面体 xff0c 它们可以与球拓扑同构 xff0c 即可以连续拓扑变换成一个球 它们满足欧拉公式 xff1a v e 43 f 61 2 其中v是顶点 xff08 vertex xff0
  • mysql在表的某一位置增加一列的命令

    如果想在一个已经建好的表中添加一列 xff0c 可以用诸如 xff1a alter table t1 add column addr varchar 20 not null 这条语句会向已有的表t1中加入一列addr xff0c 这一列在表
  • tar命令中的-C作用

    tar xzvf abc tar gz C tmp 上面的命令将abc tar gz这个压缩包解压到当前目录下的tmp目录下 xff0c 而不是当前目录下 xff0c 这就是 C选项的作用
  • Java多线程

    一 基础概念 1 CPU核心数和线程数 多核心指的是单芯片多处理器 xff0c 将多个CPU集成到同一个芯片内 xff0c 不同的CPU可以单独的运行程序 目前主流的CPU有四核 六核 八核 增加核心数目的是为了增加线程数 xff0c 一般
  • ros(23):接收rviz中的2D Nav Goal、2D Pose Estimate消息

    1 rviz 教程 1 1 2D Nav Goal 2D Nav Goal Keyboard shortcut g This tool lets you set a goal sent on the 34 goal 34 ROS topic
  • RealSense SR300 坑4米 获取相机参数

    硬件 相机的原理我了解的也不甚多 xff0c 看到一篇讲的很好的文章 xff0c 就在这里引用了 SR300设备的红外线发射器 xff08 IR Laser Projector xff09 发射的 结构光 xff0c 经物体反射后会被红外线
  • 算法的分类

    算法有多种分类方式 xff0c 可以根据实现方式分类 xff0c 也可以根据设计方法分类 xff0c 还可以根据应用领域进行分类 不同的分类方式有不同的特点 按照实现方式分类 xff0c 可以将算法分为递归算法 迭代算法 逻辑算法 串行算法
  • Eclipse搭建stm32+jlink开发环境全攻略(进阶篇二)

    Eclipse搭建stm32 43 jlink开发环境全攻略 进阶篇 二 我们设计程序往往会遇到这样的一个需求 xff0c 那就是我们的程序起始位置需要重新定位 xff0c 并不是默认的0x08000000 xff0c 这种情况往往出现在有
  • 不要在小公司做底层软件开发

    在这里makekam对底层软件的理解就是指驱动开发 xff0c 代码移植等工作 其中也包括底层的算法 在小公司做软件不要做底层软件开发 xff0c 犹如在公司做硬件开发不要只是焊接电路板 小公司处于产业链的最末端 xff0c 没有自己的核心
  • 多旋翼飞控篇新手课堂教程(共九集)

    多旋翼飞控篇新手课堂第一课 xff0c 将你的NAZA M真正升级成NAZA V2 http www mxkong com thread 134 1 1 html 出处 模型控MxKong 多旋翼飞控篇新手课堂第二课 xff1a NAZA远
  • Java基础final详解

    final中文意思 最后的 最终的 final 可以修饰类 属性 方法和局部变量 1 当不希望类被继承时 可以用final修饰 final class A 不可被继承 2 当不希望父类的某个方法被子类覆盖 重写 override 时 可以用
  • socket编程总结

    socket编程总结 主机字节序和网络字节序 字节序分为大端字节序 xff08 big endian xff09 和小端字节序 xff08 little endian xff09 大端字节序 xff1a 一个整数的高位存在内存的底地址 xf
  • c++中的常见问题

    CSP J终于考完了啊 xff01 坐在考场 xff0c 是一种煎熬 xff1a 为什么那么多不会啊 xff01 xff01 xff01 这里 xff0c 总结一下在c 43 43 中的那些常见问题 xff08 作者亲身经历 xff09 x
  • 大陆毫米波雷达ARS408-21xx(内附毫米波雷达使用说明书)使用记录:第一期

    文章目录 前言一 硬件链接二 代码如何使用三 大陆毫米波雷达ARS408 21XX解析代码说明总结 前言 从我个人的学习成长历程来看 xff0c 从0到1确实很难 我个人在对这款毫米波雷达的学习的过程中也比较痛苦 xff0c 资料缺乏 xf