Optitrack下通过mavros实现offbord控制

2023-05-16

参考文章:
树莓派通过MAVROS与Pixhawk/PX4通信

PX4使用Optitrack进行室内定位

  1. 通过optitrack与妙算连接在同一局域网下,关闭防火墙,并设置刚体发布

  2. vrpn安装

    cd ~/catkin_ws/src

    git clone https://github.com/clearpathrobotics/vrpn_client_ros.git

    sudo apt-get install ros-melodic-vrpn

    cd ~/catkin_ws
    catkin_make

  3. 启动vrpn

    roslaunch vrpn_client_ros sample.launch server:=10.0.0.2(optitrack电脑ip)

  4. 配置pixhawk与妙算的连接

    参考网站

    通过妙算uart串口连接飞控Telem1接口

    在地面站设置mavlink参数:

    MAV_1_CONFIG = TELEM 1
    MAV_1_MODE = Onboard
    SER_TEL1_BAUD = 57600

  5. 运行mavros,波特率为上面设置的57600(也可更多)

    roslaunch mavros px4.launch fcu_url:=/dev/ttyTHS2:57600(即串口设备:波特率)

  6. 将EKF估计位姿的数据来源改为VISION

    EKF2_AID_MASK 设置为24(即勾选vision position fusion 和 vision yaw fusion,默认为GPS),使XY和Yaw数据来源为VISION,即Optitrack。
    EKF2_HGT_MODE 设置为VISION (默认为气压计),使高度信息来源为VISION

  7. 运行vrpn转ros的节点

    rosrun mavros2px4 mavros2px4

    /***************************************************************************************************************************
     * px4_pos_estimator.cpp
     *
     * Author: Qyp
     *
     * Update Time: 2019.3.10
     *
     * 说明: mavros位置估计程序
     *      1. 订阅激光SLAM (cartorgrapher_ros节点) 发布的位置信息,从laser坐标系转换至NED坐标系
     *      2. 订阅Mocap设备 (vrpn-client-ros节点) 发布的位置信息,从mocap坐标系转换至NED坐标系
     *      3. 订阅飞控发布的位置、速度及欧拉角信息,作对比用
     *      4. 存储飞行数据,实验分析及作图使用
     *      5. 选择激光SLAM或者Mocap设备作为位置来源,发布位置及偏航角(xyz+yaw)给飞控
     *
    ***************************************************************************************************************************/
    /***************************************************************************************************************************
    * px4_pos_controller.cpp
    *
    * Author: Qyp
    *
    * Update Time: 2019.3.16
    *
    * Introduction:  PX4 Position Estimator using external positioning equipment
    *         1. Subscribe position and yaw information from Lidar SLAM node(cartorgrapher_ros节点), transfrom from laser frame to ENU frame
    *         2. Subscribe position and yaw information from Vicon node(vrpn-client-ros节点), transfrom from vicon frame to ENU frame
    *         3. Send the position and yaw information to FCU using Mavros package (/mavros/mocap/pose or /mavros/vision_estimate/pose)
    *         4. Subscribe position and yaw information from FCU, used for compare
    ***************************************************************************************************************************/
    
    
    //头文件
    #include <ros/ros.h>
    
    #include <iostream>
    #include <Eigen/Eigen>
    
    
    #include <math_utils.h>
    //#include <math.h>
    #include <Frame_tf_utils.h>
    //msg 头文件
    #include <mavros_msgs/CommandBool.h>
    #include <mavros_msgs/SetMode.h>
    #include <mavros_msgs/State.h>
    #include <geometry_msgs/Vector3.h>
    #include <geometry_msgs/TwistStamped.h>
    #include <geometry_msgs/PoseStamped.h>
    #include <nav_msgs/Odometry.h>
    #include <sensor_msgs/Imu.h>
    #include <std_msgs/Bool.h>
    #include <geometry_msgs/Pose.h>
    #include <geometry_msgs/Vector3Stamped.h>
    #include <geometry_msgs/Point.h>
    #include <std_msgs/UInt16.h>
    #include <std_msgs/Float64.h>
    #include <tf2_msgs/TFMessage.h>
    #include <geometry_msgs/TransformStamped.h>
    #include <sensor_msgs/Range.h>
    
    
    using namespace std;
    //---------------------------------------相关参数-----------------------------------------------
    int flag_use_laser_or_vicon;                               //0:使用mocap数据作为定位数据 1:使用laser数据作为定位数据
    //---------------------------------------vicon定位相关------------------------------------------
    Eigen::Vector3d pos_drone_mocap;                          //无人机当前位置 (vicon)
    Eigen::Quaterniond q_mocap;
    Eigen::Vector3d Euler_mocap;                              //无人机当前姿态 (vicon)
    //---------------------------------------无人机位置及速度--------------------------------------------
    Eigen::Vector3d pos_drone_fcu;                           //无人机当前位置 (来自fcu)
    Eigen::Vector3d vel_drone_fcu;                           //无人机上一时刻位置 (来自fcu)
    
    Eigen::Quaterniond q_fcu;
    Eigen::Vector3d Euler_fcu;                                          //无人机当前欧拉角(来自fcu)
    //---------------------------------------发布相关变量--------------------------------------------
    geometry_msgs::PoseStamped vision;
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>函数声明<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    float get_dt(ros::Time last); //获取时间间隔
    void printf_info();                                                                       //打印函数
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>回调函数<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    
    void optitrack_cb(const geometry_msgs::PoseStamped::ConstPtr& msg)
    {
        //位置 -- optitrack系 到 ENU系
        int optitrack_frame = 1; //Frame convention 0: Z-up -- 1: Y-up
        // Read the Drone Position from the Vrpn Package [Frame: Vicon]  (Vicon to ENU frame)
        Eigen::Vector3d pos_drone_mocap_enu(-msg->pose.position.x,msg->pose.position.z,msg->pose.position.y);
    
        pos_drone_mocap = pos_drone_mocap_enu;
    
        if(optitrack_frame == 0){
            // Read the Quaternion from the Vrpn Package [Frame: Vicon[ENU]]
            Eigen::Quaterniond q_mocap_enu(msg->pose.orientation.w, msg->pose.orientation.x, msg->pose.orientation.y, msg->pose.orientation.z);
            q_mocap = q_mocap_enu;
        }
        else
        {
            // Read the Quaternion from the Vrpn Package [Frame: Vicon[ENU]]
            Eigen::Quaterniond q_mocap_enu(msg->pose.orientation.w, msg->pose.orientation.x, msg->pose.orientation.z, msg->pose.orientation.y); //Y-up convention, switch the q2 & q3
            q_mocap = q_mocap_enu;
        }
    
        // Transform the Quaternion to Euler Angles
        Euler_mocap = quaternion_to_euler(q_mocap);
    
    }
    
    void pos_cb(const geometry_msgs::PoseStamped::ConstPtr &msg)
    {
        // Read the Drone Position from the Mavros Package [Frame: ENU]
        Eigen::Vector3d pos_drone_fcu_enu(msg->pose.position.x,msg->pose.position.y,msg->pose.position.z);
    
        pos_drone_fcu = pos_drone_fcu_enu;
    }
    
    void vel_cb(const geometry_msgs::TwistStamped::ConstPtr &msg)
    {
        // Read the Drone Velocity from the Mavros Package [Frame: ENU]
        Eigen::Vector3d vel_drone_fcu_enu(msg->twist.linear.x,msg->twist.linear.y,msg->twist.linear.z);
    
        vel_drone_fcu = vel_drone_fcu_enu;
    }
    
    void euler_cb(const sensor_msgs::Imu::ConstPtr& msg)
    {
        // Read the Quaternion from the Mavros Package [Frame: ENU]
        Eigen::Quaterniond q_fcu_enu(msg->orientation.w, msg->orientation.x, msg->orientation.y, msg->orientation.z);
    
        q_fcu = q_fcu_enu;
    
        //Transform the Quaternion to Euler Angles
        Euler_fcu = quaternion_to_euler(q_fcu);
    
        // Transform the Quaternion from ENU to NED
        Eigen::Quaterniond q_ned = transform_orientation_enu_to_ned( transform_orientation_baselink_to_aircraft(q_fcu_enu) );
    }
    
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>主 函 数<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "px4_pos_estimator");
        ros::NodeHandle nh("~");
    
        //读取参数表中的参数
        // 使用激光SLAM数据orVicon数据 0 for vicon, 1 for 激光SLAM
        nh.param<int>("flag_use_laser_or_vicon", flag_use_laser_or_vicon, 0);
    
        // 【订阅】optitrack估计位置
        ros::Subscriber optitrack_sub = nh.subscribe<geometry_msgs::PoseStamped>("/vrpn_client_node/UAV/pose", 1000, optitrack_cb);
    
        // 【订阅】无人机当前位置 坐标系:ENU系 [室外:GPS,室内:自主定位或mocap等] 这里订阅仅作比较用
        ros::Subscriber position_sub = nh.subscribe<geometry_msgs::PoseStamped>("/mavros/local_position/pose", 10, pos_cb);
    
        // 【订阅】无人机当前速度 坐标系:ENU系 [室外:GPS,室内:自主定位或mocap等] 这里订阅仅作比较用
        ros::Subscriber velocity_sub = nh.subscribe<geometry_msgs::TwistStamped>("/mavros/local_position/velocity_local", 10, vel_cb);
    
        // 【订阅】无人机当前欧拉角 坐标系:ENU系 这里订阅仅作比较用
        ros::Subscriber euler_sub = nh.subscribe<sensor_msgs::Imu>("/mavros/imu/data", 10, euler_cb);
    
        // 【发布】无人机位置和偏航角 坐标系 ENU系
        //  本话题要发送飞控(通过mavros_extras/src/plugins/vision_pose_estimate.cpp发送), 对应Mavlink消息为VISION_POSITION_ESTIMATE(#??), 对应的飞控中的uORB消息为vehicle_vision_position.msg 及 vehicle_vision_attitude.msg
        ros::Publisher vision_pub = nh.advertise<geometry_msgs::PoseStamped>("/mavros/vision_pose/pose", 100);
    
        // 频率
        ros::Rate rate(20.0);
    
    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Main Loop<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        while(ros::ok())
        {
            //回调一次 更新传感器状态
            ros::spinOnce();
    
            //vicon
            if(flag_use_laser_or_vicon == 0)
            {
    //            vision.pose.position.x = pos_drone_mocap[0] ;
    //            vision.pose.position.y = pos_drone_mocap[1] ;
    //            vision.pose.position.z = pos_drone_mocap[2] ;
                vision.pose.position.x = 10 ;
                vision.pose.position.y = 10 ;
                vision.pose.position.z = 10 ;
    
                vision.pose.orientation.x = q_mocap.x();
                vision.pose.orientation.y = q_mocap.y();
                vision.pose.orientation.z = q_mocap.z();
                vision.pose.orientation.w = q_mocap.w();
    
            }
            
            vision.header.stamp = ros::Time::now();
            vision_pub.publish(vision);
    
            //打印
            printf_info();
            rate.sleep();
        }
    
        return 0;
    
    }
    
    //获取当前时间 单位:秒
    float get_dt(ros::Time last)
    {
        ros::Time time_now = ros::Time::now();
        float currTimeSec = time_now.sec-last.sec;
        float currTimenSec = time_now.nsec / 1e9 - last.nsec / 1e9;
        return (currTimeSec + currTimenSec);
    }
    
    
    
    void printf_info()
    {
        cout <<">>>>>>>>>>>>>>>>>>>>>>>>PX4_POS_ESTIMATOR<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" <<endl;
    
        //固定的浮点显示
        cout.setf(ios::fixed);
        //setprecision(n) 设显示小数精度为n位
        cout<<setprecision(2);
        //左对齐
        cout.setf(ios::left);
        // 强制显示小数点
        cout.setf(ios::showpoint);
        // 强制显示符号
        cout.setf(ios::showpos);
    
        //using vicon system
        if(flag_use_laser_or_vicon == 0)
        {
            cout <<">>>>>>>>>>>>>>>>>>>>>>>>Optitrack Info [ENU Frame]<<<<<<<<<<<<<<<<<<<<<<<<<" <<endl;
            cout << "Pos_vicon [X Y Z] : " << pos_drone_mocap[0] << " [ m ] "<< pos_drone_mocap[1] <<" [ m ] "<< pos_drone_mocap[2] <<" [ m ] "<<endl;
            cout << "Euler_vicon [Yaw] : " << Euler_mocap[2] * 180/M_PI<<" [deg]  "<<endl;
        }
            cout <<">>>>>>>>>>>>>>>>>>>>>>>>FCU Info [ENU Frame]<<<<<<<<<<<<<<<<<<<<<<<<<<<" <<endl;
            cout << "Pos_fcu [X Y Z] : " << pos_drone_fcu[0] << " [ m ] "<< pos_drone_fcu[1] <<" [ m ] "<< pos_drone_fcu[2] <<" [ m ] "<<endl;
            cout << "Vel_fcu [X Y Z] : " << vel_drone_fcu[0] << " [m/s] "<< vel_drone_fcu[1] <<" [m/s] "<< vel_drone_fcu[2] <<" [m/s] "<<endl;
            cout << "Euler_fcu [Yaw] : " << Euler_fcu[2] * 180/M_PI<<" [deg] "<<endl;
    }
    
    
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Optitrack下通过mavros实现offbord控制 的相关文章

  • 基于XTdrone 改变mavros消息发布频率的方法

    基于XTdrone 改变mavros消息发布频率的方法 问题描述步骤1 在MAVROS的官方界面找到你所需要的信息条目2 在XTdrone设置位置找到你使用的rcs3 测试一下 问题描述 在利用Gazebo和px4进行仿真时 xff0c 很
  • qgc通过mavros连接到Pixhawk飞控

    qgc通过mavros连接到Pixhawk飞控 mavros设置QGC设置 mavros确实是一个不错的工具 xff0c 在机载电脑上进行无人机开发的时候 xff0c 有时候想调飞控的参数看一下飞控的一些信息 xff0c 但是直接接飞控又不
  • 六、PX4的ros/mavros搭建

    老规矩 xff0c 看官网 这里 我看这个上面已经在推ROS2了 不过对于我这种只接触过ROS1版本的还是MAVROS来得清切 MAVROS说白了就是MAVLINK的进一步封装 xff0c 可以使得计算机通过串口发送指令给pixhawk x
  • Ardupilot之Mavros实现Ros节点控制(一)

    Ardupilot之Mavros实现Ros节点控制 Mavros安装修改Mavros运行Mavros 这部分ros发布的命令话题参考的是PX4固件最基本的Offboard node节点 xff0c 命令发布后 xff0c 能够连接并解锁 x
  • Ardupilot之Mavros实现Ros节点控制(二)

    Ardupilot之Mavros实现Ros节点控制 xff08 二 xff09 offboard建立仿真运行 未完成mavros安装及相关设置的参考上一篇文章 Ardupilot之Mavros实现Ros节点控制 xff08 一 xff09
  • MAVRos--SetMavFrame更改速度控制的坐标系

    使用服务 xff08 Service xff09 来更改速度控制的坐标系 mavros支持的坐标系 uint8 FRAME GLOBAL span class token operator 61 span span class token
  • PX4|mavros offboard控制

    在px4官网中有相关mavros的教程MAVROS Offboard control example C 43 43 PX4 自动驾驶用户指南 本文将对该教程进行复现 xff0c 并加以细节补充 首先安装mavros sudo apt ge
  • px4+mavros+offboard控制+gazebo仿真以及与pixhawk4飞控连接(一)

    记录一下自己从px4到板载控制的一系列流程以及踩坑过程 xff0c 希望也可以帮助大家避雷 话不多说直接上干货 一 软 硬件平台 px4版本 xff1a 1 10 1 飞控板 xff1a pixhawk4 ros版本 xff1a melod
  • PX4 与 MAVROS 实现offboard

    目录 一 虚拟机仿真环境 1 创建工作空间 2 创建ROS节点功能包 3 运行PX4的gazebo仿真 4 启动PX4与Mavros之间的连接 二 真机控制 1 硬件连接 2 软件设置 3 出现问题 Ubuntu xff1a 20 04 x
  • PIXHAWK无人机mavros与SLAM技术实用课程培训--北京站(2018年3月31日~4月2日)

    SLAM技术一直是机器人领域的研究热点 伴随着一个又一个无人车SLAM的落地 xff0c 技术的发展到了实用化的研究热潮 xff0c 尤其SLAM技术在无人机路径规划方面的研究更具无限潜力 xff0c 广阔的天地间毕竟还需要那么一双眼睛 众
  • mavros安装

    官方地址 xff1a https github com mavlink mavros 因为github有时侯不好上 xff0c 所以我自己弄了个gitee https gitee com qq408007026 mavros tree ma
  • Mavros Client md5sum Error

    Mavros Client md5sum Error 运行阿木实验室px4 commander包里vio fly sh的 roslaunch px4 command px4 pos estimator launch 时报错 xff1a ER
  • 通过MAVROS控制仿真无人机

    首先 xff0c 在目录中建立工作区 xff0c 并进行初始化操作 mkdir p catkin ws src cd catkin ws catkin init wstool init src rosinstall generator ro
  • qgc通过mavros连接到飞控

    qgc通过mavros连接到Pixhawk飞控 mavros设置QGC设置 mavros确实是一个不错的工具 xff0c 在机载电脑上进行无人机开发的时候 xff0c 有时候想调飞控的参数看一下飞控的一些信息 xff0c 但是直接接飞控又不
  • 修改mavros中话题的发布频率

    修改mavros中话题的发布频率 参考链接及命令分析 参考了以下文章的提高mavros中提高IMU话题频率的方法 xff0c 再通过其介绍推出其他话题的频率修改方法 提高mavros中IMU话题的发布频率 修改命令的含义分析 作者提到了以下
  • PX4+ROS+gazebo+mavros,Ubuntu18.04搭建SITL仿真环境

    前言 介绍 SITL Software in the Loop 软件在环仿真平台 xff0c 与之对应的有 HITL 硬件在环仿真 本文目的是搭建一个无人机软件仿真环境 xff0c 使用PX4开源飞控 xff0c gazebo作为仿真器 x
  • ros 下面如何通过vrpn 连接 Optitrack

    tracking system 可以实时的计算出来regid body 的pose xff0c 如何在ros 下面得到 这个pose 呢 xff1f 首先 编译安装 vrpn 然后的话需要配置两台电脑的IP 使他们能够 互相 ping 通
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • mavros连接px4失败的usb-ttl原因

    问题描述 xff1a 最近在搞mavros xff0c 以方便协处理器和pixhawk通讯 xff0c 在按照官网教程安装mavros xff0c 设置px4 xff0c 连接硬件之后发现mavros卡在中间下不去 xff1a MAVROS
  • ros+ Optitrack控制bebop2无人机

    准备工作 xff1a Motive的安装及使用 xff1a https blog csdn net weixin 41536025 article details 89913961 ros订阅 OptiTrack 的消息通过vrpn cli

