用ROS来完成一个安装有激光雷达的机器人模型

1.创建工作空间

主文件夹下新建一个文件夹, 命名为catkin_urdf
进入该文件夹, 再创建一个src文件夹, 并在src文件夹里运行ROS的工作空间初始化命令catkin_init_workspace
回到catkin_urdf文件夹, 使用catkin_make编译整个工作空间
最后, 打开终端, 输入echo "source ~/catkin_urdf/devel/setup.bash" >> ~/.bashrc, 设置环境变量

2.创建功能包

catkin_urdf下的src里运行catkin_create_pkg mrobot_description urdf xacro
进入mrobot_description文件夹, 新建urdf、meshes、launch、config四个文件夹, 用来存放文件, 效果如图所示:

在这里插入图片描述

3.urdf文件

在mrobot_description包的urdf文件夹下新建三个xacro文件, 其中的内容如下:
注意: 代码中不要含有中文的注释

mrobot_body.urdf.xacro

<?xml version="1.0" ?>
<robot name="mrobot_body" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:property name="M_PI" value="3.14159"/>
    <xacro:property name="wheel_radius" value="0.033"/>
    <xacro:property name="wheel_length" value="0.017"/>
    <xacro:property name="base_radius" value="0.13"/>
    <xacro:property name="base_length" value="0.005"/>
    <xacro:property name="motor_radius" value="0.02"/>
    <xacro:property name="motor_length" value="0.08"/>
    <xacro:property name="motor_x" value="0.055"/>
    <xacro:property name="motor_y" value="0.075"/>
    <xacro:property name="plate_height" value="0.07"/>
    <xacro:property name="standoff_x" value="0.12"/>
    <xacro:property name="standoff_y" value="0.1"/>

    <!-- Defining the colors used in this robot -->
    <material name="yellow">
        <color rgba="1 0.4 0 1"/>
    </material>
    <material name="black">
        <color rgba="0 0 0 0.95"/>
    </material>
    <material name="gray">
        <color rgba="0.75 0.75 0.75 1"/>
    </material>
    <material name="white">
        <color rgba="1 1 1 0.9"/>
    </material>


    <link name="base_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <cylinder length="${base_length}" radius="${base_radius}"/>
            </geometry>
            <material name="yellow"/>
        </visual>

        <inertial>
            <mass value="2"/>
            <origin xyz="0 0 0.0"/>
            <inertia ixx="0.01" ixy="0" ixz="0"
                     iyy="0.01" iyz="0"
                     izz="0.5"/>
        </inertial>

        <collision>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <cylinder length="${base_length}" radius="${base_radius}"/>
            </geometry>
        </collision>
    </link>

    <joint name="base_left_motor_joint" type="fixed">
        <origin xyz="${-1 * motor_x} ${motor_y} 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="left_motor"/>
    </joint>

    <link name="left_motor">
        <visual>
            <origin xyz="0 0 0" rpy="${M_PI / 2} 0 0"/>
            <geometry>
                <cylinder radius="${motor_radius}" length="${motor_length}"/>
            </geometry>
            <material name="gray"/>
        </visual>

        <inertial>
            <origin xyz="0.0 0 0"/>
            <mass value="0.1"/>
            <inertia ixx="0.001" ixy="0.0" ixz="0.0"
                     iyy="0.001" iyz="0.0"
                     izz="0.001"/>
        </inertial>

        <collision>
            <origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>
            <geometry>
                <cylinder radius="${motor_radius}" length="${motor_length}"/>
            </geometry>
        </collision>
    </link>

    <joint name="left_wheel_joint" type="continuous">
        <origin xyz="0 ${(motor_length + wheel_length) / 2} 0" rpy="0 0 0"/>
        <parent link="left_motor"/>
        <child link="left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="${M_PI / 2} 0 0"/>
            <geometry>
                <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
            </geometry>
            <material name="white"/>
        </visual>

        <inertial>
            <origin xyz="0 0 0"/>
            <mass value="0.01" />
            <inertia ixx="0.001" ixy="0.0" ixz="0.0"
                     iyy="0.001" iyz="0.0"
                     izz="0.001" />
        </inertial>

        <collision>
            <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
            <geometry>
                <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
            </geometry>
        </collision>
    </link>

    <joint name="base_right_motor_joint" type="fixed">
        <origin xyz="${-1 * motor_x} ${-1 * motor_y} 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="right_motor"/>
    </joint>

    <link name="right_motor">
        <visual>
            <origin xyz="0 0 0" rpy="${M_PI / 2} 0 0"/>
            <geometry>
                <cylinder radius="${motor_radius}" length="${motor_length}"/>
            </geometry>
            <material name="gray"/>
        </visual>

        <inertial>
            <origin xyz="0.0 0 0"/>
            <mass value="0.1" />
            <inertia ixx="0.001" ixy="0.0" ixz="0.0"
                     iyy="0.001" iyz="0.0"
                     izz="0.001" />
        </inertial>

        <collision>
            <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
            <geometry>
                <cylinder radius="${motor_radius}" length = "${motor_length}"/>
            </geometry>
        </collision>
    </link>

    <joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 ${ (wheel_length + motor_length) / (-2) } 0" rpy="0 0 0"/>
        <parent link="right_motor"/>
        <child link="right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="${M_PI / 2} 0 0"/>
            <geometry>
                <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
            </geometry>
            <material name="white"/>
        </visual>

        <inertial>
            <origin xyz="0 0 0"/>
            <mass value="0.01" />
            <inertia ixx="0.001" ixy="0.0" ixz="0.0"
                     iyy="0.001" iyz="0.0"
                     izz="0.001" />
        </inertial>

        <collision>
            <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
            <geometry>
                <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
            </geometry>
        </collision>
    </link>

    <joint name="front_caster_joint" type="fixed">
        <origin xyz="${base_radius - wheel_radius / 2} 0 -${wheel_radius / 2}" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
    </joint>

    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="${M_PI / 2} 0 0"/>
            <geometry>
                <sphere radius="${wheel_radius / 2}"/>
            </geometry>
            <material name="black"/>
        </visual>

        <inertial>
            <origin xyz="0 0 0"/>
            <mass value="0.001"/>
            <inertia ixx="0.0001" ixy="0.0" ixz="0.0"
                     iyy="0.0001" iyz="0.0"
                     izz="0.0001"/>
        </inertial>

        <collision>
            <origin xyz="0 0 0.01" rpy="${M_PI/2} 0 0"/>
            <geometry>
                <sphere radius="${wheel_radius/2}"/>
            </geometry>
        </collision>
    </link>

    <!--  the supportColumn -->
    <xacro:macro name="support_column" params="parent number x_loc y_loc z_loc">
        <joint name="support_column_${number}_joint" type="fixed">
            <origin xyz="${x_loc} ${y_loc} ${z_loc}" rpy="0 0 0"/>
            <parent link="${parent}"/>
            <child link="support_column_${number}_link"/>
        </joint>

        <link name="support_column_${number}_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <box size="0.01 0.01 0.07"/>
                </geometry>
                <material name="black"/>
            </visual>

            <interial>
                <mass value="0.001"/>
                <origin xyz="0 0 0"/>
                <interia ixx="0.0001" ixy="0" ixz="0"
                         iyy="0.0001" iyz="0"
                         izz="0.0001"/>
            </interial>

            <collision>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <box size="0.01 0.01 0.07"/>
                </geometry>
            </collision>
        </link>

    </xacro:macro>


    <!-- the supportPlate -->
    <xacro:macro name="support_plate" params="parent number height">
        <joint name="support_plate_${number}_joint" type="fixed">
            <origin xyz="0 0 ${height}" rpy="0 0 0"/>
            <parent link="${parent}"/>
            <child link="support_plate_${number}_link"/>
        </joint>

        <link name="support_plate_${number}_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
                <material name="yellow"/>
            </visual>

            <inertial>
                <mass value="2"/>
                <origin xyz="0 0 0.0"/>
                <inertia ixx="0.01" ixy="0" ixz="0"
                         iyy="0.01" iyz="0"
                         izz="0.5"/>
            </inertial>

            <collision>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <cylinder length="${base_length}" radius="${base_radius}"/>
                </geometry>
            </collision>
        </link>

    </xacro:macro>


    <!-- create 4 supportColumns (1) -->
    <support_column parent="base_link" number="1" x_loc="-${standoff_x / 2 + 0.03}" y_loc="-${standoff_y - 0.03}"
                    z_loc="${plate_height / 2}"/>
    <support_column parent="base_link" number="2" x_loc="-${standoff_x / 2 + 0.03}" y_loc="${standoff_y - 0.03}"
                    z_loc="${plate_height / 2}"/>
    <support_column parent="base_link" number="3" x_loc="${standoff_x / 2}" y_loc="-${standoff_y}"
                    z_loc="${plate_height / 2}"/>
    <support_column parent="base_link" number="4" x_loc="${standoff_x / 2}" y_loc="${standoff_y}"
                    z_loc="${plate_height / 2}"/>

    <!-- create 4 supportColumns (2) -->
    <support_column parent="base_link" number="5" x_loc="-${standoff_x / 2 + 0.03}" y_loc="-${standoff_y - 0.03}"
                    z_loc="${1.5 * plate_height + base_length}"/>
    <support_column parent="base_link" number="6" x_loc="-${standoff_x / 2 + 0.03}" y_loc="${standoff_y - 0.03}"
                    z_loc="${1.5 * plate_height + base_length}"/>
    <support_column parent="base_link" number="7" x_loc="${standoff_x / 2}" y_loc="-${standoff_y}"
                    z_loc="${1.5 * plate_height + base_length}"/>
    <support_column parent="base_link" number="8" x_loc="${standoff_x / 2}" y_loc="${standoff_y}"
                    z_loc="${1.5 * plate_height + base_length}"/>

    <!-- create 2 SupportPlates -->
    <support_plate parent="base_link" number="1" height="${plate_height + base_length}"/>
    <support_plate parent="base_link" number="2" height="${2 * plate_height + 1.5 * base_length}"/>

