文章目录
[2020/11/23] 文章更新
更新以下两篇文章,2021的同学,遇到相关问题的记得回来看:
实验设计 | 开发环境配置
实验设计 | 绑定串口
2020-2021 TDT ICRA人工智能挑战赛交接工作,主要包括以下两个部分:
- ros基础知识
- 视觉代码交接
1. ros基础知识
ROS( Robot Operating System)是一个机器人操作系统的软件框架,允许用户利用前人的资源做自己的开发。本讲的ros基础知识包括:创建工作空间和ros常用概念,仅仅涉及很基础的内容,更深的内容需要各位在实践过程中慢慢探索。
1.1 创建工作空间
//-- step1:home下创建catkin_ws文件夹并进入
tdt@tdt:~$ mkdir catkin_ws
tdt@tdt:~$ cd catkin_ws
//--step2:创建src文件夹并进入
tdt@tdt:~/catkin_ws$ mkdir src
tdt@tdt:~/catkin_ws$ cd src
//--step3 初始化工作空间
tdt@tdt:~/catkin_ws/src$ catkin_init_workspace
/*
Creating symlink "/home/tdt/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
*/
//--step4:编译,必须在catkin_ws路径下
tdt@tdt:~/catkin_ws/src$ cd ..
tdt@tdt:~/catkin_ws$ catkin_make
//--step5:~/.bash文件添加工作空间路径
// 打开~/.bashrc
tdt@tdt:~$ sudo gedit ~/.bashrc
// 添加如下内容:
source ~/catkin_ws/devel/setup.bash
// 路径生效
tdt@tdt:~/catkin_ws$ source devel/setup.bash
编译通过后,在catkin_ws下生成两个文件夹 build 和devel
build :编译空间(build space),为功能包和项目保存缓存信息、配置和其他中间文件。
devel:开发空间(Development space),用来保存编译后的程序。这个文件夹稍微重视一下,编译生成的可执行文件、一些消息或服务生成的头文件都保存在这个文件夹下。
1.2 ros 常用概念
在算法开发过程中,会经常用到以下概念:功能包、节点、话题、消息、服务。本小结针对这些概念的实际应用进行展开讲解
1.2.1 功能包
- 创建功能包
//-- 创建功能包
tdt@tdt:~/catkin_ws$ cd src
tdt@tdt:~/catkin_ws/src$ catkin_create_pkg tuto1 std_msgs roscpp rospy
功能包名:tuto1
依赖项 :std_msgs roscpp rospy
1.2.2 节点
1.2.3 消息
1.2.4 话题
2.2.5 服务
ROS中有四种通信方式:Topic(话题)、Service(服务)、Parameter Serivce(参数服务器)、Actionlib(动作库)。
所谓通信,ros中每个程序包是一个node(节点),通信就是节点与节点间的数据传输,在这里简要介绍一下话题与服务
node: 本小节快捷键整理
[1]: 创建文件夹
mkdir [folderName]
[2]: 进入文件夹
cd [folderName]
[3]:返回上一级路径 || 指定路径
cd ..
cd ../[指定路径]
[4] 打开终端
Ctrl + Alt +t
[5] 在第一个终端下打开多个同路径的终端
Ctrl + Shift +t
[6]:多个终端之间切换
Alt + num (num= 1 2 3 ...)
[7] 删除文件
rm -r * //! 删除路径下所有文件
rm -r [faileNmae] //! 删除指定文件
[8] 截图命令
gnome-screenshot -i
2. 视觉代码交接
2.1 大疆官方文档
https://robomaster.github.io/RoboRTS-Tutorial/#/README
2.2 视觉代码
视觉代码包含四个功能包:roborts_camera、beginner_tutorials、roborts_detection、udp_socket
2.2.1 roborts_camera
驱动相机,将相机的图像用话题发布。beginner_tutorials和roborts_detection订阅该话题,获得相机的数据。
|——cmake_module
|——config //! 相机配置文件
| |——camera_param.prototxt
|
|——HKVision //!海康相机
|——proto //! camera_param.prototxt编译生成文件
| |——camera_param.pb.cc
| |——camera_param.pb.h
| |——camera_param.proto
|
|——test
| |——image_capture.cpp
|
|——uvc //! 免驱相机
| |——uvc_driver.cpp
| |——usc_driver.h
| |——CMakeList.txt
|
|——camera_base.h
|——camera_base.cpp
|——camera_node.h
|——camera_node.cpp //! 相机节点
|——camera_param.h
|——camera_param.cpp
|——CMakeList.tst
|——package.xml
这个功能包的目的就是打开相机,获取数据并发布。没有特殊的需求这部分代码不用修改。需要说明的一点:同时驱动多个相机
- 代码部分
多线程实现,同时驱动多个相机。 - 配置文件
配置文件路径: config/camera_param.prototxt
配置文件包含了相机的参数信息,修改配置文件的参数不需要编译。每个相机需要一个camera:{} ,代码根据配置文件的路径读取信息,根据读到的配置文件信息来确定有几个相机。
node:有几个相机就添加几个相机的参数信息
## 免驱相机
camera: {
camera_name: "back_camera"
camera_type: "uvc"
camera_path: "/dev/video0"
camera_matrix {
data: 839.923052
data: 0.0
data: 340.780730
data: 0.0
data: 837.671081
data: 261.766523
data: 0.0
data: 0.0
data: 1.0
}
camera_distortion {
data: 0.082613
data: 0.043275
data: 0.002486
data: -0.000823
data: 0.0
}
resolution {
width: 640
height: 480
width_offset: 0
height_offset: 0
}
fps: 100
auto_exposure: 1
exposure_value: 100#70
exposure_time: 10
auto_white_balance: 1
auto_gain: 0
}
## 海康相机
camera:{
camera_name: "back_camera1"
camera_type: "HKVision"
camera_path: "/dev/video1"
camera_matrix {
data: 1300.455871428321
data: 0.0
data: 341.8607823111971
data: 0.0
data: 1300.351036374975
data: 279.9303380631039
data: 0.0
data: 0.0
data: 1.0
}
camera_distortion {
data: -0.4219849884671862
data: -1.910835890478247
data: -0.004344812206035102
data: -9.443710934940395e-05
data: 18.72987642778579
}
resolution {
width:1440#640
height:1080#480#360#?s
width_offset: 0
height_offset: 0
}
fps:100
auto_exposure:0#1
exposure_value:5000#10#70
#2:RED:9000 #2 NOW PROGRAM BLUE 9000
exposure_time: 10
auto_white_balance: 1
auto_gain: 0#1
}
2.2.2 beginner_tutorials
哨岗分区,将场地分为编号为1、2、3、4、5、6的六个区域。
- 约束方程 y=ax+b;
- 参数校准
|——include
| |——beginner_tutorials
|
|——src
| |——listener.cpp
| |——talker.cpp //! 哨岗分区约束条件参数获取
| |——cameraCalibration.cpp //!相机标定
|
|——CMakeList.txt
|——package.txt
代码执行:
//-- step1 打开相机节点
tdt@tdt:~/catkin_ws$ sudo su //!打开海康相机,必须申请root权限
[sudo] tdt 的密码:tdt
root@tdt:/home/tdt/catkin_ws# source devel/setup.bash
root@tdt:/home/tdt/catkin_ws# rosrun roborts_camera roborts_camera_node
//-- step2 打开参数校准节点
tdt@tdt:~/catkin_ws$ rosrun beginner_tutorials listener
2.2.3 roborts_detection
视觉主算法,说明以下几点:
- 该部分代码结构混乱,可以考虑重新布置结构。
- 装甲板识别算法与国赛相同
- 新增视觉标签的识别算法
|——cmake_module
| |——FindEigen3.cmake
| |——FindProtoBuf.cmake
|
|——util
| |——cv_toolbox.h //! 工具,图像话题接收
| |——CMakeList.txt
|
|——armor_detection
| |——config
| | |——armor_detection.prototxt
| | |——armor_detection1.prototxt
| |
| |——proto
| | |——armor_detection.pb.cc
| | |——armor_detection.pb.h
| | |——armor_detection.proto
| |
| |——constraint_set //! 算法
| | |——config
| | |——model
| | |——proto
| | |——constraint_set.h
| | |——constraint_set.cpp
| | |——macro.h
| | |——macro.cpp
| | |——predict.h
| | |——predict.cpp
| | |——CMakeList.txt
| | |——package.xml
| |
| |——armor_detection_algorithm.h
| |——armor_detection_base.h
| |——armor_detection_client.cpp
| |——armor_detection_node.h
| |——armor_detection_node.cpp //! 免驱相机节点:处理视觉标签
| |——armor_detection_node1.h
| |——armor_detection_node1.cpp //! 海康相机节点:处理装甲板
| |——gimbal_control.h
| |——gimal_control.cpp
| |——CMakeList.txt
|
|——CMakeList.txt
|——package.xml
执行代码
//-- step1 打开相机节点
tdt@tdt:~/catkin_ws$ sudo su //!打开海康相机,必须申请root权限
[sudo] tdt 的密码:tdt
root@tdt:/home/tdt/catkin_ws# source devel/setup.bash
root@tdt:/home/tdt/catkin_ws# rosrun roborts_camera roborts_camera_node
//-- step2 运行装甲板识别节点
tdt@tdt:~/catkin_ws$ rosrun roborts_detection armor_detection_node1 //海康相机节点
//-- step2 视觉标签识别节点
tdt@tdt:~/catkin_ws$ rosrun roborts_detection armor_detection_node //免驱相机节点
node: 装甲板识别节点和视觉标签识别节点是相互独立的,可以根据需求运行。即,可以同时打开也可以根据需求选择某一个打开
2.2.4 udp_socket
通讯功能包,实现哨岗和场地机器人的通讯。
|——scripts
| |——killServer.sh
| |——l-runClient.sh
| |——l-runServer.sh
|
|——src
| |——udp_recv.cpp //! 接收
| |——udp_send.cpp //! 发送
|
|——CMakeList.txt
|——package.xml
参考
[1]: ros.org (ros官网)
[2]: ROS机器人高效编程
[3]: 大疆官方文档