随机推荐

  • C语言系列(四): 分支结构程序设计

    选择结构是程序设计3种基本结构之一 xff0c 通过判定给定的条件是否成立选择需要执行的操作 C语言提供了条件语句 if语句和switch语句 用以实现选择结构的程序设计 xff0c 条件通常用关系表达式或逻辑表达式表示 C语言提供3种逻辑
  • C语言系列(五):循环结构程序设计

    循环结构是结构化程序设计的基本结构之一 xff0c C语言提供了三种循环结构语句 while语句 xff0c do while语句和for语句 for语句在C语言系列 xff08 二 xff09 xff1a 用C语言编写程序已经讲解 xff
  • C语言系列(六):函数与预编译处理

    模块化程序设计方法 在程序设计与开发中 xff0c 随着解决问题的复杂化 xff0c 编写程序的代码也更加复杂 一方面 xff0c 大量的程序语句会使程序的逻辑结构产生混乱 xff0c 给程序的编写 阅读和维护带来困难 xff1b 另一方面
  • Linux驱动开发经典面试简答题

    1 Linux设备中字符设备与设备有什么主要的区别 xff1f 请分别举例一些实际的设备说出它们是哪一类设备 字符设备 xff1a 字符设备是个能够像字节流 xff08 类似文件 xff09 一样被访问的设备 xff0c 由字符设备驱动程序
  • CMake中cmake_host_system_information的使用

    CMake中的cmake host system information命令用于查询各种主机系统信息 xff0c 其格式如下 xff1a cmake host system information RESULT lt variable gt
  • 一文知晓嵌入式Linux

    嵌入式Linux是什么 嵌入式Linux跟桌面Linux一样 xff0c 是一个操作系统 从单片机走过来的童鞋往往习惯于直接控制寄存器 xff0c 事必躬亲 xff0c 从零开始实现想要的功能 而在嵌入式Linux的世界里 xff0c 我们
  • 修改i.mx6ull Linux内核 启动logo

    1 制作Linux内核需要的开机logo xff08 ppm格式 xff09 1 1在Ubuntu系统上安装netpdm工具 命令如下 xff1a span class token macro property sudo apt get i
  • keil5编译错误error: #5: cannot open source input file “core_cm3.h“: No such file or directory

    用Keil vision5编译时出现 xff1a error 5 cannot open source input file core cm3 h No such file or directory 可能是MDK版本太新了 xff0c 我装
  • IPv6基础详解

    IPv6 由于internet规模的扩大 xff0c IPv4地址空间已经消耗殆尽 xff0c IETF在90年代提出了下一代互联网协议IPv6 xff0c IPv6支持几乎无限的地址空间 xff0c 并且配置更加简单 xff0c IPv6
  • Pycharm中debug使用学习

    1 运行环境 1 1 运行 xff1a 先确认项目运行环境 点击右下角python查看 向任务中添加环境 xff0c 一般加入anaconda的环境 xff0c 配置方便 切换到自己所需环境 添加运行环境 初次搭建 xff0c 哔哩哔哩中新
  • 对项目的梳理、流程和总结

    过程 我在制作 中国汽车技术研究中心 的一个演讲PPT前 xff0c 也已经有第一版的基础了 xff0c 不过 xff0c 第一版的PPT客户并不满意 xff0c 因为这个风格不是客户想要的 xff0c 所以客户对第一版的PPT并不是很满意
  • 【ROS】xxx is neither a launch file in package xxx nor is xxx a launch file name……解决

    在ros中新增加一个功能包时 xff0c 如果没有处理得当的话 xff0c 在执行时很有可能报如下错误 xff1a xxx is neither a launch file in package xxx nor is xxx a launc
  • FreeRTOS——流和消息缓冲区

    FreeRTOS 基础系列文章 基本对象 FreeRTOS 任务 FreeRTOS 队列 FreeRTOS 信号量 FreeRTOS 互斥量 FreeRTOS 任务通知 FreeRTOS 流和消息缓冲区 FreeRTOS 软件定时器 Fre
  • FreeRTOS——静态与动态内存分配

    FreeRTOS 基础系列文章 基本对象 FreeRTOS 任务 FreeRTOS 队列 FreeRTOS 信号量 FreeRTOS 互斥量 FreeRTOS 任务通知 FreeRTOS 流和消息缓冲区 FreeRTOS 软件定时器 Fre
  • CAS 6.5.5项目初始化搭建运行

    一 项目背景介绍 公司项目重构 xff0c 决定使用CAS中央认证系统 在GitHub上找到最新的稳定版本6 5 5 CAS项目在5 x版本的运行环境是jdk8 xff0c 使用maven做的项目管理 6 x使用的是jdk11作为运行环境
  • GoogleTest中gMock的使用

    GoogleTest中的gMock是一个库 xff0c 用于创建mock类并使用它们 当你编写原型或测试 prototype or test 时 xff0c 完全依赖真实对象通常是不可行或不明智的 not feasible or wise
  • 基于Autoware制作高精地图(一)

    基于Autoware制作高精地图 xff08 一 xff09 开始进入正题 xff0c 也是最近在忙的一件事 xff0c 制作高精地图 高精地图的制作大概分为以下四个流程 xff08 不一定完全正确 xff09 xff1a 1 构建点云地图
  • Ubuntu sh文件编写,开多终端,自动读取密码

    Ubuntu sh文件编写 xff0c 开多终端 xff0c 自动读取密码 开启多个终端自动读取密码 在最近的项目调试中经常需要开多个终端启动多个launch xff0c 这样的操作多了难免会感到烦躁并且时间一长再回去使用一些功能包的时候就
  • 控制理论——自动控制原理若干概念

    1 对自动控制系统的基本要求 稳定性 被控量因扰动偏离期望值后 xff0c 经过过渡过程可以恢复到原来的期望值状态 快速性 包含两方面 xff1a 过渡过程的时间 最大超调量 xff08 震荡幅度 xff09 准确性 指稳态误差 xff1a
  • Optitrack下通过mavros实现offbord控制

    参考文章 xff1a 树莓派通过MAVROS与Pixhawk PX4通信 PX4使用Optitrack进行室内定位 通过optitrack与妙算连接在同一局域网下 xff0c 关闭防火墙 xff0c 并设置刚体发布 vrpn安装 cd ca