ros开发与室内定位(一)

2023-05-16

ROS下搭建 UWB 下行数据解析驱动

Linux内核版本:ubuntu 15.05 ROS版本:indigo


搭建局域网,向网内的主机提供室内标签实时的定位信息,该Demo可以利用UDP协议将UWB系统上位机的报文转发到网内主机并解析为ROS分布式架构中定制的消息,发布在话题uwb/Coords;nav_msgs/Odometry消息类型,格式如下(部分):

  • **std_msgs/Header header **
  • ** uint32 seq**
  • ** time stamp **
  • ** string frame_id **
  • **geometry_msgs/PoseWithCovariance pose **
  • **geometry_msgs/Pose pose **
  • **** geometry_msgs/Point position ****
  • ** float64 x **
  • ** float64 y**
  • ** float64 z**

position.x为定位标签的橫轴坐标,单位/cm; position.y为定位标签的纵轴坐标,单位/cm; position.z为定位标签的垂轴坐标,单位/cm; header.frame_id 为定位标签的id号,如”54000360”

Step.1:创建一个工作空间/uwb_ws,并建立相应的pkg:/uwbwork

  • [New Terminal]

mkdir -p /root/uwb_ws/src
source /opt/ros/indigo/setup.bash
catkin_create_pkg uwbwork
cd /root/dronework
catkin_make

step.2:在/uwbwork路径下添加uwb_data_sub.cpp

  • [New Terminal]

cd src/uwbwork
gedit uwb_data_sub.cpp ~没有安装 Gedit 插件可以用 $~vi uwb_data_sub.cpp

使用下面的Demo添加进文件并保存,该脚本的功能是利用UDP实时接受网络报文,进行解析、ROS格式的数据分发,建立了一种动态滤波算法对序列数据流进行平滑拟合,提高定位的精度同时可能对实时性有一定牺牲,数据流可能会有0.5s左右的延迟(滤波器可以关闭或打开代码中已经作了相关标记)

  • [uwb_data_sub.cpp]
#include <ros/ros.h>
#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <math.h> 
#include <stdlib.h> 
#include <nav_msgs/Odometry.h> 
#include <stdio.h> 
#define label_1 "54000333" 
#define label_2 "54000329" 
#define label_3 "54000360" 
#define label_length 8
#define N 5 
#define bytes 1024 
#define listened_ip "192.168.0.0"  //default ip: reset it form "uwb_test.launch" 
#define port 8000 
#define flag ','
using namespace std; 
using namespace boost::asio;
ros::Publisher pub_uwb_1; 
ros::Publisher pub_uwb_2; 
ros::Publisher pub_uwb_3;
typedef struct                      {  
float average;  
float op_value;  
double uwb_mean;  
double mean;  
int array[N];
int croods;  bool times;  }uwb_data;
//@Function: sliding filter  由于各类外部或内部因素干扰,定位数据序列会产生较为剧烈的时间抖动,这里利用动态均值滤波消除离散数据的毛刺平滑数据,达到更好的定位测量效果
uwb_data sliding_filter(uwb_data s) { 
float sum=0;
 double variance=0; 
if(!s.croods)   {   
 for(int clock_one=N-1;clock_one>=0;clock_one--)    
   { 
    sum=sum+(float)s.array[clock_one];       
    s.array[clock_one]=s.array[clock_one-1];          
    if(clock_one==1)  {             
    sum=sum+s.croods;             
    s.array[clock_one-1]=s.croods;            }     }  
  s.average=sum/N;  
  for(int clock_two=N-1;clock_two>=0;clock_two--)   
    variance=variance+pow((double)s.array[clock_two]-(double)s.average,2);              
    s.mean=variance/N;   
       if(s.times)     {   
         s.uwb_mean=s.mean; 
         s.times=false;     }  }
   s.op_value=s.average+(s.croods-s.average)*s.mean/(s.mean+s.uwb_mean); return s; }  
