当前位置: 首页 > news >正文

docker_ROS的usb_cam使用与标定

目录

准备

准备标定板

新建容器

新建usb_cam话题的ROS功能包

编写代码

编译

运行功能包

标定

安装camera_calibration标定功能包

启动发布usb_cam话题的功能包

启动camera_calibration标定功能包


准备

usb相机

标定板

一个带有ROS的docker镜像。

准备标定板

图片链接:

棋盘格图片

打印粘贴。或者可以使用手机平板等屏幕展示这张棋盘照片,测量棋盘小格尺寸,并保证标定过程中,图片不被缩放。

新建容器

使用--privileged参数建立镜像。基础的代码:

sudo docker run -it --privileged --name=lab1 your_image_name  /bin/bash

修改 your_image_name为你的docker镜像名。--privileged参数使容器与宿主机共用device设备,有相同的/dev文件。但是,在进入容器之前,先连接相机,再进入容器,防止进入容器后刷新不出相机。

docker run的其他参数根据需要自行设置。

连接相机

进入容器

新建usb_cam话题的ROS功能包

新建ROS功能包,用来发布usb_cam的话题。

编写代码

使用C++语言编写,示例如下,

新建功能包,而后写入核心代码:

img_publisher.cpp文件


#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui.hpp>
#include <opencv2/calib3d.hpp>
#include <cv_bridge/cv_bridge.h>
#include <iostream>int main(int argc, char** argv) {ros::init(argc, argv, "img_publisher");ros::NodeHandle nh;image_transport::ImageTransport it(nh);image_transport::Publisher pub = it.advertise("camera/image", 1);cv::VideoCapture cap;cv::Mat frame;int deviceID = 0;if (argc > 1)deviceID = argv[1][0] - '0';int apiID = cv::CAP_ANY;cap.open(deviceID + apiID);if (!cap.isOpened()) {std::cerr << "ERROR! Unable to open camera" << std::endl;return -1;}ros::Rate loop_rate(30);while (nh.ok()) {cap.read(frame);if (!frame.empty()) {sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();pub.publish(msg);}ros::spinOnce();loop_rate.sleep();}return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.0.2)
project(usb_cam)## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTScv_bridgeimage_transportroscppsensor_msgsstd_msgs
)
find_package(OpenCV REQUIRED)
message(${OpenCV_VERSION})###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES usb_cam
#  CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs
#  DEPENDS system_lib
)###########
## Build ##
############# Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include${catkin_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}
)add_executable(img_publisher src/img_publisher.cpp)
add_executable(img_viewer src/img_viewer.cpp)target_link_libraries(img_publisher ${catkin_LIBRARIES} ${OpenCV_LIBS})
target_link_libraries(img_viewer ${catkin_LIBRARIES} ${OpenCV_LIBS})

编译

打开终端:

catkin_make

在~/.bashrc加入环境变量。

打开终端:

gedit ~/.bashrc

文末写入

source ~/catkin_ws/devel/setup.bash

保存文件,关闭。

运行功能包

打开终端:

rosrun usb_cam img_publisher

会发布一个话题

查看话题

rostopic list

正常接入相机,功能包才正常运行,此时会出现包括/camera/image话题等一系列话题。

标定

安装camera_calibration标定功能包

查看ROS的功能包:

rospack list

查看是否有“camera_calibration”功能包,没有则需要安装:

rosdep install camera_calibration

启动发布usb_cam话题的功能包

打开终端:

rosrun usb_cam img_publisher

查看话题 

rostopic list

正常接入相机,功能包才正常运行,此时会出现包括/camera/image话题等一系列话题。 

启动camera_calibration标定功能包

打开终端:

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.20 image:=/camera/image

其中, --size 8x6是棋盘交点的数量,9*7的格子就会有8*6个交点

--square 0.20是一个小棋盘格大小,单位:米。

image:=/camera/image,image:=相机话题名。

正常启动后,弹出标定窗口,间断地调整相机位置,直到右侧"calibrate"按钮亮起,

Moving the Checkerboard

In order to get a good calibration you will need to move the checkerboard around in the camera frame such that:

    checkerboard on the camera's left, right, top and bottom of field of view
        X bar - left/right in field of view
        Y bar - top/bottom in field of view
        Size bar - toward/away and tilt from the camera
    checkerboard filling the whole field of view
    checkerboard tilted to the left, right, top and bottom (Skew)

At each step, hold the checkerboard still until the image is highlighted in the calibration window.

