0x00 往期博文

OriginBot我的第一辆智能小车

使用(PS2)手柄控制OriginBot小车

《HelloOriginBot::使用Python编写Joy手柄功能包》

《深入Originbot:PID人脸追踪》

《App上位机控制OriginBot小车》 

BPU初体验::红绿灯 (精选)

0x01 实验目的

使用 find_object_2d 功能包实现书籍、卡片等2d物品识别;

 

0x02 实验流程

1\ 在开发机上,下载和编译 find_obj_2d 功能包;

2\ OB(OriginBot, 后文同理) 打开 mipi 摄像头发布图像;

3\ 在开发机上订阅 OB 发布的图像;

4\ 在开发机上采集、标定、保存特征;

5\ 在开发机上验证识别效果;

6\ 在OB上安装 find_obj_2d 包; 脱离服务器(开发机)运行;

7\ 在OB上输出位置框、或中心坐标; 进行应用开发;

0x03 开发机上安装 find_obj_2d 功能包

cd ~/ros2_ws
git clone https://github.com/introlab/find-object.git src/find_object_2d
colcon build

添加工作空间环境变量后,执行以下命令测试运行;

ros2 pkg list | grep find_object_2d

若找到该功能包说明安装成功;

0x04 OriginBot 发布图像

ros2 launch originbot_demo camera.launch.py

注: mipi 支持发布 bgr8 和 nv12 格式的图像;  这里我们使用 bgr8;

若 mipi 打开了shared mem 通信方式,则只支持发布 hbmem_img 主题的图片。用于'零拷贝'。

故 image_raw 中无数据, 所以需要把 shared mem 关掉; 改为 mmap 模式。

launch文件配置如下:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='mipi_cam',
            executable='mipi_cam',
            output='screen',
            parameters=[
                {"camera_calibration_file_path": "/opt/tros/lib/mipi_cam/config/GC4663_calibration.yaml"},
                {"out_format": "bgr8"},
                {"image_width": 960},
                {"image_height": 544},
                {"io_method": "mmap"},
                {"video_device": "GC4663"}
            ],
            arguments=['--ros-args', '--log-level', 'error']
        ),
        Node(
            package='originbot_demo',
            executable='transport_img',
            arguments=['--ros-args', '--log-level', 'error']
        ),
    ])

transport_img 压缩图像的用法请参考往期博文:《App上位机控制OriginBot小车》 

0x05 开发机订阅 OB 发布的图像;

订阅OB发布的 /bgr8_image 图像话题;

ros2 run find_object_2d find_object_2d image:=bgr8_image

执行该命令后可在上位机看到OB发来的图像;

0x06 开发机采集、标定、保存特征;

在Objects窗口中右键->选择 add object from scene... (从图像中选择目标)

之后在弹出的窗口中,选择 Take picture 抓取图像,再选择欲识别的2d物品。注意:是2d物品,3d物品识别效果不好;

选取完欲识别的物体后,选择 File -> Save objects, File -> Sace settings,用于下次启动时加载;

Save objects : 保存欲识别2d目标的图片; 

Sace settings : 保存当前软件算子配置;

保存结果如下:

0x07 在开发机上验证识别效果;

find_object_2d 功能包下有 find_object_2d 节点,该节点发布 objects 话题;

检测到的对象格式为[objectId1,objectWidth,objectHeight,h11,h12,h13,h21,h22,h23,h31,h32,h33,objectId2…]

参考链接:

find_object_2d - ROS Wiki

find_object_2d/ObjectsStamped Documentation (ros.org)

(83条消息) Ros中使用find_object_2d快速实现物体的检测识别_berry丶的博客-CSDN博客

ros2 topic echo /objects

已识别到两本书籍;

0x08 在OB上安装 find_obj_2d 包; 脱离服务器(开发机)运行;

同 0x03 ,通过 github 下载编译源码;

无 GUI 运行:

ros2 launch find_object_2d find_object_2d.launch.py \
image_topic:="bgr8_image" \
gui:=false \
settings_path:="/home/ning/find_obj_2d_cfg/setting.ini" \
objects_path:="/home/ning/find_obj_2d_cfg/img"

0x09 在OB上输出位置框、或中心坐标; 进行应用开发;

订阅 /objects 识别结果进行应用开发.

0x0A 总结

find_object_2d 功能包,对3D物品识别效果很差,但对2d平面物品效果很好。

参考:

5_10_特征匹配+单应性查找对象 - OpenCV中文官方文档 (woshicver.com)