Joint_VO_SF_master源码解读

博客提及readme中有数据集介绍,涉及kmeans.cpp进行扭曲图像残差计算,还提到orbslam用计算重投影误差剔除异常点,打算先运行tum rgbd数据集查看结果。

main_vo_sf_imageseq.cpp文件中

这个就是读取文件的路径
图片路径需要修改
std::string dir = ".../data/sequence people moving/"; 

这个函数用来读取图片的。
cf.loadImageFromSequence(dir, im_count, res_factor);

在solver.cpp中有loadImageFromSequence函数的定义。


传入进来的index=1;构建图片名aux
 sprintf(aux, "i%d.png", index);//构建aux="i1.png"

构建图片路径
string name = files_dir + aux;

读取RGB彩色图片
cv::Mat color = cv::imread(name.c_str(), CV_LOAD_IMAGE_COLOR);

同样的构建图片读取路径
sprintf(aux, "d%d.png", index);
name = files_dir + aux;

读取深度图。
cv::Mat depth = cv::imread(name, -1);


ok!读取图片任务完成。

因为数据集需要有以下改动,
1.图片路径需要修改
2.图片路径下存放的图片命名应该为,ixx(rgb图片),dxx(深度图)。
3.运行方式:./VO-SF-ImageSeq,因为我没有编译过,所以不知道生成的具体的可执行文件是什么样的。
4.运行了之后可能还有输入提示,
n:加载图片并运行
s:继续or停止
e:关闭程序

readme中也有关于数据集的介绍。
在这里插入图片描述

kmeans.cpp

void VO_SF::kMeans3DCoord()函数中

const float distance_to_last_label = (centers_a.col(last_label) - p).squaredNorm();

MatrixXf centers_a(3,NUM_LABELS)
const Vector3f p(depth_ref(v,u), xx_ref(v,u), yy_ref(v,u));

//Refs
const MatrixXf &depth_ref = depth_old[lower_level];
const MatrixXf &xx_ref = xx_old[lower_level];
const MatrixXf &yy_ref = yy_old[lower_level];void VO_SF::createImagePyramid()函数中,
    //Push the frames back
    intensity_old.swap(intensity);
    depth_old.swap(depth);
    xx_old.swap(xx);
    yy_old.swap(yy);
    
0.intensity_wf,depth_wf初始化了。
1.intensity,depth没有初始化。。。。
2.xx,yy就是等比例变换的坐标,
3.实际上是在createImagePyramid()函数里进行初始化的。。。。
4.本质上聚类还是使用的深度信息和图像坐标进行聚类的。。。。,没有使用到灰度信息聚类。
5.使用了图像金字塔,因此聚类是在图像金字塔的图像中聚类的。
=6.先实现图像金字塔聚类结果显示。。。。。


loadImagePairFromFiles函数中初始化了这些变量
main_vo_sf_imagepair.cpp中调用了该函数

3) VO SF ImagePair:**这是一个简单的应用程序,用于测试单个RGB-D图像对的算法(主要用于查看估计场景流的准确性)。设置主文件中包含图像的文件夹。图像文件应具有以下名称:“depth0.png”、“color0.png“、“depth1.png”和“color1.png“。
场景流以米为单位存储(坐标:x-/右,y-/下,z-深度)。

**4) VO SF ImageSeq:**使用预先记录的图像序列测试算法。设置主文件中包含图像的文件夹。图像文件应具有以下名称:
深度序列-“d0.png”、“d1.png”、“d2.png”。。。
颜色序列-“i0.png”、“i1.png”和“i2.png”。。。
您可以在主文件中设置要开始的第一个图像(“im_count”中的初始值)。
您还可以使用变量“抽取”设置抽取因子。
聚类函数测试

实际上是判断单张图片能否聚类成功,以及耗时方面的计算。
1.图像尺寸需要更改,图片名称,导入深度图和rgb图片进行测试

代码完成之后进行调试
kmeans-11-27带有金字塔的图像聚类,运行成功。。。。

kmeans-11-28
Q1.去除图像金字塔,直接按原图像比例进行聚类。
2.图像金字塔是需要的,因为需要使用最小分辨率的图像金字塔来实现聚类中心的初始化,同时节省时间。
3.最后也只在320×240的最大分辨率的图像上进行聚类的。
4.聚类完成后需要完成可视化相关程序。
程序完成。但是实验效果并不好,还有,如何使用???最后的图像为缩小后的图像。。。个人觉得不好。