移动棋盘
为了获得良好的校准,您需要在相机框架中移动棋盘,以便:
相机视野左、右、上、下的棋盘
X条-视野中的左/右
Y条-视野中的顶部/底部
尺寸条-朝向/远离相机并倾斜
棋盘填充整个视野
向左、右、上、下倾斜的棋盘(倾斜)
在每一步中,保持棋盘静止,直到图像在校准窗口中高亮显示。

点击,开始计算。计算结束后"save"按钮亮起,结果点"save"按钮保存

If you are satisfied with the calibration, click COMMIT to send the calibration parameters to the camera for permanent storage. The GUI exits and you should see "writing calibration data to ..." in the console.

如果您对校准感到满意,请单击COMMIT将校准参数发送到相机以进行永久存储。GUI退出,您应该在控制台中看到“正在将校准数据写入…”。

参考

标定过程及参数:

相机内参标定究竟标了什么?相机内参外参保姆级教程 - 知乎

camera_calibration标定功能包介绍:

camera_calibration/Tutorials/MonocularCalibration - ROS Wiki

相关文章:

docker_ROS的usb_cam使用与标定

目录 准备 准备标定板 新建容器 新建usb_cam话题的ROS功能包 编写代码 编译 运行功能包 标定 安装camera_calibration标定功能包 启动发布usb_cam话题的功能包 启动camera_calibration标定功能包 准备 usb相机 标定板 一个带有ROS的docker镜像。 准备标定板 图…...

记一次RabbitMQ服务器异常断电之后,服务重启异常的处理过程

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 机房突然停电&#xff0c;rabbitmq的主机异常断电&#xff0c;集群服务全部需要重启。但是在执行service…...

rime中州韵小狼毫 help lua Translator 帮助消息翻译器

lua 是 Rime中州韵/小狼毫输入法强大的武器&#xff0c;掌握如何在Rime中州韵/小狼毫中使用lua&#xff0c;你将体验到什么叫 随心所欲。 先看效果 在 rime中州韵 输入效果一览 中的 &#x1f447; help效果 一节中&#xff0c; 我们看到了在Rime中州韵/小狼毫输入法中输入 h…...

C++完成使用map Update数据 二进制数据

1、在LXMysql.h和LXMysql.cpp分别定义和编写关于pin语句的代码 //获取更新数据的sql语句 where语句中用户要包含where 更新std::string GetUpdatesql(XDATA kv, std::string table, std::string where); std::string LXMysql::GetUpdatesql(XDATA kv, std::string table, std…...

ARCGIS PRO SDK 访问Geometry对象

一、Geometry常用对象 二、主要类 1、ReadOnlyPartCollection&#xff1a;Polyline 和 Polygon 使用的 ReadOnlySegmentCollection 部件的只读集合&#xff0c;属性成员&#xff1a;​ 名字描述Count获取 ICollection 中包含的元素数。TIEM获取位于指定索引处的元素。Spatial…...

数据结构之各大排序(C语言版)

我们这里话不多说&#xff0c;排序重要性大家都很清楚&#xff0c;所以我们直接开始。 我们就按照这张图来一一实现吧&#xff01; 一.直接插入排序与希尔排序. 这个是我之前写过的内容了&#xff0c;大家可以通过链接去看看详细内容。 算法之插入排序及希尔排序&#xff08…...

c++ 中多线程的使用

如果你的其他逻辑必须在线程 t1 和 t2 之后执行&#xff0c;但你又希望这些线程能够同时运行&#xff0c;你可以在主线程中使用 std::thread::detach 将线程分离&#xff0c;让它们在后台运行。这样&#xff0c;主线程不会等待这些线程的完成&#xff0c;而可以继续执行其他逻辑…...

理解二叉树的遍历(算法村第七关白银挑战)

二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]解 LeetCode以及面试中提供的方法可能…...

所有单片机使用的汇编语言是统一的吗?

所有单片机使用的汇编语言是统一的吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…...

C ++类

定义一个Person类&#xff0c;私有成员int age&#xff0c;string &name&#xff0c;定义一个Stu类&#xff0c;包含私有成员double *score&#xff0c;写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数&#xff0c;完成对Person的运算符重载(算术运算符、条件运算…...

STM32疑难杂症

1.keil的奇怪问题 创建的数组分配内存到0x10000000地址的时候&#xff0c;数据总是莫名其妙的出现问题&#xff0c;取消勾选就正常了 stm32f407内部有一个CCM内存&#xff0c;这部分内存只能由内核控制&#xff0c;任何外设都不能够进行访问。这样问题就来了&#xff0c;如果使…...

GIT使用简介

