机器人学习之项目- Project1 : Go Chase it!(三)

6.机器人传感器

前面,通过创建URDF文件构建了一个非常基本的机器人模型。然后,增强了模型,并在底盘的每侧各添加了一个轮子和一个关节。现在,给机器人添加传感器,以感知周围的环境。添加两个传感器——一个摄像头和一个激光雷达。

传感器

相机:摄像机是机器人技术中最常见的传感器之一。与其他传感器相比,它们以高分辨率捕获人类容易理解的信息。每张图像都有数百万像素。为了从相机图像中提取深度信息,人们已经开始使用立体相机。它们的工作原理就像你的眼睛一样,能够估计物体的距离。

激光雷达:激光雷达代表光探测和测距。它使用激光阵列来感知环境的“点云”模型。激光雷达每秒测量成千上万次,建立了一个精确的世界模型。然而,它的分辨率远不如相机高。

添加摄像头

首先,添加相机链接和相应的接头。打开my_robot。Xacro文件,并根据以下规格添加相机传感器:

  • link name 链接名称- "camera"“相机”

  • link origin 链接原点- "[0, 0, 0, 0, 0, 0]"

  • geometry 几何形状- 尺寸为 "[0.05, 0.05, 0.05]" 的盒子

  • mass 质量- "0.1"

  • box_inertia 盒子惯性- m="0.1" x="0.05" y="0.05" z="0.05"

  • inertia 惯性- ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6"

  • joint name 关节名称- "camera_joint"

  • joint type 关节类型- "fixed"“固定”

  • joint axis 关节轴- "[0, 1, 0]"

  • joint origin 关节原点- "[0.2, 0, 0, 0, 0, 0]"

  • joint parent link 关节父链接- "chassis"“底盘”

  • joint child link 关节子链接- "camera"“相机”

正如我们在前一节中提到的,每个链接都应该有自己的视觉visual,碰撞collision和惯性元素inertial

添加激光雷达

现在,让我们添加激光雷达传感器。ROS支持许多不同类型的传感器http://wiki.ros.org/Sensors#A2D_range_finders。其中一款是Hokuyo测距传感器,用于本机器人项目。

Hokuyo传感器可以像相机传感器一样添加到机器人模型中,只是首先需要向机器人模型添加一个网格文件。网格文件定义了您正在处理的对象或模型的形状。有一些基本的形状,如盒子或圆柱体,不需要网格文件。然而,对于更高级的设计,网格文件是必需的。网格文件应该位于一个名为网格的目录中,可以在包文件夹my_robot中创建该目录。

1)创建meshes网格目录

my_robot中创建一个meshes网格目录,以保存传感器网格文件:

$ cd /home/workspace/catkin_ws/src/my_robot/
$ mkdir meshes

2)现在下载这个 hokuyo.dae文件,并将其放在刚刚创建的meshes网格目录下。

想知道从哪里得到了Hokuyo传感器的网格文件?Gazebo共享整个模型库http://models.gazebosim.org/的网格文件。

3)添加Hokuyo传感器到my_robot.xacro

以下是Hokuyo激光雷达传感器规格:

  • link name 链接名称- "hokuyo"

  • link origin 链接原点- "[0, 0, 0, 0, 0, 0]"

  • geometry for <collision> 几何形状- 尺寸为 "[0.1, 0.1, 0.1]"的盒子

  • geometry for <visual> 几何形状- filename = “package://my_robot/meshes/hokuyo.dae”

  • mass 质量- "1e-5"

  • inertia 惯性- ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6"

  • joint name 关节名称- "hokuyo_joint"

  • joint type 关节类型- "fixed""固定"

  • joint axis 关节轴- "[0 1 0]"

  • joint origin 关节原点- "[0.15, 0, .1, 0, 0, 0]"

  • joint parent link 关节父链接- "chassis"

  • joint child link 关节子链接- "hokuyo"

同上,每个链接都应该有自己的视觉visual,碰撞collision和惯性元素inertial

启动