int main(int argc, char* argv[]) {  
           ros::init(argc, argv, "uwb_data_sub");   
           ros::NodeHandle nh;   
           pub_uwb_1 = nh.advertise<nav_msgs::Odometry>("uwb/Coords_333",1);  //非全局参数引入
           pub_uwb_2 = nh.advertise<nav_msgs::Odometry>("uwb/Coords_329",1);  
           pub_uwb_3 = nh.advertise<nav_msgs::Odometry>("uwb/Coords_360",1);
           nav_msgs::Odometry nav_uwb;  
           string param_uwb_ip=listened_ip;  
           ros::param::get("~uwb_server_ip",param_uwb_ip); //私有参数引入
           // printf("%s\n",param_uwb_ip.c_str());  
           // ros::Rate loop_(50);  
           boost::asio::io_service iosev_io; 
           boost::asio::ip::udp::socket udp_socket(iosev_io);
           boost::asio::ip::udp::endpoint local_add(boost::asio::ip::address::from_string(param_uwb_ip),port); //listening to ip_port   
           udp_socket.open(local_add.protocol());
           udp_socket.bind(local_add); 
           ROS_INFO("connect successfully");
           char receive_str[bytes]={0};  // 1bytes    
           char coords_x[bytes]={0};     // 1bytes   
           char coords_y[bytes]={0};     // 1bytes   
           char label_id[bytes]={0};     // 1bytes   
           int lenx=0;   
           int leny=0;
           int result_coords_x=0,result_coords_y=0; 
           // 本UWB上位机发布的数据格式形如:("$POS,54000333,600,200") <-("$***,标签代号,横轴距,纵轴距");   
           const int fir_dall=5,sed_dall=14;   
           int thd_dall;   
           int loop_1=N,loop_2=N,loop_3=N;   
           uwb_data uwb_1_x,uwb_1_y,uwb_2_x,uwb_2_y,uwb_3_x,uwb_3_y;  
           while(ros::ok())  {       
              //ros::spinOnce();                   
                boost::asio::ip::udp::endpoint sendpoint;       
                udp_socket.receive_from(boost::asio::buffer(receive_str,bytes),sendpoint);       
                int clock_thr=0,pos_first=0,pos_second=0,pos_third=0,sum_dall=0;    
                 while(clock_thr<bytes)        {        
                    if(receive_str[clock_thr]==flag)            
                       sum_dall++;        
                        switch(sum_dall)           {         
                         case 2:           
                          pos_first=clock_thr;sum_dall++;break;        
                         case 4:           
                          pos_second=clock_thr;sum_dall++;break;     
                         case 6:        
                          pos_third=clock_thr;sum_dall++;break;          
                         default:          
                          break;                   }           
                        clock_thr++;        
                         if(sum_dall==7)           
                          clock_thr=bytes;     }
             lenx=pos_second-pos_first-1;leny=pos_third-pos_second-1;thd_dall=sed_dall+lenx+1;      // 使用flag:','进行需求信息的分离    
             strncpy(label_id,receive_str+fir_dall,label_length);     
             strncpy(coords_x,receive_str+sed_dall,lenx);        
             strncpy(coords_y,receive_str+thd_dall,leny);    
             result_coords_x=atoi(coords_x);     
             result_coords_y=atoi(coords_y);   //the test codes     
             printf("\033[32m");printf("%s\t",label_id);printf("%s\t",coords_x); printf("%s",coords_y); printf("\n");printf("\033[0m");   
             nav_uwb.header.frame_id=label_id;  //name of label 
             nav_uwb.pose.pose.position.x=result_coords_x;  //coords of 'x'   
             nav_uwb.pose.pose.position.y=result_coords_y;  //coords of 'y'   
             //classification of release      //label 54000333 car_position 
             if(strncmp(label_id,label_1,label_length)==0)    {  
                uwb_1_x.croods=result_coords_x;        
                uwb_1_y.croods=result_coords_y;  //using silding filter          
                  switch(loop_1)    {    
                    case 0:       
                      uwb_1_x=sliding_filter(uwb_1_x);    
                      uwb_1_y=sliding_filter(uwb_1_y);  
                      nav_uwb.pose.pose.position.x=uwb_1_x.average;  //coords of 'x'   
                      nav_uwb.pose.pose.position.y=uwb_1_y.average;  //coords of 'y' 
                      pub_uwb_1.publish(nav_uwb);
                      break;          
                    default:         
                      uwb_1_x.times=true;uwb_1_y.times=true;           
                      uwb_1_x.array[loop_1-1]=result_coords_x;       
                      uwb_1_y.array[loop_1-1]=result_coords_y;loop_1--;  
                      break;       }     }     //使用滤波器
              else if(strncmp(label_id,label_2,label_length)==0)   { 
                 uwb_2_x.croods=result_coords_x;      
                 uwb_2_y.croods=result_coords_y; 
                //pub_uwb_2.publish(nav_uwb);    
                 switch(loop_2)      {    
                    case 0:       
                      uwb_2_x=sliding_filter(uwb_2_x);     
                      uwb_2_y=sliding_filter(uwb_2_y);    
                      nav_uwb.pose.pose.position.x=uwb_2_x.average;  //coords of 'x'   
                      nav_uwb.pose.pose.position.y=uwb_2_y.average;  //coords of 'y'   
                      pub_uwb_2.publish(nav_uwb);break;      
                    default:         
                      uwb_2_x.times=true;uwb_2_y.times=true;         
                      uwb_2_x.array[loop_2-1]=result_coords_x;            
                      uwb_2_y.array[loop_2-1]=result_coords_y;loop_2--;
                      break;        }
                                                                      }//使用滤波器
               else if(strncmp(label_id,label_3,label_length)==0)     {  
                   uwb_3_x.croods=result_coords_x;    
                   uwb_3_y.croods=result_coords_y;     
                   pub_uwb_3.publish(nav_uwb);    
                   /*switch(loop_3)      {   
                       case 0:       
                         uwb_3_x=sliding_filter(uwb_3_x);  
                         uwb_3_y=sliding_filter(uwb_3_y);  
                         nav_uwb.pose.pose.position.x=uwb_3_x.average; //coords of 'x'        
                         nav_uwb.pose.pose.position.y=uwb_3_y.average; //coords of 'y'    
                         pub_uwb_3.publish(nav_uwb);break;         
                       default:        
                         uwb_3_x.times=true;uwb_3_y.times=true;       
                         uwb_3_x.array[loop_3-1]=result_coords_x;    
                         uwb_3_y.array[loop_3-1]=result_coords_y;loop_3--;  
                         break;        }*/                             }  //不使用滤波器         
           memset(receive_str,0,bytes);      
           memset(label_id,0,bytes);     
           memset(coords_x,0,bytes);     
           memset(coords_y,0,bytes);     
          iosev_io.run();      
       // loop_.sleep();
                               }      
    ros::waitForShutdown();  
 return 0; }

