x5 132gs想自行标定,出流后想看到实时图像但打不开http://192.168.127.10:8000/TogetheROS/

1. 这组结果可用,同时纠正我上次的判据:T 的 x 为负是对的,别交换左右。

单目 0.16/0.27 px、双目 0.234 px、去畸变直线度 0.16 px;fx≈fy≈664.5,主点 (639, 542)≈(1280/2, 1088/2);R 只有约 0.19° 残差;基线 80.02 mm 对上模组 80 mm。这是一组标准水平双目结果。

OpenCV/kalibr 的约定是 X₂ = R·X₁ + T,右目在左目坐标系的 +x 侧时 T = (−b, 0, 0),所以 abs(Tx) 才是基线,符号本来就该是负——官方 AMR 3.5.2 双目标定示例 的输出里 T_cn_cnm1 第 4 列 x 就是 -0.0683(对应它 68 mm 基线)。我上次说"T[0] 必须为正"说错了,按那个说法你会把左右又翻回去。

唯一自查项:转完 90° 的图是正立的(椅子、棋盘格别倒着)。T 的符号区分不了"图正立+命名对"和"图倒置+命名反",运行时旋转方向必须和标定时完全一致。

2. 写下游标定文件(官方格式,radtan 只写 4 个系数)

依据官方 3.5.2 的标定输出格式(cam0/cam1 + pinhole-radtan 4 系数 + resolution + T_cn_cnm1)。k3 只在标定拟合时参与,不写进文件——这也是对我上次"必须保留 5 个"的纠正。

cam0:
  camera_model: pinhole
  distortion_coeffs: [-0.329345, 0.137608, 5.53903e-05, -2.83586e-05]
  distortion_model: radtan
  intrinsics: [664.634699, 664.506365, 639.418148, 541.638965]
  resolution: [1280, 1088]
  rostopic: /cam0/image_raw
cam1:
  T_cn_cnm1:
  - [0.99999364, 0.00331003, 0.00132688, -0.08002304]
  - [-0.00330733, 0.99999247, -0.00203245, 0.00019714]
  - [-0.0013336, 0.00202805, 0.99999705, 0.00033433]
  - [0.0, 0.0, 0.0, 1.0]
  camera_model: pinhole
  distortion_coeffs: [-0.317217, 0.117015, -2.47865e-04, 1.81395e-04]
  distortion_model: radtan
  intrinsics: [664.695560, 664.434330, 638.969982, 542.555995]
  resolution: [1280, 1088]
  rostopic: /cam1/image_raw

resolution 必须是转完之后的 [1280, 1088],写错分辨率做极线校正会直接整体错位。

3. 让 2.5.5 用这份标定

从 2.5.2 起 X5 的 stereonet 订阅 /image_combine_raw/left/camera_info 和 /image_combine_raw/right/camera_info(见 TROS 版本发布记录),官方模组的标定是 mipi_cam 从模组内置数据读出后走 camera_info 传进去的。所以自标定走文件这条路:

source /opt/tros/humble/setup.bash
ls $(ros2 pkg prefix hobot_stereonet)/share/hobot_stereonet/launch   # 先确认本机 launch 名
  • 相机端保持原图(gdc_enable:=false)、图像方向与标定一致;
  • 启动时加 calib_method:=custom stereo_calib_file_path:=/userdata/calib/gs130w_self.yaml(若你用的是 magicbox 的 run_stereo.sh,则对应 --calib_method custom --stereo_calib_file_path <绝对路径>);
  • custom 模式已经用文件做软件极线校正,不要再自己发 camera_info,两条路混用会互相覆盖;
  • 首次建议先用默认(不传 custom)跑一遍留作对照,再换自标定,比较 rectify 图和深度是否更合理。

4. 采一张图存四样(左原图、右原图、矫正左图、点云)

起节点加 publish_origin_enable:=True 才会有左右原图;出深度后 ros2 param set <节点名> save_result_once true 让节点自己存本次的矫正图/深度/点云。要自己控制路径和"同一帧",用下面这个脚本(先 ros2 topic list | grep -E "origin|rectify|depth|cloud" 核对话题名):

import os, cv2, rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image, PointCloud2
from sensor_msgs_py import point_cloud2 as pc2
from cv_bridge import CvBridge

OUT = os.path.expanduser('~/stereo_out'); os.makedirs(OUT, exist_ok=True)
TOP = {'origin_left': '/StereoNetNode/origin_left_image',
       'origin_right': '/StereoNetNode/origin_right_image',
       'rectify_left': '/StereoNetNode/rectify_left_image',
       'cloud': '/StereoNetNode/cloud'}

class G(Node):
    def __init__(self):
        super().__init__('grab_stereo'); self.b = CvBridge(); self.msg = {}
        for k, t in TOP.items():
            typ = PointCloud2 if k == 'cloud' else Image
            self.create_subscription(typ, t, lambda m, k=k: self.msg.__setitem__(k, m), 10)

    def to_bgr(self, m):
        enc = m.encoding.lower()
        if enc in ('nv12', 'nv21'):
            yuv = self.b.imgmsg_to_cv2(m)
            return cv2.cvtColor(yuv, cv2.COLOR_YUV2BGR_NV12 if enc == 'nv12' else cv2.COLOR_YUV2BGR_NV21)
        return self.b.imgmsg_to_cv2(m, 'bgr8')

    def save(self, i):
        miss = [k for k in TOP if k not in self.msg]
        if miss: print('还没收到:', miss); return
        ts = [m.header.stamp.sec + m.header.stamp.nanosec * 1e-9 for m in self.msg.values()]
        print('四路 stamp 跨度 %.3f s' % (max(ts) - min(ts)))
        for k, m in self.msg.items():
            if k == 'cloud':
                pts = list(pc2.read_points(m, field_names=('x', 'y', 'z')))
                with open(f'{OUT}/cloud_{i:04d}.ply', 'w') as f:
                    f.write(f"ply\nformat ascii 1.0\nelement vertex {len(pts)}\n"
                            "property float x\nproperty float y\nproperty float z\nend_header\n")
                    for p in pts:
                        f.write(f"{p[0]:.6f} {p[1]:.6f} {p[2]:.6f}\n")
            else:
                cv2.imwrite(f'{OUT}/{k}_{i:04d}.png', self.to_bgr(m))

rclpy.init(); n = G(); i = 0
while input('摆好场景回车存一帧(q 退出): ').strip() != 'q':
    for _ in range(5): rclpy.spin_once(n, timeout_sec=0.1)
    i += 1; n.save(i)

两点别踩:原图/矫正图是 1280×1088,深度和点云是网络内部尺寸(640×352 量级),点云本身就是米制左目坐标,别拿 1280×1088 的内参去反投影它;判断是否同帧看上面打印的 stamp 跨度,几十毫秒内才算同一帧。