</robot>

rplidar.xacro

<?xml version="1.0" ?>
<robot name="laser" xmlns:xacro="http://www.ros.org/wiki/xacro">

    <xacro:macro name="rplidar" params="prefix:=laser">
        <link name="${prefix}_link">
            <visual>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <cylinder length="0.05" radius="0.05" />
                </geometry>
                <material name="black"/>
            </visual>

            <inertial>
                <mass value="0.1"/>
                <origin xyz="0 0 0"/>
                <inertia ixx="0.01" ixy="0" ixz="0"
                         iyy="0.01" iyz="0"
                         izz="0.01"/>
            </inertial>

            <collision>
                <origin xyz="0 0 0" rpy="0 0 0"/>
                <geometry>
                    <cylinder length="0.05" radius="0.05"/>
                </geometry>
            </collision>

        </link>

    </xacro:macro>
</robot>

mrobot_with_rplidar.urdf.xacro

<?xml version="1.0" ?>
<robot name="mrobot" xmlns:xacro="http://www.ros.org/wiki/xacro" >

    <xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro"/>
    <xacro:include filename="$(find mrobot_description)/urdf/rplidar.xacro"/>

    <xacro:property name="rplidar_offset_x" value="0"/>
    <xacro:property name="rplidar_offset_y" value="0"/>
    <xacro:property name="rplidar_offset_z" value="0.028"/>

    <mrobot_body/>

    <!-- rplidar -->
    <joint name="rplidar_joint" type="fixed">
        <origin xyz="${rplidar_offset_x} ${rplidar_offset_y} ${rplidar_offset_z}" rpy="0 0 0"/>
        <parent link="support_plate_2_link"/>
        <child link="laser_link"/>
    </joint>

    <xacro:rplidar prefix="laser"/>