##step.3:在同级目录下的CMakeLists.txt中改用以下代码

CMakeLists.txt文件是编译node时的编译器导引文件,它指定了脚本执行时的依赖项以及建立可执行文件的名称与相关的链接项,此外使用ROS框架你还可以设计自己的nodelete,该方式不使用包含入口函数的脚本,只需要定义类和相应的对象,在大数据挖掘和深度学习即多层神经网络算法上可以广泛应用

  • [New Terminal]

gedit CMakeLists.txt

  • [CMakeLists.txt]
cmake_minimum_required(VERSION 2.8.3)  
project(uwbwork)

find_package(catkin REQUIRED COMPONENTS 
roscpp 
nav_msgs 
) 
#generate_messages(DEPENDENCIES sensor_msgs) 
catkin_package() 
include_directories(include ${catkin_INCLUDE_DIRS}) 
add_executable(uwb_data_sub uwb_data_sub.cpp) 
target_link_libraries(uwb_data_sub ${catkin_LIBRARIES})

step.4:修改package.xml文件,注意只修改原文件 “TODO”以下的部分

package.xml可以看作我们编写的文件包脚本执行时具体依赖的项目,如脚本使用了哪种具体的消息格式,此外"run_depend"在ROS新版本中变成了"exe_depend",如果在编译时有报错提示再行改动吧。

  • [New Terminal]