Git 是一种版本控制系统&#xff0c;常用于团队协作开发和管理代码。下面是 Git 的基本使用方式&#xff1a; 安装 Git&#xff1a;首先&#xff0c;在你的计算机上安装 Git。你可以从 Git 官方网站&#xff08;https://git-scm.com/&#xff09;下载适合你操作系统的版本&…...

easycode 插件配置文件

easycode是一个idea生成文件的插件&#xff0c;以下是我的一个项目中配置信息&#xff0c;需要的可以拿走&#xff0c;保存成json文件导入即可 {"author" : "XXX","version" : "1.2.8","userSecure" : "","…...

elasticsearch系列四:集群常规运维

概述 在使用es中如果遇到了集群不可写入或者部分索引状态unassigned&#xff0c;明明写入了很多数据但是查不到等等系列问题该怎么办呢&#xff1f;咱们今天一起看下常用运维命令。 案例 起初我们es性能还跟得上&#xff0c;随着业务发展壮大&#xff0c;发现查询性能越来越不…...

6.6 会话与输入事件(三)

三,Pointer会话 3.1 Pointer会话及其属性 指针输入会话使用SCREEN_EVENT_POINTER类型创建,通常用于控制光标的形状和位置。 指针会话的SCREEN_PROPERTY_MODE属性未使用。但是,可以使用下面的会话属性配置指针会话: SCREEN_PROPERTY_ACCELERATION表示一组六个整数,表示x…...

【自动化测试总结】优点、场景、流程、项目人员构成

一、自动化测试的概念 以程序测试程序&#xff0c;以代码代替思维&#xff0c;以脚本的运行代替手工测试&#xff0c;可以大大提高工作测试的效率。 二、自动化测试的优点 1.回归测试更为方便&#xff0c;可靠。自动化测试最主要的任务和特点&#xff0c;特别是在程序修改比较…...

杨中科 ASP.NETCore Rest

什么是Rest RPC 1、Web API两种风格: 面向过程(RPC) 、面向REST (REST) 2、RPC:“控制器/操作方法“的形式把服务器端的代码当成方法去调用。把HTTP当成传输数据的通道&#xff0c;不关心HTTP谓词。通过QueryString请求报文体给服务器传递数据。状态码。比如/Persons/GetAll…...

RTU数据采集终端

在现代工业控制系统中&#xff0c;数据采集是一个至关重要的步骤。RTU(远程终端单元)作为一种常用的数据采集终端设备&#xff0c;不仅可以实现数据的采集和传输&#xff0c;还可以实现现场设备的远程监控和控制。 一、RTU数据采集终端的工作原理 RTU数据采集终端是一种将现场…...

双指针--- 数组元素的目标和

目录 数组元素的目标和思路&#xff1a;暴力做法思路&#xff1a;双指针做法&#xff1a; 代码: 原题链接 数组元素的目标和 给定两个升序排序的有序数组 A 和 B &#xff0c;以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯…...

你的网站或许不需要前端构建(二)

前一阵&#xff0c;有朋友问我&#xff0c;能否在不进行前端编译构建的情况下&#xff0c;用现代语法开发网站界面。 于是&#xff0c;就有了这篇文章中提到的方案。 写在前面 这篇文章&#xff0c;依旧不想讨论构建或不构建&#xff0c;哪一种方案对开发更友好&#xff0c;…...

flutter 使用adb 同时连接 多个模拟器

MUMU模拟器 MuMu模拟器官网_安卓12模拟器_网易手游模拟器 传统只需要 连接一个 默认命令是 默认端口是7555 adb connect 127.0.0.1:7555 但是需要同时连接调试多个模拟器的时候 就需要连接多个 这里可以使用自带的多开 多开后 使用 1 是对应多开的序号 这样就可以查看对…...

网络四元组

文章目录 网络四元组 今天我们来聊聊 网络四元组 网络四元组 四元组&#xff0c;简单理解就是在 TCP 协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP 地址、目标 IP 地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可…...