不错!现在创建了一个机器人模型,并添加了传感器。然后可以在Gazebo中测试更新后的模型:

$ cd /home/workspace/catkin_ws/
$ source devel/setup.bash
$ roslaunch my_robot world.launch

总结:按照以下步骤为机器人添加两个传感器:

7.Gazebo插件

机器人配置了传感器,就能看到周围的世界!但摄像机传感器在模拟中究竟是如何拍摄这些图像的呢?激光雷达传感器如何在模拟中进行激光测量?机器人在模拟环境中究竟是如何移动的?URDF本身也无能为力。所以,Gazebo允许实现特定用例的插件。

传感器和执行器插件

我们将介绍三个这样的插件的使用:

  • 相机传感器的插件。

  • Hokuyo激光雷达传感器的插件。

  • 用于车轮关节驱动器的插件。

添加插件

下载 my_robot.gazebo文件,其中包括上面提到的3个插件,并将其放在my_robot的urdf目录中。

Gazebo插件文件

基于两轮移动机器人,我们将使用一个实现差动驱动控制器的插件。让我们看看my_robot中是如何定义my_robot.gazebo插件的。

<gazebo>
  <pluginname="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
    <legacyMode>false</legacyMode>
    <alwaysOn>true</alwaysOn>
    <updateRate>10</updateRate>
    <leftJoint>left_wheel_hinge</leftJoint>
    <rightJoint>right_wheel_hinge</rightJoint>
    <wheelSeparation>0.4</wheelSeparation>
    <wheelDiameter>0.2</wheelDiameter>
    <torque>10</torque>
    <commandTopic>cmd_vel</commandTopic>
    <odometryTopic>odom</odometryTopic>
    <odometryFrame>odom</odometryFrame>
    <robotBaseFrame>robot_footprint</robotBaseFrame>
    <publishWheelTF>false</publishWheelTF>
    <publishWheelJointState>false</publishWheelJointState>
    <rosDebugLevel>na</rosDebugLevel>
    <wheelAcceleration>0</wheelAcceleration>
    <wheelTorque>5</wheelTorque>
    <odometrySource>world</odometrySource>
    <publishTf>1</publishTf>
    <publishOdomTF>true</publishOdomTF>
  </plugin>
</gazebo>

libgazebo_ros_diff_drive. so是通过编译c++源代码创建的共享目标文件。插件接受特定于机器人模型的信息,比如车轮分离,关节名称等等。然后,它计算并发布机器人的里程表信息到指定的主题,如odom。在下一节中,将向机器人发送速度命令,使其向特定方向移动。该控制器有助于实现这一结果。

如果想了解这个插件是如何创建的,可以参考它的c++源代码https://bitbucket.org/osrf/gazebo/src/afe08834571835008fa7419f1feba5b7f89b9d62/plugins/DiffDrivePlugin.cc?at=gazebo7&fileviewer=file-view-default

Gazebo已经有几个这样的插件公开可用。我们将利用现有的相机传感器插件http://gazebosim.org/tutorials?tut=ros_gzplugins#Camera和Hokuyo激光雷达传感器插件。这两个都已经包含在my_robot. gazebo中。

ROS的通讯

需要定义每个传感器发布的主题,对于车轮关节,是cmd_vel主题。

<commandTopic>cmd_vel</commandTopic>

对于相机,是rgb/image_raw主题。

<imageTopicName>rgb/image_raw</imageTopicName>

对于激光雷达,它是scan主题。

<topicName>/scan</topicName>

导入插件

在我们继续使用ROS测试这些传感器和执行器之前,需要确保插件是由URDF my_robot. xacro文件导入的。通过将以下代码添加到文件顶部(在定义robot_footprint链接之前)来导入传感器插件:

<xacro:include filename="$(find my_robot)/urdf/my_robot.gazebo" />

现在,已经准备好用ROS测试这些传感器了!

总结:按照以下步骤将Gazebo传感器插件添加到机器人:

8.RViz基础

RViz