gedit package.xml

  • [package.xml]
<?xml version="1.0"?> 
<package>  
<name>uwbwork</name>  
<version>0.0.0</version>
  <description>The uwbwork package</description>
  <!-- One maintainer tag required, multiple allowed, one person per tag --> 
  <maintainer email="root@todo.todo">root</maintainer>
  <!-- One license tag required, multiple allowed, one license per tag -->  
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->     
  **<license>TODO</license>**
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>   
  <build_depend>std_msgs</build_depend>   
  <build_depend>std_srvs</build_depend>   
  <build_depend>sensor_msgs</build_depend>  
  <build_depend>nav_msgs</build_depend>
  <build_depend>ffmpeg</build_depend>
  <build_depend>message_generation</build_depend>
  <run_depend>roscpp</run_depend> 
  <run_depend>std_msgs</run_depend>  
  <run_depend>nav_msgs</run_depend>  
  <run_depend>std_srvs</run_depend> 
  <run_depend>sensor_msgs</run_depend> 
  <run_depend>ffmpeg</run_depend> 
  <run_depend>message_runtime</run_depend>
</package>

##step.5:自定义 uwb_test.launch文件

实际上经过以上步骤并做基本的编译后,脚本已经可以run了,但是ROS框架为我们提供了Launch接口文件的便利,我们可以利用<ROS_MASTER>中的rosparam作为运行参数的动态引入桥梁,使得我们写的驱动文件具有较好的人机交互性,避免经常在底层更新参数的麻烦,例如以下代码中可以看到我们将主机的IP参数灵活引入脚本等等,但要注意要引用的参数类型“/”是全局参数还是非全局参数,所谓全局参数,顾名思义可以全局引用;“~”私有参数类型只可以在当前脚本中引用;另外就是相关参数了,相关参数想要在除当前命名空间外引用,它就要在前面加上我们自己定义的空间名称了
此外该类型的接口中还为我们提供了Group用法,为重度强迫症患者带来了福音(手动滑稽),当然它最大的用处是提高脚本执行效率,为甚麽呢卖个关子,如有兴趣<ROS_Launch>更多使用方法详细可参见其他大佬的博客或者我的一些学习笔记(接下来会写一写安排上),这里呢就不赘述了

  • [New terminal]

cd
gedit uwb_test.launch

  • [uwb_test.launch]
<?xml version="1.0"?>
<launch>
  <node name="uwb_data_sub" pkg="uwbwork" type="uwb_data_sub" output="screen" launch-prefix="xterm -e">
  <param name="uwb_server_ip" type="string" value="192.168.42.97" />
 </node>
  
</launch

##step.6:cmake&run

  • [New terminal]

cd
cd /root/uwb_ws
catkin_make

  • [New terminal]

cd
cd source uwb_ws/devel/setup.bash
roslaunch uwb_test.launch

如果自己搭建的拓扑结构正常的话到这里已经可以看到弹出的新窗口中反馈的标签位置数据流,如果需要长期使用室内定位设备做ROS下的开发,建议在~su权限下将"source uwb_ws/devel/setup.bash"添加到.bashrc文件**(直接在终端 gedit .bashrc并添加),好了,文章比较随意,内容如有错误或不足之处还请批评指正!!! (重要事情感叹三遍—手动笑脸)

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

