6.2 AMR开发指南
自主移动机器人(Autonomous Mobile Robot,AMR)是一类能够在环境中自主导航和执行任务的机器人。AMR 不同于自动导航车辆 (AGV),AGV依赖于轨道或预定义路线,并且通常需要操作员监督。AMR 通过多传感器融合、人工智能、机器学习等多种技术来理解环境并在其中导航,不受有线电源的限制。因其高度灵活的移动能力和智能导航系统,AMR在工业自动化、物流、医疗等领域得到了广泛应用。
1. 样例介绍
1.1 外观效果
1.2 功能框架
2. 样例组装
2.1 组件清单
名称 | 数量 | 备注 |
---|---|---|
RDK X5 | 1 | 地瓜 |
AMR底盘(舵轮)+上装+螺丝零件 | 1 | 煜禾森 |
单线激光雷达 | 1 | 氪见 |
tof摄像头 | 1 | 光鉴 |
双目摄像头(230ai) | 1 | 地瓜配件 |
IMU(BMI088) | 1 | 地瓜配件 |
usb转网口转换器 | 1 | |
0.3m网线 | 1 | |
12v转5V4A(MAX 5A) | 1 | |
tof相机支架(3D打印) | 1 | |
双目相机支架(3D打印) | 1 | |
盖板(3D打印) | 1 | |
m2*16螺丝+m2螺母 | 1 |
2.2 组装步骤讲解
2.2.1 底盘上装安装
原生底盘无法安装摄像头以及存放各种线缆,所以需要另外的上装接入底盘,只需将上装底部的两个孔位对齐底盘安装滑轨上的零件,锁紧螺丝即可
2.2.2 RDK X5接线
所有传感器以及底盘都直接接入RDK X5,需要注意双目摄像头使用的是两根同面的22pin排线,请按照下图所示方向安装
2.2.3 盖板安装
盖板为3D打印件(图纸见 文末附件),主要用于安装RDK X5并且收纳其余线缆。黄框位置四个安装孔用于安装RDK X5,安装位置在上盖板的背面。红框位置的安装孔对齐底盘安装滑轨上的零件,锁紧螺丝即可。
2.2.4 激光雷达模块接入
先将激光雷达安装至载板上,螺丝从载板背面安装,然后将接线穿过载板上的孔洞(右图中黄框所示)连接电源管理器。电源管理器安装在载板背面,螺丝从载板正面安装(如左图红框所示),安装完成后接入网线以及12V电源,网线与电源线穿过上装的孔洞(右图中红框所示)。
2.2.5 摄像头安装
1. tof摄像头安装
首先将tof摄像头、3D打印件、钣金支架连接在一起,注意3D打印件凹槽朝下。连接完成后将整体塞入上装上方凹槽,电源线与信号线从上装内部孔洞穿过(图3黄框) 。钣金件的螺丝孔位(图1红框)与上装内部螺丝孔位(图3红框)对齐,锁紧螺丝即可。
2. 双目摄像头安装
先将双目摄像头与3D打印件连接,然后接入底盘尾部的钣金支架即可
2.2.6 电源说明
底盘上提供12V的电源。12V提供给雷达,tof摄像头以及变压器,变压器输出5V提供给RDK X5
2.2.7 其他部件安装
3. 运行环境准备
tof相机、激光雷达、底盘、imu请根据实际设备型号获取代码或者功能包,此处仅提供地瓜配件imu的源代码。
3.1 传感器检查
3.1.1 双目摄像头
#检查i2c设备
root@ubuntu:~# i2cdetect -y -r 4
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- 32 -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- 58 -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@ubuntu:~# i2cdetect -y -r 6
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- 58 -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
3.1.2 雷达
#确保雷达与板子的网关与掩码一致,确认是否能ping通
ping 雷达ip
3.1.3 底盘
#启动can设备,请根据具体can设备号以及波特率设置
ip link set can1 up type can bitrate 500000
#检查设备,会有如下输出:can1: <NOARP,UP,LOWER_UP> mtu 16 qdisc mq state UP mode DEFAULT group default qlen 10link/can
ip link show can1
#检查能否获取can数据,请根据具体can设备号设置
candump can1
3.1.4 IMU
#检查i2c设备
root@ubuntu:~# i2cdetect -y -r 5
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- 19 -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- 69 -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
#获取imu数据(会打印三个数,且随着imu的位姿变化)
cat /sys/devices/virtual/input/input2/acc_bal
cat /sys/devices/virtual/input/input2/gry_bal
3.2 功能安装
sudo apt -y tros-hobot-nav2 ros-foxy-navigation2 ros-foxy-nav-msgs
3.3 源码获取(无安装包的功能,需编译源码)
mkdir -p ~/amr_ws/src && cd src
#tofSLAM
git clone https://github.com/wunuo1/Tofslam_ros2.git
#点云过滤
git clone https://github.com/wunuo1/voxel_filter.git
#指定位置导航
git clone https://github.com/wunuo1/pose_setter.git
#双目深度
git clone https://github.com/D-Robotics/hobot_stereonet.git
3.4 代码编译
cd ~/amr_ws
source /opt/tros/humble/setup.bash
colcon build
3.5 传感器标定
3.5.1 标定前准备
1. 标定环境准备(标定工具为kalibr,此处提供包含kalibr以及其他标定脚本的dokcer)
i. 下载docker文件
链接:https://pan.baidu.com/s/1yN5aj3quDJU182rYI0AK8A?pwd=31un 提取码:31un
ii. 创建环境
#加载docker
docker load -i ubuntu18.04_calibration.tar
#检查docker是否加载成功(出现TAG为calibration的镜像)
docker images
#从image生成containe
docker run -it --privileged -v /home/nuo.wu/share_dir:/share_dir -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE --net=host ubuntu18.04:calibration /bin/bash
iii.docker支持界面显示
# 在host端运行
xhost +local:docker
# 在host端运行以下指令
echo $DISPLAY
# 在docker运行以下指令
echo $DISPLAY
# 查看两者输出是否相同
# 若两者输出不同,若host端显示的结果是:0, 则在docker里运行以下指令
export DISPLAY=:0
2. 准备标定板并配置参数
棋盘格或aprilgrid均可(aprilgrid文件见附件)。棋盘格尺寸方格边长>=10cm为宜,且为避免标定时棋盘格角点提取/连线出错问题,棋盘格行列应不同。aprilgrid标定板数据采集时比较方便,操作简单,但对图像质量的要求较高,则目前阶段还是建议使用棋盘格。标定板外尺寸> 1m。
#设置aprilgrid.yaml文件
target_type: 'aprilgrid' #gridtype
tagCols: 6 #number of apriltags
tagRows: 6 #number of apriltags
tagSize: 0.024 #size of apriltag, edge to edge [m]
tagSpacing: 0.3083 #ratio of space between tags to tagSize
codeOffset: 0 #code offset for the first tag in the aprilboard
#设置棋盘格标定板参数,其中targetCols,targetRows分别为每列、每行的内点数,如格子数为9列x8列,则内角点数为8列x7列。
target_type: 'checkboard'
targetCols: 8
targetRows: 7
rawSpacingMeters: 0.1
colSpacingMeters: 0.1
3.5.2 双目摄像头内参标定(双目深度算法使用)
1. 标定数据采集
不同的距离移动相机或标定板,确保标定板尽可能覆盖图像的FOV范围,移动过程中,棋盘格标定板不要移出画面。稳慢速移动相机或标定板,避免图像因运动导致的模糊。
i. 启动双目摄像头
source /opt/tros/humble/setup.bash
ros2 run mipi_cam mipi_cam --ros-args -p device_mode:="dual" -p out_format:="nv12" -p dual_combine:=2 -p framerate:=10.0 --log-level warn
ii. ros1与ros2消息转换并保存图像数据集(ubuntu20.04系统,已安装ros1与ros2)
#安装ros1_bridge
sudo apt update
sudo apt install ros-foxy-ros1-bridge
#启动终端
source /opt/ros/noetic/setup.bash
roscore
#启动新终端
source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
ros2 run ros1_bridge dynamic_bridge --bridge-all-topics=false --bridge-topic sensor_msgs/msg/Image /image_combine_raw
#启动新终端 记录图像数据(移动摄像头至不同位置)
source /opt/ros/noetic/setup.bash
rosbag record image_combine_raw
iii. 调用标定程序进行标定(需指定记录的bag包路径以及标定配置文件的路径)
$1=path_to_bag
$2=path_to_calib_yaml(checkbord.yaml or aprilgrid.yaml)
rosrun kalibr kalibr_calibrate_cameras --bag $1 --topics /camera/left/image_raw /camera/right/image_raw --models pinhole-radtan pinhole-radtan --target $2 --show-extraction
iv. 标定完成后,标定文件如下
cam0:
cam_overlaps: [1]
camera_model: pinhole
distortion_coeffs: [-0.30512368344314034, 0.06869074995752597, -0.0007768971335288749, -0.0018077365618742228]
distortion_model: radtan
intrinsics: [874.7756769752957, 876.9016366753913, 988.9147013767086, 574.9147170323885]
resolution: [1920, 1080]
rostopic: /camera/left/image_raw
cam1:
T_cn_cnm1:
- [0.9998783828690954, -0.0007967376839525958, 0.015575130180209843, -0.06826569753821157]
- [0.0008025928358794327, 0.9999996095896897, -0.0003696825565397285, 8.695548926243514e-05]
- [-0.01557482955949466, 0.0003821380847083855, 0.9998786319622305, 0.0011080079883866683]
- [0.0, 0.0, 0.0, 1.0]
cam_overlaps: [0]
camera_model: pinhole
distortion_coeffs: [-0.30647450034075296, 0.06904546877578269, -0.0015178028297652521, -0.00016199661118514476]
distortion_model: radtan
intrinsics: [875.6405166670517, 877.1839943792446, 963.0392879775055, 519.3086364230766]
resolution: [1920, 1080]
rostopic: /camera/right/image_raw