使用ROS和AprilTags进行相机定位(二维码定位全流程)


实现了使用ROS和AprilTags进行相机定位,参考了大量大佬的博客,做一个整合。

配置环境

虚拟机:VMware15.5.0
ubuntu: 16.04
ros: kinetic
相机:USB外接相机

1 下载虚拟机

下载VMware15
注:如果经常死机和出现各种问题,建议重装别的版本虚拟机。

2 下载Ubuntu16.07

下载Ubuntu

3 安装虚拟机和Ubuntu

安装步骤

4 安装ROS

安装ROS
在进行到初始化rosdep时,会出现error,按如下操作:
#打开hosts文件

sudo gedit /etc/hosts

#在文件末尾添加

151.101.84.133  raw.githubusercontent.com

#保存后退出再尝试初始化命令

5 USB相机驱动

检查相机是否使用正常,需要安装如下功能包ROS学习笔记七:在ROS中使用USB摄像头
注:
1 因为安装的ros是kinetic版本,所以安装uvc camera功能包的时候需要修改成kinetic:

sudo apt-get install ros-kinetic-uvc-camera

2 运行uvc_camera节点的时候,因为是rosrun,所以要先开roscore,即

roscore

而roslaunch不用,因为有 .launch 文件。接着再运行:

rosrun uvc_camera uvc_camera_node

最后运行:

 rosrun rqt_image_view rqt_image_view

就能掉出摄像头,如下图。
在这里插入图片描述
这里建议ROS学习笔记七:在ROS中使用USB摄像头中的USB_cam软件包也安装,不然后续操作可能会报错。

标定、定位

1 相机标定

参考ros学习之camera calibration 单目摄像头标定
标定文件在/tmp/calibrationdata.tar.gz,实际上,也会自动更新到/home/.ros/camera_info/head_camera.yaml中(ctrl+h显示隐藏文件)。标定后退出直接进行下一步。

2 下载AprilTag2源码

priltags2_VO

2.1 修改文件

解压,放入新建文件夹(catkin_apriltag/src)下。源码使用的不是USB相机,因此需要修改/catkin_apriltag/src/Apriltags2_VO-master/apriltags2_ros/launch/continuous_detection.launch 文件
在这里插入图片描述
修改成如下内容:
在这里插入图片描述

2.2 编译

cd catkin_apriltag
catkin_make

2.3 修改二维码标签信息

打开 catkin_apriltag/src/Apriltags2_VO-master/apriltags2_ros/config/tags.yaml 文件,本次测试只用了 catkin_apriltag/src/Apriltags2_VO-master/support_image/tag36h11/tag36h11_1.png 这张二维码,编号为1,所以只需修改以下参数(id,打印的二维码实际尺寸):

在这里插入图片描述

3启动程序

3.1 启动ros

roscore

3.2 打开摄像头

新开一个终端

roslaunch usb_cam usb_cam-test.launch

3.3 运行apriltags2_ros

新打开一个终端

cd catkin_apriltag
source devel/setup.bash
roslaunch apriltags2_ros continuous_detections.launch

3.4 运行二维码检测节点

新打开一个终端

cd catkin_apriltag
source devel/setup.bash
rostopic echo /tag_detections

如果相机未检测到二维码,会显示
在这里插入图片描述
检测到后,显示在这里插入图片描述

4 可视化显示

4.1 运行二维码检测节点

新打开一个终端

cd catkin_apriltag
source devel/setup.bash
rostopic echo /tag_detections_image

4.2 打开可视化工具包Rviz

新打开一个终端

rosrun rviz rviz

4.3 Rviz设置

根据下图提示,对Rviz进行初始化。先改名,然后点击add添加需要显示内容。
在这里插入图片描述

结束

欢迎指正补充,谢谢大家!

  • 24
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
使用IMU和激光雷达进行机器人定位,可以采用扩展卡尔曼滤波(Extended Kalman Filter,EKF)算法。 首先,需要在ROS环境中安装`robot_localization`功能包,可以通过以下命令进行安装: ``` sudo apt-get install ros-<distro>-robot-localization ``` 其中,`<distro>`是ROS版本号,例如`kinetic`、`melodic`等。 接着,在ROS节点中引入`robot_localization`的头文件,并创建一个`ros::NodeHandle`对象: ``` #include <ros/ros.h> #include <robot_localization/ekf_localization_node.hpp> ... ros::NodeHandle nh("~"); ``` 然后,需要设置EKF的参数,例如状态量、传感器数据类型等: ``` std::vector<std::string> state_vars = {"x", "y", "z", "roll", "pitch", "yaw", "xd", "yd", "zd", "rolld", "pitchd", "yawd"}; // 状态量 std::vector<std::string> odom_vars = {"x", "y", "z", "roll", "pitch", "yaw"}; // 里程计数据 std::vector<std::string> imu_vars = {"roll", "pitch", "yaw", "rolld", "pitchd", "yawd"}; // IMU数据 std::vector<std::string> laser_vars = {"x", "y", "z"}; // 激光雷达数据 robot_localization::EkfLocalizationNode::EkfConfig config; config.set_state_vars(state_vars); config.set_odom_vars(odom_vars); config.set_imu_vars(imu_vars); config.set_laser_vars(laser_vars); ``` 接着,可以通过以下代码创建EKF节点: ``` robot_localization::EkfLocalizationNode ekf_node(config); ekf_node.setNodeHandle(&nh); ekf_node.init(); ``` 最后,可以在`ros::spin()`循环中调用EKF节点的定位函数,例如: ``` while (ros::ok()) { ekf_node.correct(); // 使用IMU和激光雷达数据进行校正 pose = ekf_node.getRobotPose(); // 获取机器人位姿 ... ros::spinOnce(); } ``` 这样就可以使用C++编写ROS机器人使用IMU和激光雷达进行定位了。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值