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控制 的相关文章

  • 【Ubuntu18.04安装px4+mavros(解决mavros报错问题)】

    Ubuntu18 04安装px4 43 mavros xff08 解决mavros报错问题 xff09 安装ros melodic重新安装gazebo9 19安装mavros安装px4 我的电脑为联想R7000P2021款 xff0c 之前
  • 二、MAVROS的安装(PX4:v1.10.0 \ ROS:kinetic)

    mavros 功能包提供了 一台能够运行ros的机载电脑 支持MAVLINK协议的飞控和支持MAVLINK的地面站这三者之间的通讯功能 MAVROS 是 ROS 与 MAVLink 协议之间的 有 34 官方 34 支持的ROS功能包 它当
  • 使用Optitrack给px4提供定位

    Motive设置 打开View gt Data Streaming xff0c 确认OptiTrack Streaming Engine和VRPN Streaming Engine勾选Broadcast Frame Data 创建刚体 xf
  • Up Board安装ROS及mavros

    Up Board安装ROS及mavros 目录 Up Board安装ROS及mavros一 在Up Board安装Ubuntu系统1 材料准备2 拿一个空的U盘作为驱动盘为Up Board安装系统3 安装Ubuntu系统 二 在Ubuntu
  • PX4 与 MAVROS 实现offboard

    目录 一 虚拟机仿真环境 1 创建工作空间 2 创建ROS节点功能包 3 运行PX4的gazebo仿真 4 启动PX4与Mavros之间的连接 二 真机控制 1 硬件连接 2 软件设置 3 出现问题 Ubuntu xff1a 20 04 x
  • mavros安装

    官方地址 xff1a https github com mavlink mavros 因为github有时侯不好上 xff0c 所以我自己弄了个gitee https gitee com qq408007026 mavros tree ma
  • PX4 offboard模式能接收的mavros指令

    以下内容针对px4 v1 11 3 xff08 2021 01 xff09 px4 offboard模式下可以接收上位机发送来的setpoint值 xff0c 可以利用ROS包mavros来发送这些setpoint xff08 期望值 xf
  • 通过MAVROS控制仿真无人机

    首先 xff0c 在目录中建立工作区 xff0c 并进行初始化操作 mkdir p catkin ws src cd catkin ws catkin init wstool init src rosinstall generator ro
  • 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二次开发 五 进行测试 1 测试环境 PX4 xff1a v1 10 1 xff08 含自定义mavlink消息收发 xff09 ROS xff1a KineticUbuntu xff1a 16 04LTSQGC xff1a S
  • Windows10下Airsim+PX4(WSL2)+MAVROS仿真环境搭建

    一 Windows10下WSL2安装 1 1 WSL2的安装与配置 首先在Windows10下启用WSL xff0c 以管理员身份打开 PowerShell 工具并运行以下命令 dism span class token punctuati
  • 安装MAVROS过程 catkin:未找到命令 的问题

    PX4官网安装教程 源码方式安装 1 第一步执行 xff0c 创建文件夹 xff1b 移到创建文件夹中 mkdir p catkin ws src cd catkin ws 2 执行 catkin init 出错如下图 解决方法 xff1a
  • 从 MAVROS 到 PX4 飞控的数据流向

    上一篇分析了 MAVROS 中数据收发的实现方法 当用户发送一个 ros 话题的消息后 xff0c 对应的 plugin 中的回调函数被处罚 xff0c ros 消息被包装成 mavlink 消息 xff0c 从链路中发送出去 下面以 34
  • Mavros Client md5sum Error

    ERROR Client mavros wants topic State to have datatype md5sum mavros msgs State 4048c9de2a16f4ae8e0538085ebf1b97 but our
  • Jetson Xavier NX安装Mavros

    Px4飞控通过USB线连接Jetson Xavier NX xff0c 如果需要进行软连接 xff0c 即通讯 xff0c 需要下载Mavros功能包 xff0c 并通过启动命令进行连接 安装Mavros sudo apt install
  • MAVROS +ardupilot +gazebo 无人机集群仿真 (一)

    MAVROS 43 ardupilot 43 gazebo 无人机集群仿真 xff08 一 xff09 无人机仿真环境搭建仿真软件安装仿真环境测试无人机多机仿真apm launch文件修改修改 iris ardupilot world修改
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • 【PX4 飞控剖析】06 树莓派加载安装ROS,Mavros以及PX4固件

    PX4 飞控剖析 06 树莓派加载安装Mavros以及PX4固件 1 树莓派 刷镜像1 1 用Win32DiskImager刷入ubuntu mate 16 04 2 desktop armhf raspberry pi的镜像 1 2 开机
  • Optitrack Motive软件安装及使用说明

    Motive 软件安装程序 http www naturalpoint com optitrack downloads motive html 安装Motive需要安装两个底层插件 xff0c Directx aug2009 redist

随机推荐

  • 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