ros开发与室内定位(一) 的相关文章

  • 实时操作系统UCOS学习笔记1----UCOSII简介

    前面我们所有的实验都是跑的裸机程序 xff08 裸奔 xff09 xff0c 从本章开始 xff0c 我们开始介绍UCOSII xff08 实时多任务操作系统内核 xff09 UCOSII简介 UCOSII的前身是UCOS xff0c 最早
  • 欢聚时代YY/测试实习面试

    去到YY大楼 xff0c 虽然在番禺但是附近很多楼在施工中了 大楼就在万达后面 前台登记 xff0c 小姐姐会让你出示邀请邮件 xff0c 然后直接上去就行了 达到楼层 xff0c 二维码签到 然后找地方坐一下等待面试 一轮是技术面 xff
  • 基于卡尔曼滤波的气压计高度解算

    ax ay az为归一化的加速度数据 1代表重力加速度 gx gy gz 为加速度数据 单位rad s altitude为气压计测量得到的海拔数据 欧拉角 float pitch roll yaw 世界坐标系下机体加速度 float ax
  • Kali安装Xfce4

    Kali安装Xface4 一 配置kali源并更新二 解决报错1 签名无效2 依赖报错 三 安装xfce4 一 配置kali源并更新 此处使用的是gedit编辑器 xff0c gedit etc apt sources list xff0c
  • 串口转WIFI的工作方式理解

    串口无线 AP xff08 COM AP xff09 串口无线 STA xff08 COM STA xff09 和 串口无线 AP 43 STA xff08 COM AP 43 STA xff09 3 个模式 串口WIFI模块是基于Uart
  • 典型环节的频率特性(建议收藏)

    自控笔记 5 3典型环节频率特性 控制系统种类繁多 xff0c 传递函数复杂 xff0c 但任何形式的传递函数都是由有限的典型环节组成 因此 xff0c 掌握典型环节的频率特性是使用频域法分析系统的基础 如下表所示 xff0c 构成系统的最
  • 【WINAPI】CreateSemaphore_信号量

    WINAPI CreateSemaphore 信号量 1 注册信号量函数1 1 参数1 2 返回值 2 释放信号量函数2 1 参数2 2 返回值 3 WaitForSingleObject3 2 参数3 3 返回值 4 例子4 1 运行结果
  • MAVROS二次开发(一)MAVROS的安装

    MAVROS二次开发 一 MAVROS的安装 1 参考网址 https dev px4 io v1 10 en ros mavros installation html https github com mavlink mavros tre
  • MAVROS二次开发(二)(三)添加自定义消息

    MAVROS二次开发 二 MAVROS消息添加 1 自定义rostopic消息 路径 xff1a catkin ws src mavros mavros msgs msg 自定义消息文件名称 xff1a CrawlControlStatus
  • MAVROS二次开发(四)添加消息处理插件

    MAVROS二次开发 四 添加消息处理插件 mavros插件所在路径 xff1a catkin ws src mavros mavros src plugins 1 自定义消息处理插件的编写 参考代码 xff1a catkin ws src
  • MAVROS二次开发(五)进行测试

    MAVROS二次开发 五 进行测试 1 测试环境 PX4 xff1a v1 10 1 xff08 含自定义mavlink消息收发 xff09 ROS xff1a KineticUbuntu xff1a 16 04LTSQGC xff1a S
  • ROS2+PX4开发环境配置

    一 ROS2安装 Ubuntu18 04的ros2版本 xff1a Eloquent 参考网址 xff1a https docs ros org en eloquent Installation Linux Install Debians
  • Windows10下Airsim+PX4(WSL2)+MAVROS仿真环境搭建

    一 Windows10下WSL2安装 1 1 WSL2的安装与配置 首先在Windows10下启用WSL xff0c 以管理员身份打开 PowerShell 工具并运行以下命令 dism span class token punctuati
  • Windows10通过vcpkg快速配置PCL库

    1 安装C 43 43 包管理工具vcpkg https github com microsoft vcpkg span class token function git span clone https github com micros
  • 微软Chromium版Edge浏览器正式稳定版

    微软Chromium版Edge浏览器正式稳定版 近期微软Chromium版Edge浏览器正式稳定版下载已经泄露 xff0c 版本77 0 235 9 此版本没有div什么的那些 xff0c 和之前的图标一样 当安装新Edge稳定版之后 xf
  • C++疑难问题

    acwing中的算法疑惑 1 为什么确定范围 要 43 10 在使用归并排序和快速排序等方法时有效率问题 xff0c 确定范围在1e6 但是选择的是1e 43 10 2 C 43 43 除二乘2简单方法以及算法效率问题 算法效率速度排行 x
  • 用python的scipy中的odeint来解常微分方程中的一些细节问题(适用于小白)

    用python的scipy中的odeint来解常微分方程中的一些细节问题 xff08 适用于小白 xff09 写在前面 最近有些需要解决常微分方程的问题 xff0c 网上查了很多教程都不是很明晰 xff0c 便自己研究了一段时间 xff0c
  • VsCode使用Git连接Gitee和GitHub

    VsCode连接GitHub和Gitee VsCode连接GitHub和Gitee一 软件安装1 安装git2 vscode 二 在Github或者Gitee上创建空的仓库 项目1 在Github创建空的仓库 项目2 在Gitee创建新项目
  • Julia配置【使用VScode中的Jupyter编写Julia的方法】

    简略目录 安装Julia切换国内源安装Ijulia插件VSCode配置 首次编写日期 xff1a 2021 07 10 安装Julia 官网 xff0c 一路默认即可 xff0c 记得添加PATH xff0c 安装位置可以自定义 切换国内源
  • VSCode配置C++环境(MSVC)

    VSCode配置C 43 43 环境 xff08 MSVC xff09 最近心血来潮 xff0c 想用一下微软的VSCode写一下C 43 43 xff0c 然而第一步就卡住了 xff0c 竟然不会配置C 43 43 环境 xff0c 陆陆