你仔细看下面这个方法,特别是https://github.com/D-Robotics/hobot_stereonet/blob/tros_2.5.5/script/run_stereo.sh 上的内容,再重新提供用我新标定结果采集图片生成点云和原始左右图和矫正后左图,要怎么做?
:
自标定用 calib_method:=custom、stereo_calib_file_path:=标定文件绝对路径;输入原图时关闭 GDC,不必等当前未发布的 camera_info 话题。

YAML 用 OpenCV FileStorage 格式,并保留完整的 5 个畸变系数,别截掉 k3。运行时图像方向须与标定一致。

正常出深度后,执行 ros2 param set /StereoNetNode save_result_once true,可保存该次处理的矫正图、深度和点云;还要保存原图时启用 publish_origin_enable:=True。

2.5.5 官方脚本:https://github.com/D-Robotics/hobot_stereonet/blob/tros_2.5.5/script/run_stereo.sh
[/quote]

先纠正我上一轮的一个说法:给 2.5.5 的 stereo_calib_file_path 时,以 OpenCV FileStorage(%YAML:1.0 + !!opencv-matrix)这种结构为准,畸变写满 5 个;我上次给的 kalibr cam0/cam1 + 4 系数是 AMR 文档里 kalibr 的产出格式,不是这个参数唯一能读的东西,按 kalibr 写会导致 init StereoRectify 直接 exit code -11。

run_stereo.sh 本身不神秘:它一次拉起 mipi_cam → hobot_codec → stereonet_model_node(+ websocket),其中 --stereo_calib_file_path 是传给 stereonet_model_node 的,不是给 mipi_cam 的(mipi_cam 那条叫 camera_calibration_file_path,两条别混)。你要的四件套就是这条链路跑起来后触发一次保存。

1. 写标定文件(数值直接抄你 66981 那次旋转后的结果,顺序是 k1,k2,p1,p2,k3,T 必须是 3×1、单位米)

%YAML:1.0
---
image_width: 1280
image_height: 1088
left_camera_matrix: !!opencv-matrix
  rows: 3
  cols: 3
  dt: d
  data: [664.63469876, 0, 639.41814797, 0, 664.5063645, 541.63896472, 0, 0, 1]
left_distortion_coefficients: !!opencv-matrix
  rows: 1
  cols: 5
  dt: d
  data: [-0.329345322, 0.137608022, 5.53902581e-05, -2.83585909e-05, -0.0302146722]
right_camera_matrix: !!opencv-matrix
  rows: 3
  cols: 3
  dt: d
  data: [664.69555993, 0, 638.96998159, 0, 664.43433026, 542.55599486, 0, 0, 1]
right_distortion_coefficients: !!opencv-matrix
  rows: 1
  cols: 5
  dt: d
  data: [-0.317217218, 0.117015378, -2.47865317e-04, 1.81395038e-04, -0.0209041291]
R: !!opencv-matrix
  rows: 3
  cols: 3
  dt: d
  data: [0.99999364, 0.00331003, 0.00132688, -0.00330733, 0.99999247, -0.00203245, -0.0013336, 0.00202805, 0.99999705]
T: !!opencv-matrix
  rows: 3
  cols: 1
  dt: d
  data: [-0.08002304, 0.00019714, 0.00033433]

T 保持负值,别为了“变正”去交换左右;T 用行向量或 3×1 写错是该节点段错误的常见原因。

2. 起链路(只关 GDC、走 custom,不碰 camera_info)

source /opt/tros/humble/setup.bash
cd <含 script/run_stereo.sh 的目录>
bash script/run_stereo.sh \
  --mipi_gdc_enable False \
  --calib_method custom \
  --stereo_calib_file_path /userdata/calib/gs130w_self.yaml

3. 唯一还要盯的前提:运行时朝向 = 标定朝向。 你标定用的是转 90° 后 1280×1088 的单目图;run_stereo.sh 内部是 dual_combine 横向拼,跟你之前手动 dual_combine:=2 上下拼 + 自己切分不是一回事。如果它给到 stereonet 的单目尺寸不是 1280×1088,或者转的方向和你标定时相反,极线就校不正、深度整片偏。启动后先看这几行日志:

=> load stereo calib from: /userdata/calib/gs130w_self.yaml
=> sub rectified [fx, fy, cx, cy, baseline(m), doffs] : [..., 0.0800..., ...]
=> HFOV: ...°, VFOV: ...°

baseline 约 0.0800 m、fx 按模型输入宽度等比缩放(1280 宽时 664 左右,640 宽时约 332)才算读到了你的文件。你的 2.5.7+ 脚本里若带 --epipolar_mode True --chessboard_per_rows 11 --chessboard_per_cols 8 --chessboard_square_size 0.03,可以用它先看极线误差是否 < 1 px 再出深度;2.5.5 脚本里没这个选项就跳过,直接看 result/ 下的 rectify 图。

4. 存单帧四件套:起节点时加原图输出开关,正常出深度后触发一次保存

ros2 param list /StereoNetNode | grep -iE "save|origin"   # 本机实际参数名,节点启动日志里也会整组打印
ros2 param set /StereoNetNode save_result_once true

结果默认落在启动目录下的 result/(想换目录改 save_dir):这次处理的矫正图、深度、点云 pcd,配原图开关再带上左右原图。点云是左目坐标系、网络输入分辨率(640×352 量级),别拿 1280×1088 的 K 去反投影它。

先跑第 2 步,把 load stereo calib、sub rectified 那两行和单目尺寸贴上来,就能确认方向是否一致、要不要再加旋转参数。

附件已按40楼的新标定配好,5个畸变系数全部保留,文件用2.5.5实际读取的 cam0/cam1 格式。

先走原生离线处理:解压到X5的 ~/,新采图沿用40楼的方向和左右顺序,将已转正的1280×1088原图放入包内 input,命名 left_0001.png、right_0001.png,执行:

cd ~/stereo_selfcal_35802
bash run.sh

结果在新建的 result_...:同编号的 origin_L/R 是校正前图,left.png 是矫正左图,另有深度图和有效点云PCD;同编号对应同一对输入,原始PNG仍保留在 input。

stereo_selfcal_35802_20261022.zip (5.5 KB)

官方脚本:https://github.com/D-Robotics/hobot_stereonet/blob/tros_2.5.5/script/run_stereo.sh

@fxxxxxxxxxxxxx 可以参考一下这个方案。


X5里面说没有这个路径,我没加空格,英文输入法输入的

在 Linux 系统 ~/ 一般代表你的账号根目录 root 账号就是 root/ ,sunrise 就是 home/sunrise /