</robot>

4.launch文件

在mrobot_description包的launch文件夹下新建一个launch文件, 命名为with_rplidar.launch, 其中的内容如下:

<launch>
    <param name="use_gui" value="true"/>

    <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot_urdf.rviz" required="true" />

	<!--   xacro ===> urdf       rplidar     -->
	<arg name="model" default="$(find xacro)/xacro --inorder '$(find mrobot_description)/urdf/mrobot_with_rplidar.urdf.xacro' "/>
	<param name="robot_description" command="$(arg model)" />

 </launch>

5.运行rviz

直接在终端输入下面的命令, 并在rviz软件中, 将Fixed Frame设置为base_link, 然后添加RobotModel, 即可在rviz中看到安装有激光雷达的机器人模型

roslaunch mrobot_description with_rplidar.launch 

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器人操作系统 ROS机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。 ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。 1 发展目标 2 ROS的概念 2.1 ROS 的 Filesystem Level 2.2 ROS 的 Computation Graph Level 3 参考文献 4 外部链接 发展目标 ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。 为了实现“共享与协作”这一首要目标,人们制订了ROS架构中的其他支援性目标: “轻便”:ROS是设计得尽可能方便简易。您不必替换主框架与系统,因为ROS编写的代码可以用于其他机器人软件框架中。毫无疑问的,ROS更易于集成与其他机器人软件框架。事实上ROS完成与OpenRAVE、Orocos和Player的整合。 ROS-agnostic库:【agnostic:不可知论】建议的开发模型是使用clear的函数接口书写ROS-agnostic库。 语言独立性:ROS框架很容易在任何编程语言中执行。我们已经能在Python和C++中顺利运行,同时添加有Lisp、Octave和Java语言库。 测试简单:ROS一个内建的单元/组合集测试框架,称为“rostest”。这使得集成调试和分解调试很容易。 扩展性:ROS适合于大型实时系统与大型的系统开发项目。 ROS的概念 ROS有三个层次的概念:分别为Filesystem level,Computation graph level, 以及Communication level。 以下内容具体的总结了这些层次及概念。除了这三个层次的概念, ROS也定义了两种名称-- Package资源名称和Graph资源名称。同样会在以下内容中提及。 ROS 的 Filesystem Level 文件系统层概念就是你在碟片里面遇到的资源,例如: Packages:ROS的基本组织,可以包含任意格式文件。一个Package 可以包含ROS执行时处理的文件(nodes),一个ROS的依赖库,一个数据集合,配置文件或一些有用的文件在一起。 Manifests:Manifests (manifest.xml) 提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。 Stacks: Stacks 是Packages的集合,它提供一个完整的功能,像“navigation stack” Stack与版本号关联,同时也是如何发行ROS软件方式的关键。 Manifest Stack Manifests: Stack manifests (stack.xml) 提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。 Message (msg) types: 信息描述, 位置在路径:my_package/msg/MyMessageType.msg, 定义数据类型在ROS的 messages ROS里面。 Service (srv) types: 服务描述,位置在路径:my_package/srv/MyServiceType.srv, 定义这个请求和相应的数据结构 在ROS services 里面。 ROS 的 Computation Graph Level Computation Graph Level(计算图)就是用ROS的P2P(peer-to-peer网络传输协议)网络集中处理所有的数据。基本的Computation Graph的概念包括Node, Master, Parameter Sever,messages, services, topics, 和bags, 以上所有的这些都以不同的方式给Graph传输数据。 Nodes: Nodes(节点)是一系列运行中的程序。ROS被设计成在一定颗粒度下的模块化系统。一个机器人控制系统通常包含许多Nodes。比如一个Node控制激光雷达一个Node控制车轮马达,一个Node处理定位,一个Node执行路径规划,另外一个提供图形化界面等等。一个ROS节点是由Libraries ROS client library写成的, 例如 roscpp 和 rospy. Master: ROS Master 提供了登记列表和对其他计算图的查找。没有Master,节点将无法找到其他节点,交换消息或调用服务。 Server Parameter Server: 参数服务器使数据按照钥匙的方式存储。目前,参数服务器是主持的组成部分。 Messages:节点之间通过messages来传递消息。一个message是一个简单的数据结构,包含一些归类定义的区。支持标准的原始数据类型(整数、浮点数、布尔数,等)和原始数组类型。message可以包含任意的嵌套结构和数组(很类似于C语言的结构structs) Topics: Messages以一种发布/订阅的方式传递。一个node可以在一个给定的topic中发布消息。Topic是一个name被用于描述消息内容。一个node针对某个topic关注与订阅特定类型的数据。可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个topic同时发布或订阅多个topic。总体上,发布者和订阅者不了解彼此的存在。主要的概念在于将信息的发布者和需求者解耦、分离。逻辑上,topic可以看作是一个严格规范化的消息bus。每个bus有一个名字,每个node都可以连接到bus发送和接受符合标准类型的消息。 Services:发布/订阅模型是很灵活的通讯模式,但是多对多,单向传输对于分布式系统中经常需要的“请求/回应”式的交互来说并不合适。因此,“请求/回应” 是通过services来实现的。这种通讯的定义是一种成对的消息:一个用于请求,一个用于回应。假设一个节点提供了一个服务提供下一个name和客户使用服务发送请求消息并等待答复。ROS的客户库通常以一种远程调用的方式提供这样的交互。 Bags: Bags是一种格式,用于存储和播放ROS消息。对于储存数据来说Bags是一种很重要的机制。例如传感器数据很难收集但却是开发与测试中必须的。 在ROS的计算图中,ROS的Master以一个name service的方式工作。它给ROS的节点存储了topics和service的注册信息。Nodes 与Master通信从而报告它们的注册信息。当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。 节点之间的连接是直接的; Master仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接。ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口。 这样的架构允许脱钩工作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段。names方式在ROS系统中扮演极为重要的角色: topics, services, and parameters 都有各自的names。每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。 例如,为了控制一个北阳激光测距仪(Hokuyo laser range-finder),我们可以启动这个hokuyo_node 驱动,这个驱动可以给与激光仪进行对话并且在"扫描"topic下可以发布sensor_msgs/LaserScan 的信息。为了处理数据,我们也许会写一个使用laser_filters的node来订阅"扫描"topic的信息。订阅之后,我们的过滤器将会自动开始接收激光仪的信息。 注意两边是如何脱钩工作的。 所有的hokuyo_node的节点都会完成发布"扫描",不需要知道是否有节点被订阅了。所有的过滤器都会完成"扫描"的订阅,不论知道还是不知道是否有节点在发布"扫描"。 在不引发任何错误的情况下,这两个nodes可以任何的顺序启动,终止,或者重启。 以后我们也许会给我们的机器人加入另外一个激光器,这会导致我们重新设置我们的系统。我们所需要做的就是重新映射已经使用过的names。当我们开始我们的第一个hokuyo_node时,我们可以说它用base_scan代替了映射扫描,并且和我们的过滤器节点做相同的事。现在,这些节点将会用base_scan的topic来通信从而代替,并且将不再监听"扫描"topic的信息。然后我们就可以为我们的新激光测距仪启动另外一个hokuyo_node。 参考文献 http://www.ros.org/wiki/ros http://bbs.axnzero.com/index.php http://blog.sina.com.cn/digital2image2processing
Exbot易科机器人实验维护书籍,提供学习镜像包括indigo和kinetic等,努力为ROS爱好者和开发人员提供力所能及的服务。, 本书第2版概括性地介绍了ROS系统的各种工具。ROS一个先进的机器人操作系统框架,现今已有数百个研究团体和公司将其应用在机器人行业中。对于机器人技术的非专业人士来说,它也相对容易上手。在本书中,你将了解如何安装ROS,如何开始使用ROS的基本工具,以及最终如何应用先进的计算机视觉和导航工具。, 在阅读本书的过程中无需使用任何特殊的设备。书中每一章都附带了一系列的源代码示例和教程,你可以在自己的计算机上运行。这是你唯一需要做的事情。, 当然,我们还会告诉你如何使用硬件,这样你可以将你的算法应用到现实环境中。我们在选择设备时特意选择一些业余用户负担得起的设备,同时涵盖了在机器人研究中最典型的传感器或执行器。, 最后,由于ROS系统的存在使得整个机器人具备在虚拟环境中工作的能力。你将学习如何创建自己的机器人并结合功能强大的导航功能包集。此外如果使用Gazebo仿真环境,你将能够在虚拟环境中运行一切。第2版在最后增加了一章,讲如何使用“Move it!”包控制机械臂执行抓取任务。读完本书后,你会发现已经可以使用ROS机器人进行工作了,并理解其背后的原理。, 主要内容, 第1章介绍安装ROS系统最简单的方法,以及如何在不同平台上安装ROS,本书使用的版本是ROS Hydro。这一章还会说明如何从Debian软件包安装或从源代码进行编译安装,以及在虚拟机和ARM CPU中安装。, 第2章涉及ROS框架及相关的概念和工具。该章介绍节点、主题和服务,以及如何使用它们,还将通过一系列示例说明如何调试一个节点或利用可视化方法直观地查看通过主题发布的消息。, 第3章进一步展示ROS强大的调试工具,以及通过对节点主题的图形化将节点间的通信数据可视化。ROS提供了一个日志记录API来轻松地诊断节点的问题。事实上,在使用过程中,我们会看到一些功能强大的图形化工具(如rqt_console和rqt_graph),以及可视化接口(如rqt_plot和rviz)。最后介绍如何使用rosbag和rqt_bag记录并回放消息。, 第4章介绍ROS系统与真实世界如何连接。这一章介绍在ROS下使用的一些常见传感器和执行器,如激光雷达、伺服电动机、摄像头、RGB-D传感器、GPS等。此外,还会解释如何使用嵌入式系统与微控制器(例如非常流行的Arduino开发板)。, 第5章介绍ROS对摄像头和计算机视觉任务的支持。首先使用FireWire和USB摄像头驱动程序将摄像头连接到计算机并采集图像。然后,你就可以使用ROS的标定工具标定你的摄像头。我们会详细介绍和说明什么是图像管道,学习如何使用集成了OpenCV的多个机器视觉API。最后,安装并使用一个视觉里程计软件。, 第6章将展示如何在ROS节点中使用点云库。该章从基本功能入手,如读或写PCL数据片段以及发布或订阅这些消息所必需的转换。然后,将在不同节点间创建一个管道来处理3D数据,以及使用PCL进行缩减采样、过滤和搜索特征点。, 第7章介绍在ROS系统中实现机器人的第一步是创建一个机器人模型,包括在Gazebo仿真环境中如何从头开始对一个机器人进行建模和仿真,并使其在仿真环境中运行。你也可以仿真摄像头和激光测距传感器,为后续学习如何使用ROS的导航功能包集和其他工具奠定基础。, 第8章是两章关于ROS导航功能包集中的第1章。该章介绍如何对你的机器人进行使用导航功能包集所需的初始化配置。然后用几个例子对导航功能包集进行说明。, 第9章延续第8章的内容,介绍如何使用导航功能包集使机器人有效地自主导航。该章介绍使用ROS的Gazebo仿真环境和rviz创建一个虚拟环境,在其中构建地图、定位机器人并用障碍回避做路径规划。, 第10章讨论ROS中移动机器人机械臂的一个工具包。该章包含安装这个包所需要的文档,以及使用MoveIt!操作机械臂进行抓取、放置,简单的运动规划等任务的演示示例。, 预备知识, 我们写作本书的目的是让每位读者都可以完成本书的学习并运行示例代码。基本上,你只需要在计算机上安装一个Linux发行版。虽然每个Linux发行版应该都能使用,但还是建议你使用Ubuntu 12.04 LTS。这样你可以根据第1章的内容安装ROS Hydro。, 对于ROS的这一版本,你将需要Ubuntu 14.04之前的版本,因为之后的版本已经不再支持Hydro了。, 对于硬件要求,一般来说,任何台式计算机或笔记本电脑都满足。但是,最好使用独立显卡来运行Gazebo仿真环境。此外,如果有足够的外围接口将会更好,因为这样你可以连接几个传感器和执行器,包括摄像头和Arduino开发板。, 你还需要Git(g

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值