XTDrone和PX4学习期间问题记录(一)

交互客
• 阅读 1051

XTDrone和PX4学习期间问题记录(一)

Written By PiscesAlpaca

前言:

出现问题可以去官方网站http://ceres-solver.org/index...查看文档,搜索引擎很难搜到对应的问题。(不过我写了这些问题的解决办法,没准以后就能搜到了hh

1.视觉SLAM篇

URL:视觉SLAM · 语雀

ORBSLAM2编译

编译依赖见ORBSLAM2编译依赖

注意该ORBSLAM2是在原版本基础上略做修改,其虽然支持ROS,但不是标准的ROS架构,因此不能采用catkin build编译。

cp -r ~/XTDrone/sensing/slam/vslam/ORB_SLAM2/ ~/catkin_ws/src/
mkdir ~/catkin_ws/scripts/
cp ~/catkin_ws/src/ORB_SLAM2/xtdrone* ~/catkin_ws/scripts/
cd ~/catkin_ws/src/ORB_SLAM2
chmod +x build.sh
./build.sh
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/catkin_ws/src/ORB_SLAM2/Examples/ROS #将这句放到~/.bashrc中,以后使用更方便
chmod +x build_ros.sh
./build_ros.sh

问题:在进行./build.sh时,遇到了make[2]: *** No rule to make target '../Thirdparty/DBoW2/lib/libDBoW2.so', needed by '../lib/libORB_SLAM3.so'. Stop.

解决办法:手动cd进目录ORB_SLAM3/Thirdparty/DBoW2/build,依次运行cmake ..build -j4,之后就可以发现libDBoW2.so文件生成在lib目录下,再按照教程运行./build.sh即可100%完成编译。

2.三维激光SLAM篇

问题:在进行catkin_make命令时,遇到了`/home/pisces/catkin_ws/src/A- LOAM/src/laserOdometry.cpp:286:29: error: expected type-specifier
286 | new ceres::EigenQuaternionParameterization();

  |                             ^~~~~                                   `

解决办法:

官方文档显示

EigenQuaternionParameterization is deprecated. It will be
removed in version 2.2.0 of Ceres Solver. Please use EigenQuaternionManifold instead.

证明EigenQuaternionParameterization已经过时,需要使用EigenQuaternionManifold替换,即:

ceres::LocalParameterization *q_parameterization = new ceres::EigenQuaternionParameterization();

替换为:``

ceres::LocalParameterization *q_parameterization = new ceres::EigenQuaternionManifold();

3.视觉惯性里程计

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/camera_models/src/calib/CameraCalibration.cc:508:17: error: cannot convert ‘camodocal::EigenQuaternionParameterization’ to ‘ceres::LocalParameterization’ in initialization

         new EigenQuaternionParameterization;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