报“没有这个路径”基本不是输入法问题,而是这个目录在当前这个账号的 home 下确实不存在:~/ 只等于当前登录账号的 home(sunrise 是 /home/sunrise,root 是 /root),而压缩包很可能还在下载目录或压根没解压。先确认在哪、再解压:

whoami; echo $HOME; ls -l $HOME
find $HOME -maxdepth 4 -iname "*stereo_selfcal*" -o -maxdepth 4 -name "run.sh" 2>/dev/null
  • find 只找到 .zip(常见在 ~/Downloads 或 ~/下载):解压到 home,解压后才会出现 stereo_selfcal_35802/:
cd ~
unzip -o ~/Downloads/stereo_selfcal_35802*.zip -d ~
ls -l ~/stereo_selfcal_35802
  • find 找到的是更深的路径(比如 ~/stereo_selfcal_35802/stereo_selfcal_35802):说明解压过一层,多进一层即可,或者把内层目录移到 home。
  • whoami 是 root 而文件在 /home/sunrise 下:两者 home 不同,直接用绝对路径,或先 cd /home/sunrise。

进去后确认这四样在:run.sh、calib.yaml、check_inputs.py、input/(input 里放 left_0001.png、right_0001.png,1280×1088、按 40 楼那个方向转正的图),然后在本目录执行:

cd ~/stereo_selfcal_35802
ls input
bash run.sh

注意别用 sudo bash run.sh,那样 ~ 会变成 root 的 home,又会指向错的地方。把上面 whoami/echo $HOME 和 find 的输出贴一下,我据此确认路径该落在哪。

用你这边上传的左右原图,实际跑了 2.5.5 的自标定校正、BPU 推理和单帧保存:

  • 连续两次成功保存原图、校正图、深度、视差和 PCD。
  • 每组点云 56,320 点,点云与深度对应检查通过。
  • 保存后的左右校正图,棋盘角点行误差 RMS 约 0.086 像素。

forum-35802-stereonet255-under10MB.zip (6.5 MB)

(帖子已被作者删除)

好的,sunrise@ubuntu:~/stereo_selfcal_35802$ bash run.sh
标定读取/几何检查通过,标定基线80.024 mm
检查通过: 1对1280x1088图;未修改、旋转或交换输入图片
输出目录: /home/sunrise/stereo_selfcal_35802/result_20000101_140 302_155021
不启动相机,不改变采集参数。等save result日志和所需文件写完后,C trl+C结束。


1.之后在哪调用本机官方run_stereo.sh呢?
sunrise@ubuntu:~/stereo_selfcal_35802$ run_stereo.sh
-bash: run_stereo.sh: command not found

2.以及’结果写到本包目录下新建的result_日期_时间_进程号‘运行run_stereo.sh是自动输出结果吗?如果是要手动保存要怎么保存呢?

3.image
这个是什么包呢?

44楼的 run.sh 已经调用官方 run_stereo.sh,不用再单独敲它。

当前是自动保存:input 里一对图,正常就输出一组到日志里的 result_...,不用手动触发。等看到 save result to ...、所需文件写完再结束;你贴的几行还只是前置检查。

若随后直接退出且结果目录为空,执行下面两行,把 run_trace.log 发来:

cd /home/sunrise/stereo_selfcal_35802 &&
bash -x run.sh 2>&1 | tee run_trace.log

50楼的6.5MB包是实时采集、按次保存的脚本和回放测试结果,不是系统安装包。先继续用44楼这套即可。

好的,run_trace.log如下:
sunrise@ubuntu:~/stereo_selfcal_35802$ bash -x run.sh 2>&1 | tee run_trace.log

  • set -e
    +++ dirname – run.sh
    ++ CDPATH=
    ++ cd – .
    ++ pwd
  • task_dir=/home/sunrise/stereo_selfcal_35802
  • case “$task_dir” in
  • ‘[’ ‘!’ -r /opt/tros/humble/setup.bash ‘]’
  • source /opt/tros/humble/setup.bash
    ++ AMENT_SHELL=bash
    ++++ dirname /opt/tros/humble/setup.bash
    +++ builtin cd /opt/tros/humble
    +++ pwd
    ++ AMENT_CURRENT_PREFIX=/opt/tros/humble
    ++ ‘[’ -n ‘’ ‘]’
    ++ . /opt/tros/humble/setup.sh
    +++ AMENT_CURRENT_PREFIX_TROS=/opt/tros/humble
    +++ AMENT_SHELL_TROS=bash
    +++ AMENT_CURRENT_PREFIX=/opt/ros/humble
    +++ ‘[’ -f /opt/ros/humble/setup.sh ‘]’
    +++ . /opt/ros/humble/setup.sh
    ++++ : /opt/ros/humble
    ++++ : bash
    ++++ _prefix_setup_IFS=’
    ’
    ++++ IFS=’
    ’
    ++++ _UNIQUE_PREFIX_PATH=
    ++++ ‘[’ -z SKIP_PARENT_PREFIX_PATH ‘]’
    ++++ ament_append_unique_value _UNIQUE_PREFIX_PATH /opt/ros/humble
    ++++ _listname=_UNIQUE_PREFIX_PATH
    ++++ _value=/opt/ros/humble
    ++++ eval ‘_values=$_UNIQUE_PREFIX_PATH’
    +++++ _values=
    ++++ _duplicate=
    ++++ _ament_append_unique_value_IFS=’
    ’
    ++++ IFS=:
    ++++ ‘[’ bash = zsh ‘]’
    ++++ unset _item
    ++++ ‘[’ -z ‘’ ‘]’
    ++++ ‘[’ -z ‘’ ‘]’
    ++++ eval ‘_UNIQUE_PREFIX_PATH=“/opt/ros/humble”’
    +++++ _UNIQUE_PREFIX_PATH=/opt/ros/humble
    ++++ IFS=’
    ’
    ++++ unset _ament_append_unique_value_IFS
    ++++ unset _duplicate
    ++++ unset _values
    ++++ unset _value
    ++++ unset _listname
    ++++ unset AMENT_CURRENT_PREFIX
    ++++ _prefix_setup_AMENT_SHELL=bash
    ++++ IFS=:
    ++++ ‘[’ bash = zsh ‘]’
    ++++ for _path in $_UNIQUE_PREFIX_PATH
    ++++ ‘[’ -n ‘’ ‘]’
    ++++ ‘[’ -f /opt/ros/humble/local_setup.bash ‘]’
    ++++ ‘[’ bash = sh ‘]’
    ++++ IFS=’
    ’
    ++++ . /opt/ros/humble/local_setup.bash
    +++++ AMENT_SHELL=bash
    +++++++ dirname /opt/ros/humble/local_setup.bash
    ++++++ builtin cd /opt/ros/humble
    ++++++ pwd
    +++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
    +++++ ‘[’ -n ‘’ ‘]’
    +++++ . /opt/ros/humble/local_setup.sh
    ++++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/ros/humble
    ++++++ ‘[’ -z /opt/ros/humble ‘]’
    ++++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/ros/humble
    ++++++ : bash
    ++++++ _ament_python_executable=/usr/bin/python3
    ++++++ ‘[’ -n ‘’ ‘]’
    ++++++ ‘[’ ‘!’ -f /usr/bin/python3 ‘]’
    ++++++ _ament_additional_extension=
    ++++++ ‘[’ bash ‘!=’ sh ‘]’
    ++++++ _ament_additional_extension=bash
    +++++++ /usr/bin/python3 /opt/ros/humble/_local_setup_util.py sh bash
    ++++++ _ament_ordered_commands='AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash”
    AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh”
    export ROS_DISTRO=“humble”

