# elevation_net **Repository Path**: seaflyren/elevation_net ## Basic Information - **Project Name**: elevation_net - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-22 - **Last Updated**: 2026-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [English](./README.md) | 简体中文 # 功能介绍 elevation_net package是使用hobot_dnn package开发的高程网络检测算法示例,在地平线X3开发板上使用高程网络模型和室内数据利用BPU处理器进行模型推理。 package可以订阅sensors/msg/Image(encoding必须为“nv12”)类型的话题,检测出Image基于像素的深度和高度信息,同时package将深度和高度信息进行处理,发布为PointCloud2类型的3维点云话题。此package默认读取本地图片进行检测的方式,将AI推理得到的数据信息发布出去。 算法支持的室内环境检测信息如下: ``` 1. 高度 2. 深度 ``` package对外发布包含3D定位信息的发布为PointCloud2类型话题,用户可以订阅发布的PointCloud2数据用于应用开发。 PointCloud2是ROS内置的数据结构,位于sensor_msg内,cloud内每个点云包含x, y, z, height,分别表示点云相对于相机坐标系的三维坐标以及高度信息。 描述如下所示: ```` header: // 点云的头信息 seq: 963 // stamp: // 时间戳 secs: 1653692850 nsecs: 453970527 frame_id: "camera" height: 1 // If the cloud is unordered, height is 1 width: 518400 //点云的长度 fields: // sensor_msgs/PointField[] fields - name: "x" // x轴坐标 offset: 0 datatype: 7 // uint8 INT8 = 1 // uint8 UINT8 = 2 // uint8 INT16 = 3 // uint8 UINT16 = 4 // uint8 INT32 = 5 // uint8 UINT32 = 6 // uint8 FLOAT32 = 7 // uint8 FLOAT64 = 8 count: 1 - name: "y" // y轴坐标 offset: 4 datatype: 7 count: 1 - name: "z" // z轴坐标 offset: 8 datatype: 7 count: 1 - name: height // 高度 offset: 12 datatype: 7 count: 1 is_bigendian: False point_step: 16 // Length of a point in bytes 一个点占的比特数 row_step: 8294400 // Length of a row in bytes 一行的长度占用的比特数 data: [ .......................................................... ] // Actual point data, size is (row_step*height) is_dense: True // 没有非法数据点 ```` # 编译 ## 依赖库 - opencv:3.4.5 ros package: - sensor_msgs - cv_bridge - dnn_node - hbm_img_msgs - ai_msgs 其中cv_bridge为ROS开源的package,需要手动安装,具体安装方法(仅限X3 Ubuntu系统上编译有效): ```cpp # 方法1,直接使用apt安装,以cv_bridge安装举例 sudo apt-get install ros-foxy-cv-bridge -y # 方法2,使用rosdep检查并自动安装pkg编译的依赖项 # 安装ros pkg依赖下载⼯具rosdep sudo apt-get install python3-pip sudo pip install rosdep sudo rosdep init rosdep update # 在ros的⼯程路径下执⾏安装依赖,需要指定pkg所在路径。默认为所有pkg安装依赖,也可以指定为某个pkg安装依赖 rosdep install -i --from-path . --rosdistro foxy -y ``` dnn_node是在地平线X3开发板上利用BPU处理器进行模型推理的pkg,定义在hobot_dnn中。 hbm_img_msgs为自定义的图片消息格式,用于shared mem场景下的图片传输,hbm_img_msgs pkg定义在hobot_msgs中,因此如果使用shared mem进行图片传输,需要下载hobot_msgs。此package示例代码默认使用读取本地图片的方式进行推理,用户可根据需要自行修改。 ai_msgs为自定义的消息格式,用于算法模型推理后,发布推理结果,ai_msgs pkg定义在hobot_msgs中。 ## 开发环境 - 编程语言: C/C++ - 开发平台: X3/X5/X86 - 系统版本:Ubuntu 20.04/Ubuntu 22.04 - 编译工具链:Linux GCC 9.3.0/Linaro GCC 11.4.0 ## 编译 支持在X3/X5 Ubuntu系统上编译和在PC上使用docker交叉编译两种方式。 #### 编译选项 1. CV_BRIDGE_PKG - cv_bridge pkg依赖的使能开关,默认关闭(OFF),编译时使用-DCV_BRIDGE_PKG=ON命令打开。 - 如果打开,编译和运行会依赖cv_bridge pkg,支持使用订阅到的rgb8和nv12格式图片进行模型推理。 - 如果关闭,编译和运行不依赖cv_bridge pkg,只支持使用订阅到的nv12格式图片进行模型推理。 ### Ubuntu板端编译X3版本 1、编译环境确认 - 当前编译终端已设置ROS环境变量:`source /opt/ros/foxy/setup.bash`。 - 已安装ROS2编译工具colcon。安装的ROS不包含编译工具colcon,需要手动安装colcon。colcon安装命令:`apt update; apt install python3-colcon-common-extensions` - 已安装dnn node package - 已安装cv_bridge package(安装方法见Dependency部分) - 已安装ai_msgs 2、编译 - 编译命令:`colcon build --packages-select elevation_net` ### Docker交叉编译X3版本 1. 编译环境确认 - 在docker中编译,并且docker中已经安装好TogetherROS。docker安装、交叉编译说明、TogetherROS编译和部署说明详见机器人开发平台robot_dev_config repo中的README.md。 2. 编译 - 编译命令: ``` export TARGET_ARCH=aarch64 export TARGET_TRIPLE=aarch64-linux-gnu export CROSS_COMPILE=/usr/bin/$TARGET_TRIPLE- colcon build --packages-select elevation_net \ --merge-install \ --cmake-force-configure \ --cmake-args \ --no-warn-unused-cli \ -DCMAKE_TOOLCHAIN_FILE=`pwd`/robot_dev_config/aarch64_toolchainfile.cmake ``` ### X86 Ubuntu系统上编译X86版本 1. 编译环境确认 - x86 ubuntu版本: ubuntu20.04 2. 编译 - 编译命令: ``` colcon build --packages-select elevation_net \ --merge-install \ --cmake-args \ -DPLATFORM_X86=ON \ -DTHIRD_PARTY=`pwd`/../sysroot_docker \ ``` ## 注意事项 # 使用介绍 ## 依赖 - elevation_net package:发布PointCloud2 ## 参数 | 参数名 | 类型 | 解释 | 是否必须 | 支持的配置 | 默认值 | | ---------------------- | ----------- | ------------------------------------------- | -------- | -------------------- | ----------------------------- | | config_file_path | std::string | 推理使用的配置文件路径 | 否 | 根据实际配置文件路径配置 | ./config | | feed_image | std::string | 推理使用的图片 | 否 | 根据实际路径配置 | ./config/images/charging_base.png | ## 运行 编译成功后,将生成的install路径拷贝到地平线X3开发板上(如果是在X3上编译,忽略拷贝步骤),并执行如下命令运行: ### **X3 Ubuntu** 运行方式1,使用ros2 run启动: ``` export COLCON_CURRENT_PREFIX=./install source ./install/setup.bash # config中为示例使用的模型,根据实际安装路径进行拷贝 # 如果是板端编译(无--merge-install编译选项),拷贝命令为cp -r install/PKG_NAME/lib/PKG_NAME/config/ .,其中PKG_NAME为具体的package名。 cp -r install/lib/elevation_net/config/ . # 启动高程网络pkg ros2 run elevation_net elevation_net --ros-args -p config_file_path:=./config -p feed_image:=./config/images/charging_base.png --ros-args --log-level info ``` 运行方式2,使用launch文件启动: ``` export COLCON_CURRENT_PREFIX=./install source ./install/setup.bash # config中为示例使用的模型,根据实际安装路径进行拷贝 # 如果是板端编译(无--merge-install编译选项),拷贝命令为cp -r install/PKG_NAME/lib/PKG_NAME/config/ .,其中PKG_NAME为具体的package名。 cp -r install/lib/elevation_net/config/ . # 启动launch文件 ros2 launch install/share/elevation_net/launch/elevation_net.launch.py ``` ### **X3 Linux** ``` export ROS_LOG_DIR=/userdata/ export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:./install/lib/ # config中为示例使用的模型,根据实际安装路径进行拷贝 cp -r install/lib/elevation_net/config/ . # 启动高程网络检测pkg ./install/lib/elevation_net/elevation_net ``` ### **X86 Ubuntu** ``` export COLCON_CURRENT_PREFIX=./install source ./install/setup.bash # config中为示例使用的模型,根据实际安装路径进行拷贝 cp -r install/lib/elevation_net/config/ . # 启动高程网络检测pkg ./install/lib/elevation_net/elevation_net ``` # 结果分析 ## 结果展示 ``` [16:15:17:520]root@ubuntu:/userdata# ros2 run elevation_net elevation_net [16:15:18:976][WARN] [1655108119.406738772] [example]: This is dnn node example! [16:15:19:056][WARN] [1655108119.475098438] [elevation_dection]: Parameter: [16:15:19:056]config_file_path_:./config [16:15:19:056] model_file_name_: ./config/elevation.hbm [16:15:19:058]feed_image:./config/images/charging_base.png [16:15:19:058][INFO] [1655108119.475257138] [dnn]: Node init. [16:15:19:058][INFO] [1655108119.475309553] [elevation_dection]: Set node para. [16:15:19:058][INFO] [1655108119.475370258] [dnn]: Model init. [16:15:19:058][BPU_PLAT]BPU Platform Version(1.3.1)! [16:15:19:095][HBRT] set log level as 0. version = 3.13.27 [16:15:19:095][DNN] Runtime version = 1.8.4_(3.13.27 HBRT) [16:15:19:133][000:000] (model.cpp:244): Empty desc, model name: elevation, input branch:0, input name:inputquanti-_output [16:15:19:133][000:000] (model.cpp:244): Empty desc, model name: elevation, input branch:1, input name:inputquanti2-_output [16:15:19:134][000:000] (model.cpp:313): Empty desc, model name: elevation, output branch:0, output name:output_block1quanticonvolution0_conv_output [16:15:19:134][INFO] [1655108119.528437276] [dnn]: The model input 0 width is 960 and height is 512 [16:15:19:134][INFO] [1655108119.528535271] [dnn]: The model input 1 width is 960 and height is 512 [16:15:19:134][INFO] [1655108119.528598393] [dnn]: Task init. [16:15:19:135][INFO] [1655108119.530435806] [dnn]: Set task_num [2] [16:15:19:135][INFO] [1655108119.530549051] [elevation_dection]: The model input width is 960 and height is 512 [16:15:19:158][INFO] [1655108119.559583836] [elevation_dection]: read image: ./config/images/charging_base.png to detect [16:15:19:299][WARN] [1655108119.731084555] [elevation_dection]: start success!!! [16:15:19:351][INFO] [1655108119.779924566] [elevation_net_parser]: fx_inv_: 0.000605 [16:15:19:383][INFO] [1655108119.780357879] [elevation_net_parser]: fy_inv_: 0.000604 [16:15:19:383][INFO] [1655108119.780576493] [elevation_net_parser]: cx_inv_: -0.604389 [16:15:19:383][INFO] [1655108119.780654031] [elevation_net_parser]: cy_inv_: -0.318132 [16:15:19:384][INFO] [1655108119.780751527] [elevation_net_parser]: nx_: 0.000000 [16:15:19:384][INFO] [1655108119.780858063] [elevation_net_parser]: ny_: 0.000000 [16:15:19:384][INFO] [1655108119.780962558] [elevation_net_parser]: nz_: 1.000000 [16:15:19:384][INFO] [1655108119.781067928] [elevation_net_parser]: camera_height: 1.000000 [16:15:19:385][INFO] [1655108119.781833267] [elevation_net_parser]: model out width: 480, height: 256 [16:15:19:416][INFO] [1655108119.808395254] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.808593786] [elevation_net_parser]: height: -42.699909 [16:15:19:416][INFO] [1655108119.808644533] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.808692531] [elevation_net_parser]: height: -25.339746 [16:15:19:416][INFO] [1655108119.808739279] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.808785527] [elevation_net_parser]: height: -22.111366 [16:15:19:416][INFO] [1655108119.808832774] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.808878606] [elevation_net_parser]: height: -25.339746 [16:15:19:416][INFO] [1655108119.808925645] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.808971809] [elevation_net_parser]: height: -21.989540 [16:15:19:416][INFO] [1655108119.809017516] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.809063138] [elevation_net_parser]: height: -48.303890 [16:15:19:416][INFO] [1655108119.809109678] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.809155592] [elevation_net_parser]: height: -32.527466 [16:15:19:416][INFO] [1655108119.809202548] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.809247880] [elevation_net_parser]: height: -32.710201 [16:15:19:416][INFO] [1655108119.809294669] [elevation_net_parser]: depth: 998.000000 [16:15:19:416][INFO] [1655108119.809340542] [elevation_net_parser]: height: -33.014767 [16:15:19:417][INFO] [1655108119.809387165] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809433454] [elevation_net_parser]: height: -35.451283 [16:15:19:417][INFO] [1655108119.809480202] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809527158] [elevation_net_parser]: height: -38.192360 [16:15:19:417][INFO] [1655108119.809573906] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809619820] [elevation_net_parser]: height: -34.233025 [16:15:19:417][INFO] [1655108119.809667235] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809713357] [elevation_net_parser]: height: -34.233025 [16:15:19:417][INFO] [1655108119.809759397] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809805686] [elevation_net_parser]: height: -33.014767 [16:15:19:417][INFO] [1655108119.809852643] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809899307] [elevation_net_parser]: height: -34.354851 [16:15:19:417][INFO] [1655108119.809945930] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.809991844] [elevation_net_parser]: height: -35.024891 [16:15:19:417][INFO] [1655108119.810038384] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.810084715] [elevation_net_parser]: height: -41.298916 [16:15:19:417][INFO] [1655108119.810131296] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.810268706] [elevation_net_parser]: height: -33.745720 [16:15:19:417][INFO] [1655108119.810317745] [elevation_net_parser]: depth: 998.000000 [16:15:19:417][INFO] [1655108119.810364285] [elevation_net_parser]: height: -32.710201 [16:15:19:417][INFO] [1655108119.810410741] [elevation_net_parser]: depth: 998.000000 # 常见问题