zoukankan      html  css  js  c++  java
  • 工程拾遗与bug集锦

    基础太弱,时常有各种奇怪的问题,特此记录疑问。

    RGBD-SLAM篇

    1.7
    我是怎么把src的文件全删掉的???
    创建desktop文件给matlab使用,做法来源于eclipse ide的配置;加了 -desktop还是没有解决
    为什么fast odometry能比原来的rgbdslam快那么多?修改过fast的launch文件还有odom的运行频率。
    进一步下降了odom的协方差系数。
    暂时只能在终端打开matlab:sudo /usr/local/MATLAB/R2015b/bin/matlab,不然无法写入命令记录

    1.8
    观察运行结果:对于距离在4m以内的物体,rgbd估计比较准,已经能与码盘持平;超出4m范围内纯用rgb定位,需要摄像头的校正。
    考虑camera_rgb_optical_frame和base_link的位置偏差。另外旋转时存在的跳点考虑滤波去掉。如何取出ui里优化后的轨迹?
    坐标系的设定果然是在urdf内完成:turtlebot_description
    为了将camera_rgb_frame的相机参数同时应用在rgb和depth上,直接拿rgb为基座标,在此基础上改动depth的参数。麻烦在于坐标变换。
    REP 119说明了turtlebot的描述规范。
    visual odometry的改进思路:根据experiment_settings改动fast的参数;提取优化后的轨迹;对slam轨迹进行滤波。
    尝试rosservice存储trajectory
    listener.waitForTransform的结构是堆栈结构,当运行时才会开始积累数据,当跳出函数后就销毁。
    http://answers.ros.org/question/205500/tf-error-lookup-would-require-extrapolation-into-the-past/
    kinect2电线与电池接触不良,容易突然断电!
    多次实验经验:旋转时容易产生大量累积误差;深度范围4.0m外没有物体,纯用rgb判断时容易崩溃;暂时为0.6rad/s;随着时间的推移,误差仍然会逐渐积累。
    实验陷入了喂特征的困境:环境要摆足够的特征物体并且旋转速度不能太大。不然容易“断片”。ORB应对平移时效果很好,但旋转时效果实在感人!

    1.9
    尝试编译Opencv nonfree 模块:SIFT,SURF 通过ppa更新nonfree模块,对其他模块也被更新了。
    为什么平移时vo比较准确,而旋转会产生明显的偏差?
    修改成SURF,稍微比ORB应对旋转时的能力强;增加了提取点数,调整了nn_ratio
    第四组数据最后几个点找回了原位,但tf树由于长时间没有有效点,很难外推到要的数据。

    1.10
    尝试限制depth的最远距离?提高ransac的容许度?
    仍然走着走着就断片……
    SURF:nn_ratio:0.5~0.8 ORB:>0.85
    largest_loop:取所有的点进行图优化,加上use_robot_odom_only在第5次接受实验中表现比以往鲁棒性要强一丢丢
    能不能拿到类似于TUM的kinect2相机标定参数?

    1.11
    g2o的优化范围为部分优化;g2o目标函数给太大出不来结果。
    inaffected比largest_loop要稳定一些,但精度可能有所欠缺
    降低kinect2的数据频率为10hz可以降低rgbdslam的tf的发布频率
    g2o的提示:165个tf点,1.3s的优化时间。减少比较的数量:g2o的算法复杂度为O(n^k),n为轨迹点个数,k为比较个数。candidates=k,个数与算法复杂度直接相关。
    需不需要读过去2s的tf,如果回溯优化效果不明显
    optimize_landmarks设为false后鲁棒性显著提高
    旋转的时候产生偏差。
    要一组标定参数试试;kinect2的factor和kinect的factor=5000是否不一样?kinect2读出来的深度数据最大为255,那么是否为2^8?经查证,kinect直接
    rostopic echo /camera/depth/image_rect 返回的数据最大仍然是255. node.cpp将原始的色彩、深度图像通过参数转化为点云图像。misc2.h backProject转换函数。
    暂定每一步都进行优化。
    加了一次参数后fast不能用了,删掉依然会崩溃,这是怎么一回事?因为刚刚好还调高了RANSAC的容许率,使得rgbdslam崩溃。
    odom listener调整为1hz一次,读两秒前的数据。

    1.13
    调整g2o_transformation_refinement

    1.14
    为什么tf tree的发布位置又出现了错误
    在重新编译完rgbdslam之后都要记着修改openni_rgb_optical_frame为camera_rgb_optical_frame,

    定义于launch文件,作用于parameter_server.cpp 引用处:/openni_camera in openni_listener.cpp DO_FEATURE_OPTIMIZATION is set in CMakeLists.txt MATLAB 设置复制粘贴:preference-keyboard-shortcuts-windows default set 还是不对。应该修改openni.cpp的源码,因为kinect2的tf没有打通到kobuki,所以直接将base_frame_name = base_footprint 并设置 depth_frame_id = camera_depth_optical_frame //Retrieve the transform between the lens and the base-link at capturing time;openni.cpp 做了注释。 千万不要再删代码重新编译了。 问题的根源仍然没有解决。kinect2的焦距、底座与kinect2的变换等工作都需要测定,将rgbdslam移植为kinect2可用的工作。 忘了改为qhd降低计算负担。 调整optimizer的策略。graph_manager.cpp 还原fast设置后第一次实验;忘了存实验数据!转一圈过程中有跳点,能保持不断tf的eps极限为0.2;不改base_frame_name为base_footprint的原因是没有做好kinect2与kobuki的坐标系转换。 graph_manager.cpp说明了use_robot_odom与use_robot_odom_only的区别:前者把vo和wheel odom一并作为图的节点做图优化,后者只优化wheel odom。 openni_listener.cpp有监听odom的设置并打印信息,将其注释掉,因为不需要看了。 修改每一个参数之前最好都找到其源头! base_frame_name: 在openni_listener.cpp, camera_rgb_optical_frame or base_footprint, depth_frame:***_rgb_optical_frame,由于没有让kinect2发布tf,直接修改为单位矩阵,不进行变换。 pose_relative_to:在graph_manager.cpp设置,疑问:什么是fixed; 参数为inaffected: 外部信息wheel odom不起作用。 fixed程度:inaffected(all fixed)>previous(fixed except two newest vertexs)>first(only the first vertex fixed)>largest_loop(all unfixed) geodesic_depth: in graph_manager.cpp 重新解压源码编译。

    1.15
    调小predecessor_candidates和neighbor_candidates以获得较快优化速度;没有达到预期速度,还是前期快后期慢;
    尝试clear_non_keyframes来只保留关键帧,可能有风险。引用处在graph_manager.cpp 稳定时间貌似比以前长了一点。
    延长odom.cpp对vo的等待时间。
    odometry_information_factor在graph_mgr_odom.cpp内定义得到infoCoeff,没必要调太小,调为1.
    geodesic_depth调大一点会有什么效果?在graph_manager.cpp,貌似与candidates个数联调
    ransac_iterations: node.cpp, 与max_dist_for_inliers联调优化ransac的粗估计效果
    g2o_transformation_refinement: node.cpp, 为g2o的优化次数, 调用函数getTransformFromMatchesG2O在transformation_estimation.cpp
    ransac_termination_inlier_pct的出处:node.cpp, getRelativeTransformationTo里根本没有调用这个参数,而是分为0.5,0.75,0.8三档;使rmse尽量减少
    DO_FEATURE_OPTIMIZATION:涉及到相机参数的设置,GraphManager::createOptimizer
    misc.cpp errorFunction针对kinect1的参数而设置,跟kinect2不一样
    observability_threshold:misc.cpp,貌似用于检验transform能否接受,在rejectionSignificance判断完后会取点云并用相机参数设置。用不用呢?
    第8次记录:问题定位到相机参数。node.cpp的projectTo3D函数使用相机参数进行变换。
    修改node.cpp打印相机参数以确定问题;能读到默认的参数。类型:sensor_msgs::CameraInfoConstPtr& cam_info
    问题:在graph_manager.cpp里用DO_FEATURE_OPTIMIZATION直接判断并写入参数,而不是从camera_info内读取。
    transformation_estimation.cpp自己设定了用在优化器里的相机参数

    openni_listener.cpp里的OpenNIListener::retrieveTransformations里设置了关于摄像坐标系到成像坐标系的变换。
    如果使用kinect1,那么bug在于设置base_frame_name时为camera_rgb_optical_frame,在上述函数里会寻找跟camera_depth_optical_frame的变换,而不会触发例外。可能在hydro的openni版本内的变换是符合的,但freenect里面不是这个变化。修改base_frame_name为camera_link.
    第9次记录为迄今最好的一次数据,是在kinect1上完成的,证明了之前相机参数没给对的猜想

    kinect2镜头到中点的距离大概为9.5cm,固接在机器人上时可以使用。

    2.22
    ubuntu gnome 回校了解一下

    ORB-SLAM篇

    2016.03.05

    Q:定义一个结构体最后为什么要再加一个分号?

    A:定义一个结构体最后加一个分号,一个声明语句;
    函数外定义了一个全局的结构体变量,就可以不加分号,如果定义了多个全局的,则最后一个可以不加,申明语句也要加分号啊
    结构体类型只能是声明 ,例如声明了一个结构体类型 struct student{}; 定义变量形式 类型名 变量名;

    reference:http://zhidao.baidu.com/link?url=jTk0V9yaxcSsWOGLSABnr-iHT0bQd1rO27uzvbINd0Chlr9Sj7jC76z5ELaC3u9_Hpt3Y3T7CN51i1k-7Iav5K

    03.06

    Q: 类成员的函数定义或声明后加上const的作用是什么?

    A: 加上const后,类成员函数内与类相关的数据变量不可更改。

    reference:http://zhidao.baidu.com/link?url=u93w1nIHMTOXCuWGm4mOowMnbYLsH-iKfO4ieMz4NoV2jCuopZnhZOPVKgo78VkUX4wGlJ1jRdh2u4h6At9rk1ARdpPh5pdslCGGUYS7goa

    Q: map是什么?

    A:

    2016.03.25

    配置QtCreator,导入CMakeLists.txt能支持读取整个项目的方法:http://wiki.ros.org/IDEs#QtCreator

    对应错误提示:unknown cmake command rosbuild_init

    2016.03.27

    image_view 与 kinect2_calibration冲突,具体提示为Tried to advertise a service that is already advertised in this node

    解决思路:重新启动roscore,清空rosservice,没有解决。github issue说自己

    2016.03.28

    为了设置手柄给的速度,从turtlebot_bringup minimal.launch寻根到了turtlebot_bringup/param/defaults/smoother.yaml修改速度上界。

    auto docking charging == autonomous charging

    2016.04.04

    turtlebot上为kinect1设置了2个支架,而在kinect2上没有

    现在使用ps3_teleop.launch进行手柄控制。

    完成了QtCreator对ROS环境的配置。认真读IDE的配置。

    2016.04.10

    用于amcl的gmapping地图构建:地图文件为pgm图像,障碍物如墙等的像素值为0,可走路径点为254

    2016.04.11

    turtlebot_navigation param tuning:

    costmap_common_params.yaml: map_type: voxel->costmap; obstacle_range: 2.5->1.2

    2016.04.15

    bug killed: cv::Mat.rowRange(u1,u2).col(v) 换成 colRange后访问会引起exception

    2016.04.16

    TUM dataset表示的位姿是相机坐标系相对世界坐标系下的位姿,要转换到移动机器人坐标系下相对于世界坐标系的位姿才能使用。

    2016.04.18

    kobuki几个重要参数的文件:

    /opt/ros/indigo/share/kobuki_node/param/base.yaml: set publish_tf for robot_pose_ekf; set use_imu_heading

    /opt/ros/indigo/share/turtlebot_bringup/launch/includes/kobuki: Kobuki's implementation of turtlebot's mobile base.

    对robot_pose_ekf.launch, opt/ros/indigo/share/kobuki_node/param/base.yaml有所修改。

    2016.04.19

    turtlebot_navigation param tuning:

    dwa_local_planner_params.yaml: max_trans_vel: 0.5->0.3; yaw_goal_tolerance: 0.3->0.5

    2016.04.20

    中signal用于不同中断时的handle调用,如可用于ctrl+c时退出前的工作。

    2016.04.21

    Q:接kinect2_link到camera_depth_frame做点云的原因是什么?

    A:貌似接在turtlebot所有关节上都会最后连到camera_depth_frame。

    pointcloud_to_scan中设置target_frame,并在cpp中发布tf设置transform.setOrigin,才能正确表示点云的距离。

    2016.04.25

    undefined function or variable syms matlab:ubuntu空间不够大,安装的matlab是基本版

    在ROS中用四元数要小心低级错误:定义tf::Quaternion(x,y,z,w)而我们计算时一般是(w,x,y,z)

    2016.05.12

    下载了amcl源码,改了包名,重新编译,看能不能接进去turtlebot_navigation

    pkg为catkin workspace内CMakeLists.txt指定package的名字,type为add_executable时起的名字,name为int main内ros::init自己给的名字

    set latch_xy_goal_tolerance=false, in turtlebot_navigation/param/dwa_local_planner_params.yaml

    set allow_unknown=true, in turtlebot_navigation/param/navfn_global_planner_params.yaml

    2016.06.01

    用命名空间管理不同的类,将之归为一个框架下。例子如下:

    nav_core: 包括global_planner, local_planner, recovery_behaviour

    ORB_SLAM2: 包括tracking, local mapping, loop closure

    2016.07.02

    ROS_HOME: ~/.ros

    2016.07.03

    kinect1 tf: turtlebot_description sensors

    2016.07.11

    将echo 0 > /sys/module/i915/parameters/enable_cmd_parser写入/etc/rc.local

    2016.07.23

    在.bashrc第一行添加了#!/bin/bash

    !/bin/bash

    Add following command to /etc/rc.local

    echo 0 > /sys/module/i915/parameters/enable_cmd_parser

    2016.08.03

    Add following command to /etc/rc.local

    (Multiple Kinects) Try increasing USBFS buffer size

    echo 64 > /sys/module/usbcore/parameters/usbfs_memory_mb, or maybe 128. Don't set it too large.

    2016.08.10

    修改文件夹用户: sudo chown user filename/foldername -R

    2017.06.08

    roboware studio能够调试ros程序。

    需要在node中选择debug this file才行。

    2017.06.22

    多个Kinect的同时运行,现在的驱动还是不稳定。尤其是Kinect过热,大概运行一个小时后,就无法得到深度信息。

    2017.07.17

    bug1

    在做《视觉SLAM十四讲》三角测量例子的时候,发现triangulatePoints例子死活过不去。

    一开始以为是给的vectoer不符合api调用,查了opencv 3.2.0和2.4.8的api,都发现可以直接将std::vector作为输入给InputArray.

    最后发现打的是大写,调用的是OpenCV的自有类Vector而非std::vector.

    了不起的bug。

    bug2

    Point2f pixel2cam(const Point2d& p, const Mat& K);
    // OpenCV特征点的坐标内置类型为Point2f;此函数根据从图像坐标系特征点坐标u与内参矩阵K反推相机坐标系坐标x
    // Mat填入的数据为double
    // 下面括号填充的类型必须精度向上看齐,填<float>的话,计算不出结果。
    Point2f pixel2cam(const Point2d& p, const Mat& K)
    {
        return Point2f(
                    (p.x - K.at<double>(0, 1)) / (K.at<double>(0, 0)),
                    (p.y - K.at<double>(0, 2)) / (K.at<double>(1, 1))
                );
    }
  • 相关阅读:
    事务与锁的一些总结
    NYOJ 73
    NYOJ 456
    Sleep函数
    NYOJ 488(素数环)
    NYOJ 308
    NYOJ 27
    NYOJ 325
    NYOJ 138
    求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
  • 原文地址:https://www.cnblogs.com/severnvergil/p/7197804.html
Copyright © 2011-2022 走看看