ROS基础

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: 可执行文件的名字。


知识树总结

  1. Navigation

    • SLAM

    • MoveIt

  2. Node

    • 定义与特性

    • ROS Master

  3. Topic

    • 发布/订阅模型

    • Message

  4. Service

    • 客户端/服务端模型

  5. Parameter

    • 全局共享字典

  6. Package

    • 功能包清单

    • 元功能包

  7. 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、代码创建(以发布者为例)

实现一个发布者,需按以下步骤进行:

  1. 初始化 ROS 节点:在代码中初始化 ROS 节点,使其能够与 ROS 系统进行交互。
  2. 注册节点信息:向 ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型,以便其他节点能够识别和接收该节点发布的消息。
  3. 创建消息数据:根据话题所需的消息类型,创建相应的消息数据结构,并填充数据。
  4. 循环发布消息:按照一定频率循环发布消息,确保消息能够持续传递给订阅者。

4、配置编译规则(在 CMakeLists.txt 中)

  1. 设置编译代码与生成可执行文件
    使用 add_executable(string_publisher src/string_publish.cpp) 指令,将 string_publish.cpp 代码文件编译生成名为 string_publisher 的可执行文件。add_executable 用于添加可执行文件的生成规则
  2. 设置连接库
    通过 target_link_libraries(string_publisher ${catkin_LIBRARIES}),将生成的可执行文件 string_publisher 与所需的库进行链接,确保程序能够正确运行。
  3. 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、运行项目

  1. 编译工作空间:在(catkin_ws)下执行 catkin_make 命令(source devel/setup.bash这是个脚本用来告诉系统所有功能包的位置),对整个工作空间进行编译,确保代码能够生成可执行文件和库。
  2. 运行工作节点:使用 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、自定义话题消息

    1. 定义 msg 文件:将话题内容写入到.msg 文件中,定义消息的具体格式和字段。
    2. 在 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、自定义话题消息

    1. 定义 srv文件:将话题内容写入到.srv文件中,定义消息的具体格式和字段。
    2. 在 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_linkmap 坐标系的变换信息,可执行:

    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_framechild_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_framechild_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机器智能研究机构)的研究员和工程师们开发出来,用于及其学习和深度神经网络方面的研究 。但这个系统的通用性是器也可广泛用于其他计算领域

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值