随机推荐

  • GTSAM理解

    1 xff1a GTSAM是什么 参考博文 xff1a gtsam xff1a 从入门到使用 1 xff1a 是什么 xff1a GTSAM是用于计算机视觉和多传感器融合方面用于平滑和建图的C 43 43 库 xff0c GTSAM采用因子
  • tag与branch的区别

    1 什么是tag 什么时候应该创建一个tag 项目的版本管理中 每当一个release版本发布时 需要做一个记录 以便以后需要的时候能查找特定的版本 这时候就用到tag这个功能 Git中的tag指向一次commit的id xff0c 通常用
  • 简历中“项目经历“该如何写?

    前言 找工作 xff0c 简历是最关键的一步 xff0c 只有通过了简历筛查才能往下继续进行 很多人写简历 xff0c 都是在记录流水账 xff0c 看来没有任何平淡寡味 其实简历的核心价值就在于游说 hr 和面试官 xff1a 看我 xf
  • 深度学习解释:Precision、Recall、IoU、Ap/mAp

    深度学习的指标都是 xff08 APAverage Precision xff09 二分类情况下的Precision xff08 查重率 xff09 和Recall xff08 查全率 xff09 对于二分类问题 xff0c 可将样例根据其
  • input上传文件图片本地预览

    lt form gt lt input type 61 34 file 34 id 61 34 avatar 34 name 61 34 avatar 34 gt lt button gt 点击上传 lt button gt lt form
  • colmap pthread 错误

    Looking for include file pthread h Looking for include file pthread h found Looking for pthread create Looking for pthre
  • 全球系留无人机系统行业调研及趋势分析报告

    本文调研和分析全球系留无人机系统发展现状及未来趋势 xff0c 核心内容如下 xff1a xff08 1 xff09 全球市场总体规模 xff0c 分别按销量和按收入进行了统计分析 xff0c 历史数据2017 2021年 xff0c 预测
  • 安装arm-none-eabi版本添加环境变了还是出错问题解决

    安装arm none eabi版本添加环境变了还是出错问题解决 问题解决 问题 已经在 profile文件里面添加了如下命令 span class token keyword export span span class token con
  • 基于ubuntu16.04 塔建PX4编译环境

    基于ubuntu16 04 塔建PX4编译环境 基于ubuntu16 04 塔建PX4编译环境环境塔建官网网址 xff1a 权限设定删除modemmanager更新软件包列表 xff0c 并为所有PX4构建目标安装以下依赖项 安装pyulo
  • APM编译记录-基于OMNIBUSF4-V3飞控板

    APM编译记录 基于OMNIBUSF4 V3飞控板 APM编译记录Bootloader问题固件编译 APM编译记录 初次使用APM xff0c 根据博客文章以及结合官方教程摸索 xff0c 发现和PX4还是有挺大差别的 xff0c 目前系统
  • ubuntu16.04基于eclipse搭建px4编译环境+Jlink调式

    ubuntu16 04基于eclipse搭建px4编译环境 43 Jlink调式 xff09 ubuntu16 04基于eclipse搭建px4编译环境 43 Jlink调式一 工具获取1 eclipse2 jlink3 jdk4 arm
  • Ardupilot通过mavlink + 4way_protocol对BLHeli_s电调的读写

    Ardupilot通过mavlink 43 4way protocol对BLHeli s电调的读写 前言上位机1 Mission Planner2 BLHeliSuite3 BLHeliSuite32 Ardupilot 源码编译1 启动B
  • C/C++中 float与uint16类型转换方法

    C C 43 43 中 float与uint16类型转换方法 为什么要做float与uint16互相转换方法一 xff1a 方法二 xff1a 为什么要做float与uint16互相转换 此需求在串口通信时常常会被用到 xff0c 串口只能
  • Keil V5仿真出现*** error 65: access violation at 0x40021000 : no ‘read‘ permission 解决办法

    Keil V5仿真出现 error 65 access violation at 0x40021000 no 39 read 39 permission 解决办法 问题解决办法1 进入debug的map设置地址2 新建debug ini配置
  • Ardupilot-NMEA协议的GNSS处理优化

    Ardupilot NMEA协议的GNSS处理优化 Ardupilot NMEA协议的GNSS处理优化原固件存在的问题解决办法 Ardupilot NMEA协议的GNSS处理优化 原固件存在的问题 1 当所使用的GNSS模块数据反馈频率不到
  • FMT-模型在环仿真(MIL)

    前提条件 matlab版本是2018B及以上版本下载好了FMT Model工程 设置MIL仿真 打开matlab xff0c 进入到FMT Model目录 xff0c 左键双击打开FMT Model prj 打开过程它自己会初始化工程 xf
  • 【移植Ardupilot的日志记录方法到linux上】

    移植Ardupilot的日志记录方法到linux上 说明日志结构组成日志写入操作预定义日志项运行时添加日志项的方法 单例测试编译方法查看数据其他 说明 采用二进制文件记录 xff0c 可在mission planer查看 支持所有数据类型记
  • 一、linux内核源码分析(内核源码结构组成)

    应该说是把linux内核这部分知识提前了 xff0c 因为坐公交需要点视频来打发一下时间 xff0c 感觉linux内核的视频就不错 xff0c 就顺便把linux内核提前了 这一次也是打算视频和书一起看 xff0c 然后总结 书的话还是推
  • Android开发:使用Lambda表达式高效开发

    简介 xff1a JDK1 8后java开始支持Lambda表达式 xff0c 使用Lambda表达式我们就可以在Android中替换匿名类的写法 本来一个Button点击事件监听要写6行代码 xff0c 我们1行就可以搞定 1 引入依赖
  • ros开发与室内定位(一)

    ROS下搭建 UWB 下行数据解析驱动 Linux内核版本 xff1a ubuntu 15 05 ROS版本 xff1a indigo 搭建局域网 xff0c 向网内的主机提供室内标签实时的定位信息 xff0c 该Demo可以利用UDP协议