1.Navigation 移动机器人导航框架SLAM
1. Navigation 移动机器人导航框架
-
SLAM (Simultaneous Localization and Mapping)
-
实时定位与地图构建,用于移动机器人在未知环境中导航。
-
-
MoveIt 机械臂运动控制
-
用于机械臂的运动规划与控制。
-
2. 节点 (Node)
-
定义: 执行单元,执行具体的进程,独立运行的可执行文件。
-
特性:
-
不同节点可使用不同的编程语言。
-
可分布式运行在不同的主机。
-
节点在系统中的名称必须是唯一的。
-
-
节点管理器 (ROS Master)
-
功能:
-
为节点提供命名和注册服务。
-
跟踪和记录话题/服务通信,辅助节点相互查找,建立连接。
-
提供参数服务器,节点使用此服务器存储和检索运行时的参数。
-
-
3. 话题 (Topic)
-
定义: 异步通信机制,节点间传输数据的重要总线。
-
发布/订阅模型:
-
数据由发布者传输到订阅者。
-
同一话题的订阅者或发布者可以不唯一。
-
-
消息 (Message)
-
定义: 话题数据,具有一定的类型和数据结构。
-
类型:
-
ROS 提供的标准类型。
-
用户自定义类型。
-
-
定义方式: 使用编程语言无关的
.msg
文件定义,编译过程中生成对应的代码文件。
-
4. 服务 (Service)
-
定义: 同步通信机制。
-
客户端/服务端 (C/S) 模型:
-
客户端发送请求数据,服务器完成处理后返回应答数据。
-
-
定义方式: 使用编程语言无关的
.srv
文件定义请求和应答数据结构,编译过程中生成对应的代码文件。
5. 参数 (Parameter)
-
定义: 全局共享字典,可通过网络访问的共享多变量字典。
-
用途:
-
节点使用此服务器来存储和检索运行时的参数。
-
适合存储静态、非二进制的配置参数,不适合存储动态配置的数据。
-
6. 功能包 (Package)
-
定义: ROS 软件中的基本单元,包含节点源码、配置文件、数据定义。
-
功能包清单 (Package Manifest):
-
记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志。
-
-
元功能包 (Meta Packages):
-
组织多个用于同一目的的功能包。
-
7. 工具与命令
-
rqt_graph: 可视化工具,用于查看系统中运行的计算图。
-
rosnode:
-
rosnode list
: 打印所有节点的列表。 -
rosnode info 节点名字
: 查看具体节点的信息。-
节点的三个重要内容:
-
Publication: 显示节点此时发布哪些数据。
-
Subscriptions: 显示节点订阅哪些数据。
-
Services: 显示节点提供哪些服务。
-
-
-
-
rostopic:
-
rostopic echo 话题
: 打印某一个话题的内容。 -
rostopic pub 发布话题
: 发布话题。-
例:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear: x: 1.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0"
。
-
-
-
roscore: 启动 ROS Master。
-
rosrun:
-
例:
rosrun turtlesim turtlesim_node
。-
turtlesim
: 运行的功能包的名字(海龟仿真器)。 -
turtlesim_node
: 可执行文件的名字。
-
-
知识树总结
-
Navigation
-
SLAM
-
MoveIt
-
-
Node
-
定义与特性
-
ROS Master
-
-
Topic
-
发布/订阅模型
-
Message
-
-
Service
-
客户端/服务端模型
-
-
Parameter
-
全局共享字典
-
-
Package
-
功能包清单
-
元功能包
-
-
Tools & Commands
-
rqt_graph
-
rosnode
-
rostopic
-
roscore
-
rosrun
-
2、ROS 项目开发流程
五个流程
创建工作空间 -->创建功能包-->创建源代码-->配置编译规则-->编译与运行
工作空间相关
工作空间(workspace)是存放工程开发相关文件的文件夹,包含以下几个主要空间:
- src:代码空间,存放项目的源代码。
- build:编译空间,编译过程中生成的中间文件存放于此。
- devel:开发空间,包含编译生成的可执行文件、库以及环境配置脚本等。
- install:安装空间,用于安装项目,可将编译好的文件部署到该空间。
1. 创建工作空间
- 执行以下命令创建工作空间及其
src
目录:
bash
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
- 编译工作空间:
bash
cd ~/catkin_ws
catkin_make
- 设置环境变量:
bash
source devel/setup.bash # 此命令仅在当前终端生效
- 检查环境变量:
bash
echo $ROS_PACKAGE_PATH
2、创建功能包
使用指令 catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
创建功能包,其中 <package_name>
为功能包名字,[depend1] [depend2] [depend3]
等参数代表功能包所依赖的其他包。
例如:catkin_create_pkg learning_communication rospy roscpp std - msgs std_srvs
3、代码创建(以发布者为例)
实现一个发布者,需按以下步骤进行:
- 初始化 ROS 节点:在代码中初始化 ROS 节点,使其能够与 ROS 系统进行交互。
- 注册节点信息:向 ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型,以便其他节点能够识别和接收该节点发布的消息。
- 创建消息数据:根据话题所需的消息类型,创建相应的消息数据结构,并填充数据。
- 循环发布消息:按照一定频率循环发布消息,确保消息能够持续传递给订阅者。
4、配置编译规则(在 CMakeLists.txt 中)
- 设置编译代码与生成可执行文件:
使用add_executable(string_publisher src/string_publish.cpp)
指令,将string_publish.cpp
代码文件编译生成名为string_publisher
的可执行文件。add_executable
用于添加可执行文件的生成规则 - 设置连接库:
通过target_link_libraries(string_publisher ${catkin_LIBRARIES})
,将生成的可执行文件string_publisher
与所需的库进行链接,确保程序能够正确运行。 - ROS Topi 通信编程(在 CMakeLists.txt 中)
add_executable(string_publisher src/string_publish.cpp)
target_link_libraries(string_publisher ${catkin_LIBRARIES})
add_executable(string_subscriber src/string_subscribe.cpp)
target_link_libraries(string_subscribe ${catkin_LIBRARIES})
4.ROS Service 通信编程(在 CMakeLists.txt 中)
add_executable(string_server src/string_server .cpp)
target_link_libraries(string_server ${catkin_LIBRARIES})
add_executable(string_client src/string_client .cpp)
target_link_libraries(string_client ${catkin_LIBRARIES})
5、运行项目
- 编译工作空间:在(catkin_ws)下执行
catkin_make
命令(source devel/setup.bash这是个脚本用来告诉系统所有功能包的位置),对整个工作空间进行编译,确保代码能够生成可执行文件和库。 - 运行工作节点:使用
roscore
命令启动 ROS 核心节点,为整个 ROS 系统提供必要的服务和通信支持。最后输入指令 例 rosrun learning_communication string_subscribers
2.1:ROS Topi通信编程
话题模型(发布和订阅)
如何实现一个发布者
1.初始化ros节点
2.向ROS Master注册节点信息包括发布的话题名和话题中的消息类型
3.创建消息数据
4.按照一定频率循环发布消息
如何实现一个订阅者
1.初始化ros节点
2.订阅需要的话题
3.循环等待话题消息,接收到信息后回调函数
4.在回调函数中完成消息处理
2.1.1、自定义话题消息
- 定义 msg 文件:将话题内容写入到.msg 文件中,定义消息的具体格式和字段。
- 在 package.xml 中添加功能包依赖:
- <build_depend>message_generation</build_depend>编译依赖功能包 <exec_depend>message_runtime</exec_depend>运行依赖功能包
- 查找功能包:通过
find_package(...... message_generation)
语句查找message_generation
等所需功能包。 - 添加消息文件:使用
add_message_files(FILES PersonMsg.msg)
将自定义消息文件(如PersonMsg.msg
)添加到 ROS 功能包中,告知 ROS 需要处理这些文件。 - 生成消息代码:
generate_messages(DEPENDENCIES std_msgs)
根据添加的消息文件生成对应的编程语言代码(如 C++ 头文件或 Python 类)。DEPENDENCIES std_msgs
表示生成消息代码时依赖std_msgs
包,如果消息文件中使用了其他消息包中的数据类型,必须在此处声明依赖。 - 添加运行时依赖:在
catkin_package(...... message_runtime)
中包含message_runtime
,确保在运行时能够正确处理消息。 - 在 CMakeLists.txt 中添加编译选项
- 设置需要编译的代码和生存的可执行文件
- 设置连接库
- 添加依赖项
ros topic 通信编程
add_executable(string_publisher src/string_publish.cpp)
target_link_libraries(string_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_gencpp)
add_executable(string_subscriber src/string_subscribe.cpp)
target_link_libraries(string_subscribe ${catkin_LIBRARIES})
add_dependencies(person_subscribe${PROJECT_NAME}_gencpp)
ros server通信编程
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server
${PROJECT_NAME}_gencpp)
add_executable(person_cliernt src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client
${PROJECT_NAME}_gencpp)
2.2.ROS Service通信编程
服务模型(服务端/客户端)
如何实现一个服务器
1.初始化ROS节点
2.创建server实例
3.循环等待服务请求,进入回调函数
4.在回调函数中完成服务功能的处理,并反馈应答数据
如何实现一个客户端
1.初始化ROS节点
2.创建一个Client实例
3.发布服务请求数据
4.等待Server处理之后的应答结果
2.2.1、自定义话题消息
- 定义 srv文件:将话题内容写入到.srv文件中,定义消息的具体格式和字段。
- 在 package.xml 中添加功能包依赖:
- <build_depend>message_generation</build_depend>编译依赖功能包 <exec_depend>message_runtime</exec_depend>运行依赖功能包
- 查找功能包:通过
find_package(...... message_generation)
语句查找message_generation
等所需功能包。 - 添加消息文件:使用
add_message_files(FILES PersonSrv.srv)
将自定义消息文件(如PersonSrv.srv
)添加到 ROS 功能包中,告知 ROS 需要处理这些文件。 - 生成消息代码:
generate_messages(DEPENDENCIES std_msgs)
根据添加的消息文件生成对应的编程语言代码(如 C++ 头文件或 Python 类)。DEPENDENCIES std_msgs
表示生成消息代码时依赖std_msgs
包,如果消息文件中使用了其他消息包中的数据类型,必须在此处声明依赖。 - 添加运行时依赖:在
catkin_package(...... message_runtime)
中包含message_runtime
,确保在运行时能够正确处理消息。 - 在 CMakeLists.txt 中添加编译选项:
- 编译依赖:添加
<build_depend>message_generation</build_depend>
,此功能包用于在编译过程中生成消息相关的代码。 - 运行依赖:添加
<exec_depend>message_runtime</exec_depend>
,确保在运行时能够正确处理消息。
3.ROS常用的组件
1. launch 启动文件
在 ROS 里,launch 文件是一种极为实用的工具,它能够同时启动多个节点,并且能对这些节点的参数进行配置。launch 文件使用 XML 格式编写,下面详细介绍其中常用的标签及其功能:
1.<launch>
这是 launch 文件的根标签,所有其他标签都必须包含在 <launch>
标签内。示例如下:
xml
<launch>
<!-- 这里放置其他标签 -->
</launch>
2.<node>
用于启动一个 ROS 节点。它有多个重要属性:
pkg
:指定节点所属的软件包。type
:指定节点可执行文件的名称。name
:为节点指定一个唯一的名称。output
:指定节点输出信息的处理方式,常见值有screen
(输出到终端)。
示例:
xml
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim" output="screen"/>
3.<param>
用于设置单个参数,可将参数传递给节点。其属性如下:
name
:参数的名称。value
:参数的值。
示例:
xml
<param name="robot_name" value="my_robot"/>
4.<rosparam>
用于加载 YAML 文件中的参数或者直接设置一组参数。常见属性及用法如下:
file
:指定要加载的 YAML 文件路径。command
:可以是load
(加载参数)、dump
(导出参数)等。
加载 YAML 文件示例:
xml
<rosparam file="$(find my_package)/config/params.yaml" command="load"/>
直接设置一组参数示例:
xml
<rosparam>
my_params:
param1: 10
param2: "hello"
</rosparam>
5.<arg>
用于在 launch 文件中定义和传递参数。属性如下:
name
:参数名称。default
:参数的默认值(可选)。
示例:
xml
<arg name="robot_model" default="model1"/>
<node pkg="my_package" type="my_node" name="my_node">
<param name="model" value="$(arg robot_model)"/>
</node>
6.<include>
用于包含其他 launch 文件,实现 launch 文件的复用。属性 file
用于指定要包含的 launch 文件路径。
示例:
xml
<include file="$(find my_package)/launch/another.launch"/>
7.<remap>
用于重映射话题、服务或参数的名称。属性如下:
from
:原始名称。to
:新的名称。
示例:
xml
<remap from="/input_topic" to="/new_input_topic"/>
2. TF 坐标变换
TF(Transform)是 ROS 中用于管理和处理坐标变换的强大工具,它允许你在不同坐标系之间进行转换。以下是 TF 的主要使用场景和操作方法:
1.TF 工具的使用
TF 提供了一些实用的命令行工具,帮助你查看和调试坐标变换信息
tf_echo
:用于打印两个坐标系之间的变换信息。例如,要查看base_link
到map
坐标系的变换信息,可执行:
bash
rosrun tf tf_echo map base_link
view_frames
:生成一个 PDF 文件,展示当前系统中所有坐标系之间的关系。执行以下命令:
bash
rosrun tf view_frames
执行后会在当前目录下生成一个 frames.pdf
文件,打开该文件即可查看坐标系关系图。
2.广播 TF 变换
要在 ROS 中广播坐标变换,需要创建一个 TF 广播器(TransformBroadcaster
),并定期发布变换信息。以下是一个简单的 Python 示例:
python
#!/usr/bin/env python
import rospy
import tf
if __name__ == '__main__':
rospy.init_node('tf_broadcaster')
br = tf.TransformBroadcaster()
rate = rospy.Rate(10) # 10Hz
while not rospy.is_shutdown():
br.sendTransform((1.0, 0.0, 0.0),
(0.0, 0.0, 0.0, 1.0),
rospy.Time.now(),
"child_frame",
"parent_frame")
rate.sleep()
上述代码创建了一个 TF 广播器,每秒发布 10 次 parent_frame
到 child_frame
的坐标变换信息。
3.监听 TF 变换
要获取两个坐标系之间的变换信息,需要创建一个 TF 监听器(TransformListener
)。以下是一个简单的 Python 示例:
python
#!/usr/bin/env python
import rospy
import tf
if __name__ == '__main__':
rospy.init_node('tf_listener')
listener = tf.TransformListener()
rate = rospy.Rate(10) # 10Hz
while not rospy.is_shutdown():
try:
(trans, rot) = listener.lookupTransform('parent_frame', 'child_frame', rospy.Time(0))
rospy.loginfo("Translation: %s, Rotation: %s", trans, rot)
except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
continue
rate.sleep()
该代码创建了一个 TF 监听器,每秒尝试 10 次获取 parent_frame
到 child_frame
的坐标变换信息,并将其打印输出。
3. 可视化显示与仿真工具
1.rqt
rqt 是一个基于 Qt 的可扩展可视化工具框架,它提供了各种插件,可用于监控和调试 ROS 系统。以下是一些常用的 rqt 插件及其功能:
rqt_graph
:以图形化方式展示 ROS 系统中节点和话题之间的连接关系。启动命令如下:
bash
rosrun rqt_graph rqt_graph
rqt_plot
:用于实时绘制 ROS 话题的数据曲线。例如,要绘制/cmd_vel
话题中linear.x
字段的数据曲线,可执行:
bash
rosrun rqt_plot rqt_plot /cmd_vel/linear/x
2.rviz
rviz 是一个 3D 可视化工具,可用于显示机器人模型、传感器数据(如激光雷达、摄像头等)以及坐标变换等信息。启动 rviz 的命令为:
bash
rosrun rviz rviz
启动后,你可以通过添加不同的显示插件(如 RobotModel
显示机器人模型、LaserScan
显示激光雷达数据等)来定制可视化界面。
3.gazebo
Gazebo 是一个强大的机器人仿真环境,可用于模拟机器人在不同场景下的行为。它可以与 ROS 紧密集成,方便进行机器人的开发和测试。以下是使用 Gazebo 的基本步骤:
1. 安装 Gazebo 和相关的 ROS 包:
bash
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control
2.启动 Gazebo 并加载一个世界文件:
bash
roslaunch gazebo_ros empty_world.launch
3.在 Gazebo 中加载机器人模型,可通过编写 launch 文件来实现。例如,加载 TurtleBot3 模型:
bash
roslaunch turtlebot3_gazebo turtlebot3_world.launch
在 Gazebo 中,你可以设置物理环境、添加障碍物等,同时可以通过 ROS 话题和服务与仿真中的机器人进行交互。
4.URDF机器人建模
1.机器人的定义与组成
机器人四大组成部分
1.控制系统:人体的手和脚,直接面向工作对象的机械装置
2.驱动系统:人体的肌肉和筋络,负责驱动执行机构,将控制系统下达的命令转换成执行机构需要的信号
3.执行机构:人体的感官和神经,主要完成信号的输入和反馈,包括内部传感系统和外部传感系统
4.传感系统:人体的大脑,实现任务及信息的处理,输出控制命令信号
2.URDF建模方法
1.什么是URDF?
1.Unified Robot Description Format ,统一机器人描述格式
2.ROS中一个非常重要的其机器人模型描述格式
3.可以解析URDF文件中使用XML格式描述的机器人模型
4.包含link和joint自身及相关属性的描述信息
2.<link>标签
1.<link>标签
<link>
<visual>
</visual>
<collision>
</collision>
</link>
1.描述机器人某个刚体部分的外观和物理属性
2.描述连杆尺寸(size),颜色(color),形状(shape),惯性矩镇(inertial matrix),碰撞参数(collision properties)
3.每个Link会成为一个坐标系
2.<link>标签里的几个组成部分
1.<visual>
<visual>
<geometry>
<mesh filename=" link_4.stl"/>
<orihin xyz=" 0 0 0 " rpy="0 0 0 "/>
// xyz描述xyz轴的平移(单位米) rpy 围绕三轴旋转的角度(单位弧度)
</geometry>
</visual>
描述机器人外观长什么样与机器人运动无关系
2.<collision>
<collision>
<geometry>
<cylinder length=" 0.5 " radius=" 0.1 "/>
</geometry>
<origin xyz=" 0 0 -0.5" rpy = " 0 0 0"/>
</collision>
描述机器人碰撞参数
3.惯性矩镇(inertial matrix)
物理参数运动属性
3.<joint>标签
1.<joint>描述
1.描述两个link孩子间的关系 分为六种类型
1.continuous:旋转关节,可以围绕单轴无限旋转
2.revolute:旋转关节,类似与continuous,但是有旋转的角度极限
3.prismatic:滑动关节,沿某一轴线移动的关节,带有位置极限
4.planar:平面关节,允许在平面正交方向上平移或者旋转
5.floating:滑动关节,允许进行平移,旋转运动
6.fixed:固定关节,不允许运动的特殊关节
2.包括关节运动的位置和速度限制
3.描述机器人关节的运动学和动力学属性
每一个<joint>标签里面就会有 <parent>和<child>标签
4.<robot>标签
<robot name =" <name of the robot>">
<link>.........</link>
<link>.........</link>
<joint>.........</joint>
<joint>.........</joint>
</robot>
完整机器人模型的最顶层标签
<link>和<joint>标签都必须把汉在<robot>标签内
一个完整的机器人模型,由一系列<link>和<joint>组成
3.URDF机器人模型案例分析
创建一个机器人建模的功能包
$ catkin_create_pkg mbot_description urdf xacro
urdf:存放机器人模型的URDF或xacro文件
meshes:防止URDF中引用的模型渲染文件
launch:保存相关启动文件
config:保存rviz的配置文件
5.构建机器人仿真平台
1.优化物理仿真模型
- 为link添加惯性参数和碰撞属性
- 为link添加gazebo标签
- 为joint添加传动装置
- 添加gazebo控制器插件
1.URDF模型的进化版本----xacro模型文件
1.精简模型代码
- 创建宏定义
- 文件包含
2.提供可编程接口
- 常量
- 变量
- 数学计算
- 条件语句
常量定义:<xacro:property name="M_PI" value=" 3.14159">
常量使用:<origin xyz=" 0 0 0 " rpy=" ${ M_PI/2} 0 0">
数学计算:<origin xyz=" 0 ${( motor_length+wheel_length)/2} 0 " rpy=" 0 0 0">
(注意:所有数学运算都会转换成浮点数进行,以保证运算精度)
宏定义:<xacro:macro name="name" params=" A B C">
......
</xacro: macro>
宏调用:<name A="A_value" B=" B_value" C="C_value" />
文件包含:<xacro :include filename =" $(find mbot_description)/urdf/mbot_base_gazebo.xacro"/>
2.ros_control是什么?
1.ROS为开发者提供的机器人控制中间件
2.包含一系列控制接口,传动配置借口,硬件借口,控制器工具箱等等。
3.可以帮助机器人应用功能包快速落地,体考开发效率
3.ros_control的总体框架
1.结构
1.控制器管理器:提供一种通用的接口来管理不同的控制器
2.控制器:读取硬件状态,发布控制命令,完成每个joint的控制
joint_state_controller
状态控制器
joint_effort_controller
类控制器
joint_position_controller
位置控制器
joint_velocity_controller
速度控制器
3.硬件资源:为上下两层提供硬件资源的接口
4.机器人硬件抽象:机器人硬件抽象和硬件资源直接打交道,通过write和read方法完成硬件操作
5.真实机器人:执行接收到的命令
2.模型优化
1.为Link添加惯性参数和碰撞属性
Link三大内容:
1.<visuall>可视化部分
2.,<collision>碰撞检测部分
3.<cylinder_inertial_matrix>惯性矩阵部分
2.为Link添加gazebo标签
3.为joint添加传动装置
4.添加gazebo控制器插件
<robotNamespace>:机器人的命名空间
<leftJoint>和<rightJoint>:左右轮转动的关节joint
<wheelSeparation>和<wheelDiameter>:机器人模型的相关尺寸,在计算差速参数时需要用到
<commandTopic>:控制器订阅的速度控制指令,生成全局命名是需要结合<robotNamespace>中设置的命名空间
<odometryFrame>:李成绩数据的参考坐标系,ROS中一般都命名为odom
2.创建物理仿真环境
第一种方法直接添加环境模型
第二种方法使用Building Editor
3.传感器仿真及应用
1.摄像头
<sensor>标签:描述传感器
- type:传感器类型,camera
- name:摄像头命名,自由设置
<camera>标签:描述摄像头参数
- 分辨率,编码格式,图像范围,噪音参数等
<plugin>标签:加载摄像头仿真插件
libgazebo_ros_camera.so
- 设置插件的命名空间,发布图像的话题,参考坐标系等
查看摄像头仿真图像
$ rqt_image_view
2.RGB-D摄像头仿真(kinect)
在rviz中查看kinect信息
3.激光雷达
在rviz中查看激光雷达信息
6.机器视觉处理
1.ROS摄像头驱动及数据接口
配置功能包(根据版本)
- ROS Melodic:仅支持Ubuntu 18.04 LTS。
- ROS Noetic:同时支持Ubuntu 20.04 LTS和Debian Buster,提供了更广泛的平台支持。
$sudo apt-get install ros-melodic-usb-cam
运行launch文件
$roslaunch usb_cam usb_cam-test.launch
日志
$rqt_image_view
1.usb_cam功能包中的参数
参数 类型 默认值 描述
video_device string “/dev/video0” 摄像头设备号
image_width int 640 图像横向分辨率
image_height int 480 图像纵向分辨率
pixel_format string "mjpeg" 像素编码,可选值:mjpeg , yuyv , uyvy
io_method string "mmap" IO通道,可选值:mmap,read,userptr
camera_frame_id string "head_camera" 摄像头坐标系
framerate int 30 频率
brightness int 32 亮度,0~255
saturation int 32 饱和度,0~255
contrast int 32 对比度,0~255
sharpness int 22 清晰度,0~255
autofocus bool false 自动对焦
focus int 51 焦点(非自动对焦状态下有效)
camera_info_url string - 摄像头校准文件路径
camera_name string "head_camera" 摄像头名称
2.rosmsg查看图像话题类型
Header:消息头,包含消息序号,时间戳和绑定坐标系
height:图像的纵向分辨率
width:图像的横向分辨率
encoding:图像的编码格式,包含RGB,YUV等常用格式,不设计图像压缩编码
is_bigendian:图像数据的大小端存储模式
step:一行图像数据的字节数量,作为数据的步长参数
data:存储图像数据的数组,大小为step*height个字节
压缩图像消息
format:图像的压缩编码格式(jpeg,png,bmp)
data:存储图像数据数组
3.三维点云信息数据结构定义(PointCloud2)
height:点云图像的纵向分辨率
width:点云图像的横向分辨率
fields:每个点的数据类型
is_bigendian:数据的大小段存储模式
point_step:单点的数据字节步长
data:点云数据的储存数组,总字节大小为row_step*height
is_dense:是否有无效点
2.摄像头参数标定
1.安装标定功能包
$ sudo pt-get install ros-noetic-camera-calibration(注意版本 )
- ROS Melodic:仅支持Ubuntu 18.04 LTS。
- ROS Noetic:同时支持Ubuntu 20.04 LTS和Debian Buster,提供了更广泛的平台支持。
2.启动摄像头
$ roslaunch robot_vision usb_cam.launch
启动标定包
$rorun camera_calibraion cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam
1. size:标定棋盘格的内部角点个数,这里使用的棋盘一共有六行,每行有八个内部角点
2. square:这个参数对应每个棋盘格的边长,单位是米
3. image和camera:设置摄像头发布的图像话题
3.ROS+OpenCV图形处理方法及案例
OpenCV是什么?
- Open Source Computer Vision Library
- 基于BSD许可发行的矿平台开元计算机视觉库(Linux,Windows和Mac OS)
- 由一系列C函数和少量C++类构成,同时提供C++,Python,Ruby,MATLAB等语言接口
- 实现了图像处理和计算机视觉方面的很多通用算法,而且对非商业应用和商业应用都是免费的
- 可诶直接访问硬件摄像头,并且还提供了一个简单的GUI系统---highgui
安装Opencv
$ sudo apt-get install ros-melodic-vision-opencv libopencv-dev python3-opencv
(注意版本)
- ROS Melodic:仅支持Ubuntu 18.04 LTS。
- ROS Noetic:同时支持Ubuntu 20.04 LTS和Debian Buster,提供了更广泛的平台支持。
- 对于较新版本的Ubuntu(如Ubuntu 18.04及以上),OpenCV的Python包通常命名为
python3-opencv
而不是python-opencv
。
3.ROS+OpenCV图象处理方法及案例
- imgmg_to_co2():将ROS图像消息转换成OpenCV图像数据
- cv2_to_imgmsg():将OpenCV格式的图像数据转换成ROS图像消息
输入参数
1.图像消息流
2.转换的图像数据格式
人脸识别的呈现
1.初始化部分
完成ROS节点,图像,识别参数的设置
2.回调函数
将图像转换成OpenCV的数据格式,然后与处理之后开始调用人脸识别的功能函数,最后把识别结果发布
3.人脸识别
调用OpenCV提供的人脸识别接口,与数据库中的人脸特征进行匹配
4.ROS+Tensorflow物体识别方法及方案
TensorFlow 是一个用于人工智能的开源神器
1.TensorFlow
采用数据流图,用于数值计算的开源软件库
节点在图中表示数学操作,线表示在节点间相互联系的多维数据数组,即张量(tensor)
架构灵活,可以在多种平台上展开计算
最初由Google大脑小组,(隶属与Google机器智能研究机构)的研究员和工程师们开发出来,用于及其学习和深度神经网络方面的研究 。但这个系统的通用性是器也可广泛用于其他计算领域