使用深度图进行聚类不如直接使用rgb图像进行聚类。理论部分需要更改。

扭曲图像计算残差

orbslam里面用于剔除异常点的方法就是计算的重投影误差。。。。。
先试试orbslam运行tum rgbd数据集看看结果。

<think>我们正在解决ROS中启动`joint_state_publisher`失败的问题。根据引用内容,我们可以总结出以下可能的原因和解决方案: ### 可能原因: 1. **未安装相应的ROS包**:如引用[2]和[4]指出,如果没有安装`joint_state_publisher`包,则无法启动节点。 2. **节点名称或类型错误**:在launch文件中可能错误指定了节点类型或名称。 3. **依赖关系问题**:节点可能因为依赖的其他节点或话题未准备好而启动失败。 4. **URDF模型问题**:如果URDF模型中的关节定义有误,可能导致节点无法正常启动(引用[3])。 5. **版本不匹配**:如引用[4]提到,不同ROS版本(如humble, noetic等)需要安装对应版本的功能包。 ### 解决方案: #### 1. 安装缺失的ROS包(引用[2][4]) - 对于ROS1(如Melodic、Noetic): ```bash sudo apt-get install ros-<distro>-joint-state-publisher sudo apt-get install ros-<distro>-joint-state-publisher-gui # 如果需要GUI版本 ``` 将`<distro>`替换为你的ROS发行版(如`melodic`、`noetic`)。 - 对于ROS2(如Humble): ```bash sudo apt install ros-<distro>-joint-state-publisher ``` #### 2. 检查launch文件配置(引用[1][5]) 在launch文件中,确保正确启动了`joint_state_publisher`节点。例如: - ROS1 launch文件示例: ```xml <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> ``` 如果需要GUI版本,使用`type="joint_state_publisher_gui"`。 - ROS2 launch文件示例: ```python from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='joint_state_publisher', executable='joint_state_publisher', name='joint_state_publisher' ) ]) ``` #### 3. 确保关节状态正确发布(引用[3][5]) - 检查`joint_state_publisher`是否正确发布了`/joint_states`话题。使用以下命令查看: ```bash rostopic echo /joint_states # ROS1 ros2 topic echo /joint_states # ROS2 ``` - 如果话题没有数据,可能是URDF模型中的关节定义问题。检查URDF文件中关节(joint)的定义是否正确。 #### 4. 验证节点运行状态 - 使用`rosnode list`(ROS1)或`ros2 node list`(ROS2)查看节点是否运行。 - 如果节点启动后立即退出,查看日志: ```bash rosnode info /joint_state_publisher # ROS1 ros2 node info /joint_state_publisher # ROS2 ``` #### 5. 处理时间同步问题(引用[2]) 在仿真环境中,确保设置`use_sim_time`参数: ```xml <!-- ROS1 launch文件 --> <param name="/use_sim_time" value="true"/> ``` #### 6. 检查依赖关系 - 确保`robot_state_publisher`节点在`joint_state_publisher`之后启动(引用[5]),因为`robot_state_publisher`需要订阅`/joint_states`话题。 - 在ROS1中,可以使用`<node>`标签的`depends_on`属性(但注意launch文件中的节点启动顺序通常由依赖关系决定,但实际启动顺序可能由ROS控制器管理,因此更可靠的是使用`<node>`标签的`launch-prefix`来延迟启动,例如:`launch-prefix="bash -c 'sleep 1; $0 $@'"`)。 - 在ROS2中,可以使用`execution_dependencies`或通过`Lifecycle`节点管理启动顺序。 ### 调试工具: - **RViz**:检查TF变换和机器人模型(引用[3])。 - **rqt_graph**:查看节点和话题之间的连接关系。 - **查看日志**:使用`ros2 run joint_state_publisher joint_state_publisher --ros-args --log-level debug`(ROS2)或增加launch文件中节点的`output="screen"`属性(ROS1)来获取详细日志。 ### 相关问题: 1. 如何为不同的ROS发行版安装`joint_state_publisher`包? 2. 在launch文件中如何确保`joint_state_publisher`和`robot_state_publisher`的启动顺序? 3. 如何调试`joint_state_publisher`无法发布`/joint_states`话题的问题? 4. URDF模型中关节定义的正确方法是什么? 5. 在ROS2中,`joint_state_publisher`和`robot_state_publisher`的协作方式与ROS1有何不同?</think>### 解决ROS joint_state_publisher启动失败问题 `joint_state_publisher`节点启动失败通常由以下原因引起,以下是系统化的解决方案: #### 🔧 核心修复步骤 1. **安装缺失的依赖包**(最常见原因) 根据ROS版本安装对应包(参考引用[2][4]): ```bash # ROS1 (Noetic/Melodic) sudo apt-get install ros-$ROS_DISTRO-joint-state-publisher sudo apt-get install ros-$ROS_DISTRO-robot-state-publisher # ROS2 (Humble/Foxy) sudo apt install ros-$ROS_DISTRO-joint-state-publisher ``` 2. **检查launch文件配置** 确保正确声明节点类型(参考引用[1][5]): ```xml <!-- ROS1 标准配置 --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> <!-- ROS2 标准配置 --> <node pkg="joint_state_publisher" exec="joint_state_publisher" name="joint_state_publisher" /> ``` 3. **验证节点连接性** 启动后检查节点和话题状态: ```bash rosnode list # 确认节点存在 rostopic list | grep joint_states # 检查话题发布 rosnode info /joint_state_publisher # 查看详细状态 ``` #### ⚠️ 关键故障排查 1. **版本兼容性问题** - 检查ROS版本:`echo $ROS_DISTRO` - 确保安装的包与ROS版本匹配(如ROS Noetic使用`ros-noetic-*`包) 2. **GUI版本特殊处理** 使用GUI版本时需单独安装: ```bash sudo apt-get install ros-$ROS_DISTRO-joint-state-publisher-gui ``` 启动时指定类型: ```xml <node type="joint_state_publisher_gui" ... /> ``` 3. **URDF模型问题** 检查URDF中关节定义: ```xml <!-- 示例关节定义 --> <joint name="wheel_joint" type="continuous"> <parent link="base_link"/> <child link="wheel"/> <axis xyz="0 1 0"/> </joint> ``` 使用`check_urdf`验证模型: ```bash rosrun urdfdom check_urdf your_robot.urdf ``` 4. **启动顺序问题** 确保依赖节点已启动(参考引用[5]): ```mermaid sequenceDiagram 启动脚本->>+urdf模型加载: 首先加载 启动脚本->>+joint_state_publisher: 其次启动 启动脚本->>+robot_state_publisher: 最后启动 ``` #### 🛠️ 高级调试技巧 1. **查看详细日志** ```bash # ROS1 ROS_LOG_DIR=~/.ros/log rosrun joint_state_publisher joint_state_publisher # ROS2 ros2 run joint_state_publisher joint_state_publisher --ros-args --log-level debug ``` 2. **手动测试发布** ```bash rostopic pub /joint_states sensor_msgs/JointState ' header: seq: 0 stamp: {secs: 0, nsecs: 0} frame_id: "" name: ["joint1"] position: [0.5] velocity: [0] effort: [0]' ``` 3. **检查环境变量** ```bash printenv | grep ROS # 确认环境配置正确 source /opt/ros/$ROS_DISTRO/setup.bash # 重载环境 ``` > **故障诊断树**: > ```mermaid > graph TD > A[joint_state_publisher启动失败] --> B{错误类型} > B -->|节点未找到| C[检查包安装] > B -->|话题未发布| D[检查URDF关节定义] > B -->|GUI不显示| E[安装GUI版本] > C --> F[确认ROS版本匹配] > D --> G[运行urdf检查工具] > ``` 通过以上步骤,95%的启动失败问题可解决。若仍有问题,可能是系统级环境配置错误或ROS基础安装损坏。 ### 相关问题 1. 如何为不同ROS版本(Noetic/Humble)正确安装joint_state_publisher? 2. URDF模型中关节定义的最佳实践有哪些? 3. 如何调试joint_state_publisher与robot_state_publisher之间的通信故障? 4. 在分布式ROS系统中如何确保joint_state_publisher的时间同步? 5. joint_state_publisher_gui无法显示滑块界面的解决方法是什么?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值