[实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击

思路 1、优化正则表达式 2、正则表达式无法优化的话&#xff0c;可以考虑限制匹配次数&#xff0c;或者限制匹配时间 限制 匹配次数 public class CountedCharSequence implements CharSequence {private final CharSequence charSequence;private long count;public Counte…...

ffmpeg 5.0版本调试 ffmpeg 5.01 static版本

ffmpeg 5.0版本调试 写法&#xff1a;ffmpeg -rtsp_transport tcp -re -i rtsp://admin:BYTtest2019192.168.1.2:554/h264/ch1/main/av_stream -q 5 -f mpegts -fflags nobuffer -c:v mpeg1video -an -s 960x540 http://127.0.0.1:12345/demo本地写法 ffmpeg -timeout 5000000…...

应用在游戏机触摸屏中的触摸感应芯片

触屏游戏机的屏幕是由液晶屏和触控层组成的。触控层分为电容式触屏和电阻式触屏两种。电容式触屏是将悬空电极和屏幕玻璃上的电极组成静电场,当人体接近屏幕时,就会改变静电场分布,从而实现触摸的位置探测。而电阻式触屏则是利用玻璃上的两层电极之间通电形成一个电阻值,当手指…...

D-Link DES-108 交换机

D-Link DES-108 交换机 1. 百兆交换机 8 口References ​ D-Link Corporation is a Taiwanese multinational networking equipment manufacturing corporation headquartered in Taipei, Taiwan. Taiwanese&#xff1a;adj. 台湾的 n. 台湾人 headquarter [hedkwɔ:tə]&#…...

VIT用于图像分类 学习笔记(附代码)

论文地址&#xff1a;https://arxiv.org/abs/2010.11929 代码地址&#xff1a;https://github.com/bubbliiiing/classification-pytorch 1.是什么&#xff1f; Vision Transformer&#xff08;VIT&#xff09;是一种基于Transformer架构的图像分类模型。它将图像分割成一系列…...

MongoDB Certified Associate Developer 认证考试心得

介绍 前段时间通过了 MongoDB Associate Developer 考试&#xff0c;也记下了一些心得&#xff0c;结果忘记发出来了&#xff0c;现在重新整理下。通过考试后证书是这样的: MongoDB 目前有两个认证证书 1. MongoDB Associate Developer 认证掌握使用MongoDB 来构建现代应用…...

基于Java车间工时管理系统(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…...

2024.1.5

今天真是狂学了一天的C&#xff0c;什么期末考试&#xff0c;滚tmd&#xff08;就一门政治&#xff0c;不能影响我c的脚步&#xff09;&#xff0c;今天还是指针&#xff0c;主要是函数指针和函数指针数组&#xff0c;将简单的两位数计算器程序用此方式更加简单的实现了&#x…...

中国万网轻云服务器 如何发布网站/如何建立自己的网站平台

mysql数据库中">以百度地图的Place API为例&#xff0c;在vs2010中获取某一类型(如酒店)的POI数据(以xml文件方式存储)&#xff0c;并导入mysql数据库中。第一步&#xff1a;打开vs2010&#xff0c;并建立一个windows窗体应用程序&#xff0c;在窗体中添加主要的控件和…...

wordpress导出出错/html网页制作网站

最近在研究nginx&#xff0c;接下来会把每天学习的知识点整理好之后&#xff0c;慢慢发上来。今天先对nginx做个大概的介绍&#xff0c;由于我是刚刚涉及这个领域&#xff0c;或许有很多东西都没能掌握的很好&#xff0c;有不足或者错漏的欢迎大家积极指出。我想通过nginx是什么…...

国企门户网站建设情况汇报/网络推广官网首页

1 打开游标&#xff08;V$open_cursor),这一步主要工作是pga中为sql准备内存。 2 解析。(根据sql文本的hash值&#xff0c;找到对应bucket&#xff0c;搜索bucket后的链表&#xff0c;查找对应的父游标句柄&#xff0c;然后在父游标堆0中查找子游标句柄&#xff0c;如果找的到…...

巴城镇建设网站/谷歌搜索引擎下载安装

小小喜欢看的动画片我也跟着看起来&#xff0c;发现了一个事实。 小小看的动画片都是国外的&#xff0c;比如《爱探险的朵拉》&#xff0c;《米奇妙妙屋》...但是大致宗旨只有两个&#xff0c;值得我们成年人学习&#xff1a; 1.所有的事情快要成功的时候&#xff0c;总是有个“…...

做网站好多钱/百度一下官网首页登录

通过这个网站上传excel:http://www.docpe.com/excel/excel-to-html.aspx 然后转换,将压缩包打开,实际就是一个html. 找到table标签的开始和结束,直接将这一大段考到md文件里面即可… 有一点很坑爹,就是如果你一行都是英文,好比包名,markdown不会将其压缩,导致包名就很长一行,其…...

广州城乡建设网站/昆明seo技术培训

当地时间3月19日&#xff0c;IBM Qiskit正式发布了Qiskit Metal[1]&#xff0c;一款用于超导量子计算机的开源电子设计自动化&#xff08;EDA&#xff09;软件。官方表示很期待看到Qiskit Metal在这个领域即将产生的影响&#xff0c;毕竟&#xff0c;IBM Qiskit已经从早期体验者…...