RViz代表ROS可视化。RViz是个一站式工具,可以可视化机器人的所有三个核心方面:感知、决策和驱动。

虽然Gazebo是一个物理模拟器,但RViz可以可视化在ROS主题上发布的任何类型的传感器数据:相机图像、点云、超声波测量、激光雷达数据、惯性测量等等。这些数据可以是直接来自传感器的实时流,也可以是存储为包文件的预录制数据。还可以可视化机器人的活动关节角度值,从而构建机器人的实时3D表现。尽管如此,RViz不是一个模拟器,也不与物理引擎交互。所以RViz既不模拟碰撞也不模拟动力学。RViz并不是Gazebo的替代品,而是用于监视机器人系统下的每个进程的补充工具。

运行RViz

因为RViz是一个ROS包,所以它需要roscore。在一个终端启动roscore:

$ roscore

在另一个终端运行rviz:

$ rosrun rviz rviz

显示

要在3D视图中显示任何内容,首先需要加载一个适当的显示:可以简单到基本的3D形状,也可以是复杂的机器人模型。还可显示可视化传感器数据流,如3D点云、激光雷达扫描或深度图像。默认情况下,RViz以两个不可删除的固定属性字段开始:Global Options和Global Status,一个用于简单的全局设置,另一个检测并显示有用的状态通知。有关RViz的更多信息,请查看官方指南http://wiki.ros.org/rviz/UserGuide

9.RViz集成

在本节中,将把模型显示到RViz中,并可视化来自相机和激光雷达传感器的数据。还将驱动机器人行驶!

修改robot_description

首先修改robot_description. launch文件。打开文件在第一个参数定义之后添加以下行。

<!-- Send fake joint values-->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
  <param name="use_gui" value="false"/>
</node>

<!-- Send robot states to tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" respawn="false" output="screen"/>

以上添加了两个节点——joint_state_publisher和robot_state_publisher。

  • joint_state_publisher: 发布机器人的关节状态信息,比如非固定关节的角度。

  • robot_state_publisher: 将机器人的状态发布到tf(转换树)。机器人模型有几个帧对应于每个链接/关节,robot_state_publisher发布所有这些链接的3D姿态。这提供了一个方便和高效的优势,特别是对于更复杂的机器人。

修改的world. launch

接下来,需要启动RViz和Gazebo。打开world.launch文件,在urdf_spawner节点定义后添加这些元素:

<!--launch rviz--><nodename="rviz"pkg="rviz"type="rviz"respawn="false"/>

这将创建一个启动包rviz的节点。让我们启动它🚀

启动!

$ cd /home/workspace/catkin_ws/
$ source devel/setup.bash
$ roslaunch my_robot world.launch

这次Gazebo和RViz应该同时上线了!

RViz设置

设置RViz以可视化传感器读数。在RViz的左侧,在Displays下面:

-Select odom for fixed frame

-单击Add按钮和

  • 添加RobotModel,机器人模型应该加载在RViz

  • 添加Camera并选择在Camera Gazebo插件中定义的Image topic(Image主题)

  • 添加LaserScan并选择在Hokuyo Gazebo插件中定义的topic (主题)

添加物体

在 Gazebo中,机器人前面添加一个盒子、球体或圆柱体物体。机器人的传感器应该能够看到它。可以查看RViz左下角的Camera viewer,以查看新对象的图片。此外,在场景中可以看见红色的激光扫描线,从物体表面反射。

机器人行走

当上面的一切仍在运行时,测试机器人的执行器并驾驶它四处走动。打开一个新的终端窗口,向机器人的车轮执行器发布速度命令:

$ cd /home/workspace/catkin_ws/
$ source devel/setup.bash
$ rostopic pub /cmd_vel geometry_msgs/Twist  "linear:
  x: 0.1
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.1"

这个命令将消息发布到cmd_vel,这是一个在驱动器控制器插件中定义的主题。设置linear. x和angular. z值,使机器人开始绕圈移动!

总结:按照以下步骤,用RViz测试机器人的传感器和执行器:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值