export ROS_LOCALHOST_ONLY=“0”

export ROS_PYTHON_VERSION=“3”
export ROS_VERSION=“2”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash”’
++++++ unset _ament_additional_extension
++++++ unset _ament_python_executable
++++++ ‘[’ -n ‘’ ‘]’
++++++ eval 'AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh”
export ROS_DISTRO=“humble”

export ROS_LOCALHOST_ONLY=“0”

export ROS_PYTHON_VERSION=“3”
export ROS_VERSION=“2”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash”’
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash
+++++++ ‘[’ -f /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash
++++++++ type register-python-argcomplete3
+++++++++ register-python-argcomplete3 ros2
++++++++ eval ’
_python_argcomplete() {
local IFS=$‘'’\013’'’
local SUPPRESS_SPACE=0
if compopt +o nospace 2> /dev/null; then
SUPPRESS_SPACE=1
fi
COMPREPLY=( $(IFS=“$IFS”
COMP_LINE=“$COMP_LINE”
COMP_POINT=“$COMP_POINT”
COMP_TYPE=“$COMP_TYPE”
_ARGCOMPLETE_COMP_WORDBREAKS=“$COMP_WORDBREAKS”
_ARGCOMPLETE=1
_ARGCOMPLETE_SUPPRESS_SPACE=$SUPPRESS_SPACE
“$1” 8>&1 9>&2 1>/dev/null 2>/dev/null) )
if [[ $? != 0 ]]; then
unset COMPREPLY
elif [[ $SUPPRESS_SPACE == 1 ]] && [[ “$COMPREPLY” =~ [=/:]$ ]]; then
compopt -o nospace
fi
}
complete -o nospace -o default -F _python_argcomplete “ros2”’
+++++++++ complete -o nospace -o default -F _python_argcomplete ros2
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh
+++++++ ‘[’ -f /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh
++++++++ ‘[’ -n humble -a humble ‘!=’ humble ‘]’
+++++++ export ROS_DISTRO=humble
+++++++ ROS_DISTRO=humble
+++++++ export ROS_PYTHON_VERSION=3
+++++++ ROS_PYTHON_VERSION=3
+++++++ export ROS_VERSION=2
+++++++ ROS_VERSION=2
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash
+++++++ ‘[’ -f /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash
++++++++ type register-python-argcomplete3
+++++++++ register-python-argcomplete3 rosidl
++++++++ eval ’
_python_argcomplete() {
local IFS=$‘'’\013’'’
local SUPPRESS_SPACE=0
if compopt +o nospace 2> /dev/null; then
SUPPRESS_SPACE=1
fi
COMPREPLY=( $(IFS=“$IFS”
COMP_LINE=“$COMP_LINE”
COMP_POINT=“$COMP_POINT”
COMP_TYPE=“$COMP_TYPE”
_ARGCOMPLETE_COMP_WORDBREAKS=“$COMP_WORDBREAKS”
_ARGCOMPLETE=1
_ARGCOMPLETE_SUPPRESS_SPACE=$SUPPRESS_SPACE
“$1” 8>&1 9>&2 1>/dev/null 2>/dev/null) )
if [[ $? != 0 ]]; then
unset COMPREPLY
elif [[ $SUPPRESS_SPACE == 1 ]] && [[ “$COMPREPLY” =~ [=/:]$ ]]; then
compopt -o nospace
fi
}
complete -o nospace -o default -F _python_argcomplete “rosidl”’
+++++++++ complete -o nospace -o default -F _python_argcomplete rosidl
++++++ unset _ament_ordered_commands
++++++ unset _ament_prefix_sh_source_script
++++++ unset _ament_prefix_sh_AMENT_CURRENT_PREFIX
++++ AMENT_SHELL=bash
++++ unset _path
++++ IFS=’
’
++++ unset _prefix_setup_IFS
++++ unset _prefix_setup_AMENT_SHELL
++++ unset _UNIQUE_PREFIX_PATH
++++ unset AMENT_SHELL
+++ AMENT_CURRENT_PREFIX=/opt/tros/humble
+++ AMENT_SHELL=bash
+++ unset AMENT_CURRENT_PREFIX_TROS
+++ unset AMENT_SHELL_TROS
+++ export TROS_DISTRO=humble
+++ TROS_DISTRO=humble
+++ : /opt/tros/humble
+++ : bash
+++ _prefix_setup_IFS=’
’
+++ IFS=’
’
+++ _UNIQUE_PREFIX_PATH=
+++ ‘[’ -z SKIP_PARENT_PREFIX_PATH ‘]’
+++ ament_append_unique_value _UNIQUE_PREFIX_PATH /opt/tros/humble
+++ _listname=_UNIQUE_PREFIX_PATH
+++ _value=/opt/tros/humble
+++ eval ‘_values=$_UNIQUE_PREFIX_PATH’
++++ _values=
+++ _duplicate=
+++ _ament_append_unique_value_IFS=’
’
+++ IFS=:
+++ ‘[’ bash = zsh ‘]’
+++ unset _item
+++ ‘[’ -z ‘’ ‘]’
+++ ‘[’ -z ‘’ ‘]’
+++ eval ‘_UNIQUE_PREFIX_PATH=“/opt/tros/humble”’
++++ _UNIQUE_PREFIX_PATH=/opt/tros/humble
+++ IFS=’
’
+++ unset _ament_append_unique_value_IFS
+++ unset _duplicate
+++ unset _values
+++ unset _value
+++ unset _listname
+++ unset AMENT_CURRENT_PREFIX
+++ _prefix_setup_AMENT_SHELL=bash
+++ IFS=:
+++ ‘[’ bash = zsh ‘]’
+++ for _path in $_UNIQUE_PREFIX_PATH
+++ ‘[’ -n ‘’ ‘]’
+++ ‘[’ -f /opt/tros/humble/local_setup.bash ‘]’
+++ ‘[’ bash = sh ‘]’
+++ IFS=’
’
+++ . /opt/tros/humble/local_setup.bash
++++ AMENT_SHELL=bash
++++++ dirname /opt/tros/humble/local_setup.bash
+++++ builtin cd /opt/tros/humble
+++++ pwd
++++ AMENT_CURRENT_PREFIX=/opt/tros/humble
++++ ‘[’ -n ‘’ ‘]’
++++ . /opt/tros/humble/local_setup.sh
+++++ AMENT_CURRENT_PREFIX_TROS=/opt/tros/humble
+++++ AMENT_SHELL_TROS=bash
+++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++ ‘[’ -f /opt/ros/humble/local_setup.sh ‘]’
+++++ . /opt/ros/humble/local_setup.sh
++++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/ros/humble
++++++ ‘[’ -z /opt/ros/humble ‘]’
++++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/ros/humble
++++++ : bash
++++++ _ament_python_executable=/usr/bin/python3
++++++ ‘[’ -n ‘’ ‘]’
++++++ ‘[’ ‘!’ -f /usr/bin/python3 ‘]’
++++++ _ament_additional_extension=
++++++ ‘[’ bash ‘!=’ sh ‘]’
++++++ _ament_additional_extension=bash
+++++++ /usr/bin/python3 /opt/ros/humble/_local_setup_util.py sh bash
++++++ _ament_ordered_commands='AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh”
export ROS_DISTRO=“humble”

export ROS_LOCALHOST_ONLY=“0”

export ROS_PYTHON_VERSION=“3”
export ROS_VERSION=“2”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash”’
++++++ unset _ament_additional_extension
++++++ unset _ament_python_executable
++++++ ‘[’ -n ‘’ ‘]’
++++++ eval 'AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh”
export ROS_DISTRO=“humble”

export ROS_LOCALHOST_ONLY=“0”

export ROS_PYTHON_VERSION=“3”
export ROS_VERSION=“2”
AMENT_CURRENT_PREFIX=“/opt/ros/humble” _ament_prefix_sh_source_script “/opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash”’
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash
+++++++ ‘[’ -f /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/ros2cli/environment/ros2-argcomplete.bash
++++++++ type register-python-argcomplete3
+++++++++ register-python-argcomplete3 ros2
++++++++ eval ’
_python_argcomplete() {
local IFS=$‘'’\013’'’
local SUPPRESS_SPACE=0
if compopt +o nospace 2> /dev/null; then
SUPPRESS_SPACE=1
fi
COMPREPLY=( $(IFS=“$IFS”
COMP_LINE=“$COMP_LINE”
COMP_POINT=“$COMP_POINT”
COMP_TYPE=“$COMP_TYPE”
_ARGCOMPLETE_COMP_WORDBREAKS=“$COMP_WORDBREAKS”
_ARGCOMPLETE=1
_ARGCOMPLETE_SUPPRESS_SPACE=$SUPPRESS_SPACE
“$1” 8>&1 9>&2 1>/dev/null 2>/dev/null) )
if [[ $? != 0 ]]; then
unset COMPREPLY
elif [[ $SUPPRESS_SPACE == 1 ]] && [[ “$COMPREPLY” =~ [=/:]$ ]]; then
compopt -o nospace
fi
}
complete -o nospace -o default -F _python_argcomplete “ros2”’
+++++++++ complete -o nospace -o default -F _python_argcomplete ros2
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh
+++++++ ‘[’ -f /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/ros_environment/environment/0.ros_distro_check.sh
++++++++ ‘[’ -n humble -a humble ‘!=’ humble ‘]’
+++++++ export ROS_DISTRO=humble
+++++++ ROS_DISTRO=humble
+++++++ export ROS_PYTHON_VERSION=3
+++++++ ROS_PYTHON_VERSION=3
+++++++ export ROS_VERSION=2
+++++++ ROS_VERSION=2
+++++++ AMENT_CURRENT_PREFIX=/opt/ros/humble
+++++++ _ament_prefix_sh_source_script /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash
+++++++ ‘[’ -f /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash ‘]’
+++++++ ‘[’ -n ‘’ ‘]’
+++++++ . /opt/ros/humble/share/rosidl_cli/environment/rosidl-argcomplete.bash
++++++++ type register-python-argcomplete3
+++++++++ register-python-argcomplete3 rosidl
++++++++ eval ’
_python_argcomplete() {
local IFS=$‘'’\013’'’
local SUPPRESS_SPACE=0
if compopt +o nospace 2> /dev/null; then
SUPPRESS_SPACE=1
fi
COMPREPLY=( $(IFS=“$IFS”
COMP_LINE=“$COMP_LINE”
COMP_POINT=“$COMP_POINT”
COMP_TYPE=“$COMP_TYPE”
_ARGCOMPLETE_COMP_WORDBREAKS=“$COMP_WORDBREAKS”
_ARGCOMPLETE=1
_ARGCOMPLETE_SUPPRESS_SPACE=$SUPPRESS_SPACE
“$1” 8>&1 9>&2 1>/dev/null 2>/dev/null) )
if [[ $? != 0 ]]; then
unset COMPREPLY
elif [[ $SUPPRESS_SPACE == 1 ]] && [[ “$COMPREPLY” =~ [=/:]$ ]]; then
compopt -o nospace
fi
}
complete -o nospace -o default -F _python_argcomplete “rosidl”’
+++++++++ complete -o nospace -o default -F _python_argcomplete rosidl
++++++ unset _ament_ordered_commands
++++++ unset _ament_prefix_sh_source_script
++++++ unset _ament_prefix_sh_AMENT_CURRENT_PREFIX
+++++ AMENT_CURRENT_PREFIX=/opt/tros/humble
+++++ AMENT_SHELL=bash
+++++ unset AMENT_CURRENT_PREFIX_TROS
+++++ unset AMENT_SHELL_TROS
+++++ export TROS_DISTRO=humble
+++++ TROS_DISTRO=humble
+++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/tros/humble
+++++ ‘[’ -z /opt/tros/humble ‘]’
+++++ _ament_prefix_sh_AMENT_CURRENT_PREFIX=/opt/tros/humble
+++++ : bash
+++++ _ament_python_executable=/usr/bin/python3
+++++ ‘[’ -n ‘’ ‘]’
+++++ ‘[’ ‘!’ -f /usr/bin/python3 ‘]’
+++++ _ament_additional_extension=
+++++ ‘[’ bash ‘!=’ sh ‘]’
+++++ _ament_additional_extension=bash
++++++ /usr/bin/python3 /opt/tros/humble/_local_setup_util.py sh bash
+++++ _ament_ordered_commands=
+++++ unset _ament_additional_extension
+++++ unset _ament_python_executable
+++++ ‘[’ -n ‘’ ‘]’
+++++ eval ‘’
+++++ unset _ament_ordered_commands
+++++ unset _ament_prefix_sh_source_script
+++++ unset _ament_prefix_sh_AMENT_CURRENT_PREFIX
+++ AMENT_SHELL=bash
+++ unset _path
+++ IFS=’
’
+++ unset _prefix_setup_IFS
+++ unset _prefix_setup_AMENT_SHELL
+++ unset _UNIQUE_PREFIX_PATH
+++ unset AMENT_SHELL
++ ros2 pkg prefix hobot_stereonet

  • package_prefix=/opt/tros/humble
  • runner=/opt/tros/humble/share/hobot_stereonet/script/run_stereo.sh
  • ‘[’ ‘!’ -r /opt/tros/humble/share/hobot_stereonet/script/run_stereo.sh ‘]’
  • ‘[’ ‘!’ -r /opt/tros/humble/share/hobot_stereonet/config/DStereoV2.4_int16.bin ‘]’
  • ros2 node list
  • grep -qx /StereoNetNode
  • python3 /home/sunrise/stereo_selfcal_35802/check_inputs.py
    标定读取/几何检查通过,标定基线80.024 mm
    检查通过: 1对1280x1088图;未修改、旋转或交换输入图片
    ++ date +%Y%m%d_%H%M%S
  • output_dir=/home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324
  • mkdir -p /home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324
  • cd /home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324
  • echo ‘输出目录: /home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324’
    输出目录: /home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324
  • echo ‘不启动相机,不改变采集参数。等save result日志和所需文件写完后,Ctrl+C结束。’
    不启动相机,不改变采集参数。等save result日志和所需文件写完后,Ctrl+C结束。
  • exec bash /opt/tros/humble/share/hobot_stereonet/script/run_stereo.sh --stereonet_version v2.4_int16 --use_mipi_cam False --use_local_image_flag True --local_image_dir /home/sunrise/stereo_selfcal_35802/input --calib_method custom --stereo_calib_file_path /home/sunrise/stereo_selfcal_35802/calib.yaml --stereonet_pub_web False --publish_origin_enable True --publish_pcd_enabled True --publish_visual_enabled False --infer_thread_num 2 --save_thread_num 1 --save_result_flag True --save_dir /home/sunrise/stereo_selfcal_35802/result_20000101_143456_169324 --save_freq 1 --save_total -1 --save_stereo_flag True --save_origin_flag True --save_depth_flag True --save_pcd_flag True --save_disp_flag False --save_visual_flag False
    /opt/tros/humble
    /opt/tros/humble
    [INFO] [launch]: All log files can be found below /home/sunrise/.ros/log/2000-01-01-14-35-01-990634-ubuntu-169455
    [INFO] [launch]: Default logging verbosity is set to INFO
    config_file_path is /opt/tros/humble/lib/mipi_cam/config/
    Hobot shm pkg enables zero-copy with fastrtps profiles file: /opt/tros/humble/lib/hobot_shm/config/shm_fastdds.xml
    Hobot shm pkg sets RMW_FASTRTPS_USE_QOS_FROM_XML: 1
    env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
    webserver has launch
    config_file_path is /opt/tros/humble/lib/mipi_cam/config/
    env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
    env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
    webserver has launch
    [INFO] [stereonet_model_node-1]: process started with pid [169470]
    [stereonet_model_node-1] [ERROR] [0946708502.748257584] [rclcpp]: rcl context unexpectedly not shutdown during cleanup
    [stereonet_model_node-1] terminate called after throwing an instance of ‘rclcpp::exceptions::RCLError’
    [stereonet_model_node-1] what(): failed to configure logging: Failed to create log directory: /userdata/.roslog, at ./src/rcl_logging_spdlog.cpp:90
    [ERROR] [stereonet_model_node-1]: process has died [pid 169470, exit code -6, cmd ‘/opt/tros/humble/lib/hobot_stereonet/stereonet_model_node --ros-args --log-level info --ros-args -r __node:=StereoNetNode --params-file /tmp/launch_params_zttbvwh8’].

卡在日志目录创建,算法节点因此退出了。2.5.5的启动文件把目录写死为 /userdata/.roslog,先建好并让当前账号可写,再重跑:

sudo install -d -m 755 -o "$(id -u)" -g "$(id -g)" /userdata/.roslog &&
cd /home/sunrise/stereo_selfcal_35802 && bash run.sh

官方对应代码:https://github.com/D-Robotics/hobot_stereonet/blob/tros_2.5.5/launch/stereonet_model_web_visual.launch.py#L29

好的,这次能生成点云等多个文件,但是生成了之后就一直停在这里不退出:
sunrise@ubuntu:~/stereo_selfcal_35802$ cd /home/sunrise/stereo_selfcal_35802 && bash run.sh
标定读取/几何检查通过,标定基线80.024 mm
检查通过: 1对1280x1088图;未修改、旋转或交换输入图片
输出目录: /home/sunrise/stereo_selfcal_35802/result_20000101_145557_179010
不启动相机,不改变采集参数。等save result日志和所需文件写完后,Ctrl+C结束。
/opt/tros/humble
/opt/tros/humble
[INFO] [launch]: All log files can be found below /home/sunrise/.ros/log/2000-01-01-14-56-02-749975-ubuntu-179148
[INFO] [launch]: Default logging verbosity is set to INFO
config_file_path is /opt/tros/humble/lib/mipi_cam/config/
Hobot shm pkg enables zero-copy with fastrtps profiles file: /opt/tros/humble/lib/hobot_shm/config/shm_fastdds.xml
Hobot shm pkg sets RMW_FASTRTPS_USE_QOS_FROM_XML: 1
env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
webserver has launch
config_file_path is /opt/tros/humble/lib/mipi_cam/config/
env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
env of RMW_FASTRTPS_USE_QOS_FROM_XML is 1 , ignore env setting
webserver has launch
[INFO] [stereonet_model_node-1]: process started with pid [179163]
[stereonet_model_node-1] [WARN] [0946709764.846456353] [StereoNetNode]: => ===================== init StereoNetNode =====================
[stereonet_model_node-1]
[stereonet_model_node-1] [WARN] [0946709764.853812436] [StereoNetNode]: => -------- init StereoRectify------------------
[stereonet_model_node-1] [WARN] [0946709764.854583561] [StereoNetNode]: => load stereo calib from: /home/sunrise/stereo_selfcal_35802/calib.yaml
[stereonet_model_node-1] [WARN] [0946709764.855313936] [StereoNetNode]: => Kl:
[stereonet_model_node-1] [664.63469876, 0, 639.4181479699999;
[stereonet_model_node-1] 0, 664.5063645, 541.63896472;
[stereonet_model_node-1] 0, 0, 1]
[stereonet_model_node-1] [WARN] [0946709764.855403394] [StereoNetNode]: => Dl:
[stereonet_model_node-1] [-0.329345322, 0.137608022, 5.53902581e-05, -2.83585909e-05, -0.0302146722]
[stereonet_model_node-1] [WARN] [0946709764.855478436] [StereoNetNode]: => Kr:
[stereonet_model_node-1] [664.6955599299999, 0, 638.96998159;
[stereonet_model_node-1] 0, 664.43433026, 542.5559948600001;
[stereonet_model_node-1] 0, 0, 1]
[stereonet_model_node-1] [WARN] [0946709764.855540811] [StereoNetNode]: => Dr:
[stereonet_model_node-1] [-0.317217218, 0.117015378, -0.000247865317, 0.000181395038, -0.0209041291]
[stereonet_model_node-1] [WARN] [0946709764.855611311] [StereoNetNode]: => R_rl:
[stereonet_model_node-1] [0.99999364, 0.00331003, 0.00132688;
[stereonet_model_node-1] -0.00330733, 0.99999247, -0.00203245;
[stereonet_model_node-1] -0.0013336, 0.00202805, 0.9999970500000001]
[stereonet_model_node-1] [WARN] [0946709764.855667686] [StereoNetNode]: => t_rl:
[stereonet_model_node-1] [-0.08002304;
[stereonet_model_node-1] 0.00019714;
[stereonet_model_node-1] 0.00033433]
[stereonet_model_node-1] [WARN] [0946709764.855720769] [StereoNetNode]: => cam0_resolution: [1280, 1088]
[stereonet_model_node-1] [WARN] [0946709764.855763311] [StereoNetNode]: => cam0_distortion_model: radtan
[stereonet_model_node-1] [WARN] [0946709764.855830311] [StereoNetNode]: => alpha: 0
[stereonet_model_node-1] [WARN] [0946709764.855872519] [StereoNetNode]: => ---------------------------------------------
[stereonet_model_node-1] [WARN] [0946709764.857502811] [StereoNetNode]:
[stereonet_model_node-1] stereonet_model_file_path: /opt/tros/humble/share/hobot_stereonet/config/DStereoV2.4_int16.bin
[stereonet_model_node-1] stereo_image_topic: /image_combine_raw
[stereonet_model_node-1] camera_info_topic: /image_combine_raw/right/camera_info
[stereonet_model_node-1] depth_image_topic: ~/stereonet_depth
[stereonet_model_node-1] depth_camera_info_topic: ~/stereonet_depth/camera_info
[stereonet_model_node-1] rectify_left_image_topic: ~/rectify_left_image
[stereonet_model_node-1] rectify_right_image_topic: ~/rectify_right_image
[stereonet_model_node-1] publish_rectify_bgr: 0
[stereonet_model_node-1] [origin_left_image_topic, origin_right_image_topic, publish_origin_enable]: [~/origin_left_image, ~/origin_right_image, 1]
[stereonet_model_node-1] [pointcloud2_topic, publish_pcd_enabled]: [~/stereonet_pointcloud2, 1]
[stereonet_model_node-1] [visual_image_topic, publish_visual_enabled]: [~/stereonet_visual, 0]
[stereonet_model_node-1] [stereonet_frame_id, stereonet_frame_id_right]: [camera_link, camera_link_right]
[stereonet_model_node-1] uncertainty_th: -0.1
[stereonet_model_node-1] [camera_fx, camera_fy, camera_cx, camera_cy, baseline, doffs]: [0, 0, 0, 0, 0(m)0]
[stereonet_model_node-1] [pointcloud_downsample_step, pointcloud_height_min, pointcloud_height_max, pointcloud_depth_max]: [2, -5(m), 5(m), 5(m)]
[stereonet_model_node-1] [use_local_image_flag, local_image_dir, image_sleep]: [1, /home/sunrise/stereo_selfcal_35802/input, 0]
[stereonet_model_node-1] [save_result_flag, save_dir, save_freq, save_total, save_stereo_flag, save_origin_flag, save_disp_flag, save_uncert_flag, save_depth_flag, save_visual_flag, save_pcd_flag]: [1, /home/sunrise/stereo_selfcal_35802/result_20000101_145557_179010, 1, -1, 1, 0, 1, 0, 1, 1, 1]
[stereonet_model_node-1] [calib_method, stereo_calib_file_path]: [custom, /home/sunrise/stereo_selfcal_35802/calib.yaml]
[stereonet_model_node-1] [speckle_filter_enable, max_speckle_size, max_disp_diff]: [0, 100, 1]
[stereonet_model_node-1] [pcl_filter_enable, grid_size, grid_min_point_count]: [0, 0.1, 5]
[stereonet_model_node-1] [render_type, render_perf, depth_decimal_num, render_max_disp, render_z_near, render_z_range]: [distance, 0, 2, 80, -1(m), 3(m)]
[stereonet_model_node-1] left_img_mask_enable: 0
[stereonet_model_node-1] [measure_mode, roi_size, gt_depth]: [0, 10, 0(mm)]
[stereonet_model_node-1] [epipolar_mode, feature_epipolar_mode, epipolar_img, chessboard_per_rows, chessboard_per_cols, chessboard_square_size]: [0, 0, rect, 20, 11, 0.06(m)]
[stereonet_model_node-1] feature_epipolar_mode: 0
[stereonet_model_node-1] post_version: auto
[stereonet_model_node-1] [infer_thread_num, save_thread_num, max_save_task]: [1, 1, 50]
[stereonet_model_node-1]
[stereonet_model_node-1] => ==================================================================
[stereonet_model_node-1]
[stereonet_model_node-1] [BPU_PLAT]BPU Platform Version(1.3.6)! soc info(x5)
[stereonet_model_node-1] [HBRT] set log level as 0. version = 3.15.55.0
[stereonet_model_node-1] [DNN] Runtime version = 1.24.5_(3.15.55 HBRT)
[stereonet_model_node-1] [A][DNN][packed_model.cpp:247]Model [HorizonRT] The model builder version = 1.24.3
[stereonet_model_node-1] [WARN] [0946709765.210485395] [StereoNetNode]: => ============ init model start ============
[stereonet_model_node-1] [WARN] [0946709765.210675103] [StereoNetNode]: => model name: DStereoV2.4.0
[stereonet_model_node-1] [WARN] [0946709765.210738978] [StereoNetNode]: => input_count: 2
[stereonet_model_node-1] [WARN] [0946709765.210790311] [StereoNetNode]: => output_count: 4
[stereonet_model_node-1] [WARN] [0946709765.210864186] [StereoNetNode]: => model_input_h: 352, model_input_w: 640
[stereonet_model_node-1] [WARN] [0946709765.210970645] [StereoNetNode]: => ----- prepare_input_tensor -----
[stereonet_model_node-1] [WARN] [0946709765.211044561] [StereoNetNode]: => input tensor type is HB_DNN_IMG_TYPE_NV12
[stereonet_model_node-1] [WARN] [0946709765.211458811] [StereoNetNode]: => input[0].memsize: 337920
[stereonet_model_node-1] [WARN] [0946709765.212309478] [StereoNetNode]: => ----- prepare_output_tensor -----
[stereonet_model_node-1] [WARN] [0946709765.212479770] [StereoNetNode]: => output tensor type is HB_DNN_TENSOR_TYPE_S32
[stereonet_model_node-1] [WARN] [0946709765.212615103] [StereoNetNode]: => output[0].memsize: 506880
[stereonet_model_node-1] [WARN] [0946709765.214288561] [StereoNetNode]: => ============ init model end ============
[stereonet_model_node-1] [WARN] [0946709765.233797895] [StereoNetNode]: => found 1 image pairs in /home/sunrise/stereo_selfcal_35802/input
[stereonet_model_node-1] [WARN] [0946709765.233949186] [StereoNetNode]: => processing image pair: [/home/sunrise/stereo_selfcal_35802/input/left_0001.png, /home/sunrise/stereo_selfcal_35802/input/right_0001.png]
[stereonet_model_node-1] [WARN] [0946709765.409523936] [StereoNetNode]: => -------- build_undistmap --------------------
[stereonet_model_node-1] [WARN] [0946709765.434881728] [StereoNetNode]: => input_resolution: [1280, 1088]
[stereonet_model_node-1] [WARN] [0946709765.435153145] [StereoNetNode]: => cam_resolution: [1280, 1088]
[stereonet_model_node-1] [WARN] [0946709765.435224603] [StereoNetNode]: => width, height scale: [1, 1]
[stereonet_model_node-1] [WARN] [0946709765.435272895] [StereoNetNode]: => output_resolution: [640, 352]
[stereonet_model_node-1] [WARN] [0946709765.435381478] [StereoNetNode]: => Kl:
[stereonet_model_node-1] [664.63469876, 0, 639.4181479699999;
[stereonet_model_node-1] 0, 664.5063645, 541.63896472;
[stereonet_model_node-1] 0, 0, 1]
[stereonet_model_node-1] [WARN] [0946709765.435448228] [StereoNetNode]: => Dl:
[stereonet_model_node-1] [-0.329345322, 0.137608022, 5.53902581e-05, -2.83585909e-05, -0.0302146722]
[stereonet_model_node-1] [WARN] [0946709765.435521978] [StereoNetNode]: => Kr:
[stereonet_model_node-1] [664.6955599299999, 0, 638.96998159;
[stereonet_model_node-1] 0, 664.43433026, 542.5559948600001;
[stereonet_model_node-1] 0, 0, 1]
[stereonet_model_node-1] [WARN] [0946709765.435596436] [StereoNetNode]: => Dr:
[stereonet_model_node-1] [-0.317217218, 0.117015378, -0.000247865317, 0.000181395038, -0.0209041291]
[stereonet_model_node-1] [WARN] [0946709765.435668936] [StereoNetNode]: => R_rl:
[stereonet_model_node-1] [0.99999364, 0.00331003, 0.00132688;
[stereonet_model_node-1] -0.00330733, 0.99999247, -0.00203245;
[stereonet_model_node-1] -0.0013336, 0.00202805, 0.9999970500000001]
[stereonet_model_node-1] [WARN] [0946709765.435727436] [StereoNetNode]: => t_rl:
[stereonet_model_node-1] [-0.08002304;
[stereonet_model_node-1] 0.00019714;
[stereonet_model_node-1] 0.00033433]
[stereonet_model_node-1] [WARN] [0946709765.435770770] [StereoNetNode]: => distortion_model: radtan
[stereonet_model_node-1] [WARN] [0946709765.435818395] [StereoNetNode]: => alpha: 0
[stereonet_model_node-1] [WARN] [0946709765.435874853] [StereoNetNode]: => rectify fx: 334.578, fy: 334.578, cx: 320.427, cy: 175.692, baseline: 0.080024
[stereonet_model_node-1] [WARN] [0946709765.435917270] [StereoNetNode]: => ---------------------------------------------
[stereonet_model_node-1] [WARN] [0946709765.435994853] [StereoNetNode]: => HFOV: 87.4483°, VFOV: 55.4919°
[stereonet_model_node-1] [WARN] [0946709765.436038770] [StereoNetNode]: => ---------------------------------------------
[stereonet_model_node-1] [WARN] [0946709765.459410728] [StereoNetNode]: => all 1 images in /home/sunrise/stereo_selfcal_35802/input have been processed
[stereonet_model_node-1] [WARN] [0946709765.502275270] [StereoNetNode]: => HFOV: 87.4483°, VFOV: 55.4919°
[stereonet_model_node-1] [WARN] [0946709765.596339395] [StereoNetNode]: => publish result, stamp: 946709765.454557186, fps: 0.00, latency: 141.74 ms, cpu_usage: 0%, bpu_usage: 0%
[stereonet_model_node-1] [WARN] [0946709765.612792603] [StereoNetNode]: => save camera intrinsic to /home/sunrise/stereo_selfcal_35802/result_20000101_145557_179010/camera_intrinsic.txt
[stereonet_model_node-1] [WARN] [0946709765.736830811] [StereoNetNode]: => save result to /home/sunrise/stereo_selfcal_35802/result_20000101_145557_179010, pub count: 0, save count: 0

这是深度图:

而且地瓜的点云算法是不是只支持640×352呢?
裁剪后的图和原始图差距很大,想知道是否先进行了缩小后再裁剪还是直接把12801088裁剪成640352呢?
这是输入图:


原始图:

能否先把12801088等比例缩小为640544或者414.12*352然后在裁剪呢?就是尽可能的多保留点原图

这次已完成推理和保存,节点不会自动退出,文件写完后按 Ctrl+C 就行。

v2.4_int16 模型固定640×352;原图经过畸变/极线校正映射到这个尺寸,不是直接截取中央640×352。日志里的 alpha: 0 会舍弃部分视野。想多保留原图,在 calib.yaml 现有 cam1: 下加一行 alpha: 1.0(缩进两个空格),其余字段保留,再跑 bash run.sh。输出仍为640×352,会有黑边,先不用手动缩图裁图。

深度原PNG是16位毫米值,普通看图发黑不等于没有深度,别转JPG判断。

官方代码:https://github.com/D-Robotics/hobot_stereonet/blob/tros_2.5.5/src/stereo_rectify.cpp#L57