工程拾遗与bug集锦

时间:2022-08-16 23:40:26

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

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

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))
            );
}