解决方法:更改ceres::LocalParameterization*为ceres::Manifold*

        ceres::Manifold* quaternionParameterization =
            new EigenQuaternionParameterization;

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/camera_models/src/calib/CameraCalibration.cc:510:17: error: ‘class ceres::Problem’ has no member named ‘SetParameterization’; did you mean ‘SetParameterLowerBound’?

     problem.SetParameterization(transformVec.at(i).rotationData(),
             ^~~~~~~~~~~~~~~~~~~
             SetParameterLowerBound`

解决方法:

This method is deprecated and will be removed in Ceres Solver version 2.2.0. Please move to using the SetManifold instead.

        problem.SetManifold(transformVec.at(i).rotationData(),
                                    quaternionParameterization);

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/global_fusion/src/globalOpt.cpp:109:72: error: expected type-specifier

         ceres::LocalParameterization* local_parameterization = new ceres::QuaternionParameterization();
                                                                    ^~~~~`

解决方法:

QuaternionParameterization is deprecated. It will be removed in version 2.2.0 of Ceres Solver. Please use QuaternionManifold instead.

            ceres::Manifold* local_parameterization = new ceres::QuaternionManifold();

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/camera_models/src/calib/CameraCalibration.cc:508:17: error: invalid new-expression of abstract class type ‘camodocal::EigenQuaternionParameterization’

         new EigenQuaternionParameterization;
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

解决方法:本质是因为新继承的Manifold类出现了新的纯虚函数,只需要在EigenQuaternionParameterization类实现就行

在EigenQuaternionParameterization类public:下加入

    virtual int AmbientSize() const {return 7;}
    virtual int TangentSize() const {return 1;}
    virtual bool PlusJacobian(const double* x, double* jacobian) const {return 1;}
    virtual bool Minus(const double* y,
                       const double* x,
                       double* y_minus_x) const {return 1;}
    virtual bool MinusJacobian(const double* x, double* jacobian) const {return 1;}

class EigenQuaternionParameterization : public ceres::Manifold
{
public:
    virtual ~EigenQuaternionParameterization() {}
    virtual bool Plus(const double* x,
                      const double* delta,
                      double* x_plus_delta) const;
    virtual bool ComputeJacobian(const double* x,
                                 double* jacobian) const;
    virtual int GlobalSize() const { return 4; }
    virtual int LocalSize() const { return 3; }

    //edit by PiscesAlpaca
    virtual int AmbientSize() const {return 1;}
    virtual int TangentSize() const {return 1;}
    virtual bool PlusJacobian(const double* x, double* jacobian) const {return 1;}
    virtual bool Minus(const double* y,
                       const double* x,
                       double* y_minus_x) const {return 1;}
    virtual bool MinusJacobian(const double* x, double* jacobian) const {return 1;}

private:
    template<typename T>
    void EigenQuaternionProduct(const T z[4], const T w[4], T zw[4]) const;
};

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/loop_fusion/src/pose_graph.h:134:24: error: ‘AutoDiffLocalParameterization’ in namespace ‘ceres’ does not name a template type

 return (new ceres::AutoDiffLocalParameterization<AngleLocalParameterization,
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

解决方法:

AutoDiffParameterization is deprecated. It will be removed in version 2.2.0 of Ceres Solver. Please use AutoDiffManifold instead.

  static ceres::Manifold* Create() {
    return (new ceres::AutoDiffManifold <AngleLocalParameterization,
                                                     1, 1>);
  }

注意:如果进行更改后编译提示缺少Plus和Minus函数,可以在pose_graph.h文件加入

class AngleLocalParameterization {
 public:

  template <typename T>
  bool operator()(const T* theta_radians, const T* delta_theta_radians,
                  T* theta_radians_plus_delta) const {
    *theta_radians_plus_delta =
        NormalizeAngle(*theta_radians + *delta_theta_radians);

    return true;
  }

  //edit by pisces
    bool Plus(const double* x,
              const double* delta,
              double* x_plus_delta) {
        return true;
    }
    //edit by pisces
    bool Minus(const double* y,
               const double* x,
               double* y_minus_x) {
        return true;
    }
    //edit by pisces
    template <typename T>
    bool Plus(const T* x,
              const T* delta,
              T* x_plus_delta) const{
        return true;
    }
    //edit by pisces
    template <typename T>
    bool Minus(const T* y,
               const T* x,
               T* y_minus_x) const{
        return true;
    }

    static ceres::Manifold* Create() {
    return (new ceres::AutoDiffManifold <AngleLocalParameterization,
                                                     1, 1>);
  }
};

//edit by pisces为增加的函数

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/vins_estimator/src/estimator/../factor/pose_local_parameterization.h:16:49: error: invalid use of incomplete type ‘class ceres::LocalParameterization’
class PoseLocalParameterization : public ceres::LocalParameterization

                                             ^~~~~~~~~~~~~~~~~~~~~`

解决方法:更改ceres::LocalParameterization*为ceres::Manifold*

同本节问题1

问题:

`/home/pisces/catkin_ws/src/VINS-Fusion/loop_fusion/src/pose_graph.cpp:474:52: error: cannot convert ‘ceres::Manifold’ to ‘ceres::LocalParameterization’ in initialization

             AngleLocalParameterization::Create();
                                                ^`

解决方法:

            ceres::Manifold* angle_local_parameterization =
                AngleLocalParameterization::Create();

不过上述方法最终没有能够让VINS-Fusion接收到正确数据,还是对ceres进行了降级才实现,版本为1.14。如果有使用上述方法成功的读者可以在评论告诉我~

欢迎指出错误和不足~

转载请注明出处!

本篇发布在以下博客或网站:

双鱼座羊驼 - 知乎 (zhihu.com)

双鱼座羊驼的博客_CSDN博客

双鱼座羊驼 - SegmentFault 思否

双鱼座羊驼 的个人主页 - 动态 - 掘金 (juejin.cn)

双鱼座羊驼 - 博客园 (cnblogs.com)

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
Vue 学习记录(一)
环境准备1.node.js  2.vuecli安装配置环境1.下载node.js,使用默认配置安装。2.使用npm命令安装国内下载镜像(可选)  cmd:  npminstall g cnpm registryhttps://registry.npm.taobao.org  tips:在命
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Stella981 Stella981
3年前
IDA Pro
原文地址:ReversingCprogramswithIDAproandHexrays(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fblog.0xbadc0de.be%2Farchives%2F67)简介在假期期间,我花了很多时间学习和逆向用C写
Wesley13 Wesley13
3年前
NIO网络编程中重复触发读(写)事件
一、前言  公司最近要基于Netty构建一个TCP通讯框架,因Netty是基于NIO的,为了更好的学习和使用Netty,特意去翻了之前记录的NIO的资料,以及重新实现了一遍NIO的网络通讯,不试不知道,一试发现好多细节没注意,导致客户端和服务端通讯的时候出现了一些非常莫名其妙的问题,这边我记录下耗了我一晚上的问题~二、正文
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Linux应急响应(四):盖茨木马
0x00前言Linux盖茨木马是一类有着丰富历史,隐藏手法巧妙,网络攻击行为显著的DDoS木马,主要恶意特点是具备了后门程序,DDoS攻击的能力,并且会替换常用的系统文件进行伪装。木马得名于其在变量函数的命名中,大量使用Gates这个单词。分析和清除盖茨木马的过程,可以发现有很多值得去学习和借鉴的地方。0x01应急场景
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Scala 小程序记录(学习期间的代码片段)
/20160321输出99乘法表/objectmain{defmain(args:ArrayString):Unit{for(i<1to9;j<1toi)print(s"$j$i
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
交互客
交互客
Lv1
戍客望边邑,思归多苦颜。
文章
3
粉丝
0
获赞
0