基础太弱,时常有各种奇怪的问题,特此记录疑问。
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的结构是堆栈结构,当运行时才会开始积累数据,当跳出函数后就销毁。 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_refinement1.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:
03.06
Q: 类成员的函数定义或声明后加上const的作用是什么?
A: 加上const后,类成员函数内与类相关的数据变量不可更改。
reference:
Q: map是什么?
A:
2016.03.25
配置QtCreator,导入CMakeLists.txt能支持读取整个项目的方法:
对应错误提示: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// 下面括号填充的类型必须精度向上看齐,填的话,计算不出结果。Point2f pixel2cam(const Point2d& p, const Mat& K){ return Point2f( (p.x - K.at (0, 1)) / (K.at (0, 0)), (p.y - K.at (0, 2)) / (K.at (1, 1)) );}