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
总结:按照以下步骤为机器人添加两个传感器:
![](https://i-blog.csdnimg.cn/blog_migrate/408787ac303ca0cef1eabaaf19a7456f.png)
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传感器插件添加到机器人:
![](https://i-blog.csdnimg.cn/blog_migrate/8fbc126ae361edf17e1a0e52796ed760.png)
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测试机器人的传感器和执行器:
![](https://i-blog.csdnimg.cn/blog_migrate/c08d4bcc1ae508255b07d991317b9570.png)