系列文章:
8.我们从电话控制ROS控制,GPS节点7.机器人本地化:映射,AMCL,房间地图上的参考点6.带轮编码器的里程表,房间地图,激光雷达5.我们在rviz和凉亭中工作:xacro,新传感器。4.使用rviz和gazebo编辑器创建机器人仿真。3.加速,更换相机,固定步态2.软件1.铁上一次,实现了以下目标:
- 通过创建一个包含机器人的urdf描述的xacro文件来可视化机器人;
- 创建两个启动文件,其中一个允许您将机器人放置在编辑器模拟器Gazebo中;
- 通过键盘控制凉亭模拟器中的机器人。
在本文中,我们将以xacro模块的形式安排项目,以使其更具可读性(为清楚起见,我们将整个说明压入了一个xacro文件中)。 添加虚拟摄像机和imu。 让我们看看如何将凉亭添加到我们周围世界的异物中。
首先,使用roscd命令检查终端是否在ROS系统中导航:
roscd rosbots_description/launch
如果不起作用,请使用catkin_ws转到文件夹并执行以下命令:
source devel/setup.bash
现在,我们转到包含机器人说明的文件夹:
roscd rosbots_description/launch
在先前创建的spawn.launch文件中,指示以下内容:
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
cat命令用于将rosbots.xacro的内容加载到robot_description参数中。
为了充分利用xacro命令格式,需要对代码进行稍微更正。 用以下内容替换上面的行:
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" />
现在,系统将使用xacro.py执行rosbots.xacro。
第二个启动文件rviz.launch将需要相同的更改。
改变
<param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" />
在
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/>
检查所有内容都可以使用新语法。
首先,在rviz编辑器中查看模型:
roslaunch rosbots_description rviz.launch
然后,关闭rviz,签入凉亭。
第一航站楼:
roslaunch gazebo_ros empty_world.launch
第二名:
roslaunch rosbots_description spawn.launch
*您可以看到消息
黄色 xacro: Traditional processing is deprecated. Switch to --inorder processing! To check for compatibility of your document, use option --check-order. For more infos, see http://wiki.ros.org/xacro#Processing_Order xacro.py is deprecated; please use xacro instead
他们不给天气,所以你不能注意。
因此,一切都像以前一样工作,只是现在使用了xacro格式。
他给什么? 这种格式允许您重新组织代码。 随着项目的发展,这将有助于将来更好地导航。
使用Xacro
现在是时候将rosbots.xacro拆分成其组成部分并利用xacro了。
将有关凉亭编辑器的所有内容(凉亭标签)从rosbots.xacro移至新文件。
在urdf文件夹中创建rosbots.gazebo.xacro文件:
nano rosbots.gazebo.xacro
并将代码放在这里:
rosbots.gazebo.xacro <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="rosbots" > <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <legacyMode>false</legacyMode> <alwaysOn>true</alwaysOn> <publishWheelTF>true</publishWheelTF> <publishTf>1</publishTf> <publishWheelJointState>true</publishWheelJointState> <updateRate>100.0</updateRate> <leftJoint>wheel_left_joint</leftJoint> <rightJoint>wheel_right_joint</rightJoint> <wheelSeparation>1.1</wheelSeparation> <wheelDiameter>0.52</wheelDiameter> <wheelAcceleration>1.0</wheelAcceleration> <torque>20</torque> <commandTopic>/part2_cmr/cmd_vel</commandTopic> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_link</robotBaseFrame> </plugin> </gazebo> </robot>
标签内的相同代码
<gazebo> </gazebo>
从rosbots.xacro文件中删除。
现在,我们将新创建的文件附加到rosbots.xacro。 从某个地方,应该会收到有关rosbots.xacro凉亭组件的相同信息!
因此,添加到rosbots.xacro:
<xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
在带有标签的行之后插入此行
<robot>
。 现在文件的开头如下所示:
<robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" />
再次检查所有内容均以新格式运行:
第一航站楼:
roslaunch gazebo_ros empty_world.launch
第二名:
roslaunch rosbots_description spawn.launch
因此,对于用户而言,就启动仿真中的模型而言,一切都保留在其位置上,命令是相同的。
添加新的传感器
现在,该项目已大致呈现出结构化的外观,我们将附加其他传感器。
为了不使“套件”使机器人过于混乱,我们仅添加了两个传感器:摄像头和imu(惯性测量模块或陀螺仪)。
为此,您需要修复rosbots.xacro和rosbots.gazebo.xacro文件。
让我们从相机和rosbots.xacro文件开始。 为了解决所有问题,对于传感器,您需要添加:
- 通信(链接)。 它将由dae文件表示。
- 关节,它将摄像机连接到机器人的身体。
在另一个文件rosbots.gazebo.xacro中,我们将添加:
我们将其放置在标记中的rosbots.xacro中(为方便起见,您可以在末尾添加它):
rosbots.xacro <joint name="camera_joint" type="fixed"> <origin xyz="0.49 -0.03 0.75" rpy="0 0.21 0" /> <parent link="base_link"/> <child link="camera_link" /> </joint> <link name="camera_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </collision> </link>
上面的代码为我们的相机添加了链接和关节,使其可视化。
检查一下。
第一航站楼:
roslaunch gazebo_ros empty_world.launch
第二名:
roslaunch rosbots_description spawn.launch
如果一切正确,那么您可以在机器人上看到添加的摄像机(白色):

似乎一切都很简单。 但是,必须理解,仅添加了摄像机可视化。 目前尚不清楚该相机在物理世界中的行为。 她的行为是不确定的。 相机尚无法拍照或拍摄视频。
轮到使用凉亭处理文件了。
加到
rosbots.gazebo.xacro内部标签
<robot> </robot>
添加:
<gazebo reference="camera_link"> <sensor type="camera" name="camera1"> <update_rate>30.0</update_rate> <camera name="head"> <horizontal_fov>1.04</horizontal_fov> <image> <width>320</width> <height>240</height> <format>R8G8B8</format> </image> <clip> <near>0.1</near> <far>50</far> </clip> </camera> <plugin name="camera_controller" filename="libgazebo_ros_camera.so"> <alwaysOn>true</alwaysOn> <updateRate>0</updateRate> <cameraName>camera1</cameraName> <imageTopicName>image_raw</imageTopicName> <cameraInfoTopicName>camera_info</cameraInfoTopicName> <frameName>camera</frameName> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo>
由于很容易猜到代码,我们确定了相机参数:
- update_rate:数据多久到达一次
- 宽度/高度:图片的分辨率。 在这种情况下,分辨率为320x240。
- 格式:视频格式(R8G8B8)。
- imageTopicName:将数据发送到的主题名称
- frameName:摄像机将连接到的链接。
现在,一切都准备就绪,可以可视化摄像机及其仿真。
如果现在重新启动仿真并查看主题列表,则可以看到其中已添加了由摄像机生成的主题:
rostopic list
/rosbots/camera1/camera_info /rosbots/camera1/image_raw /rosbots/camera1/image_raw/compressed /rosbots/camera1/image_raw/compressed/parameter_descriptions /rosbots/camera1/image_raw/compressed/parameter_updates /rosbots/camera1/image_raw/compressedDepth /rosbots/camera1/image_raw/compressedDepth/parameter_descriptions /rosbots/camera1/image_raw/compressedDepth/parameter_updates /rosbots/camera1/image_raw/theora /rosbots/camera1/image_raw/theora/parameter_descriptions /rosbots/camera1/image_raw/theora/parameter_updates /rosbots/camera1/parameter_descriptions /rosbots/camera1/parameter_updates
有一个完整的主题库! 但是,通常,除前三个外,并非所有的都经常使用。
来自凉亭模拟器的rviz中的图像
*在此处应注意,在您尝试从虚拟摄像机开始向rviz广播时,在VMWare Workstation映像的当前配置中,凉亭会崩溃。 可能的解决方案在错误部分的帖子结尾处指示。为了清楚起见,在模拟中使用相机时,请运行rviz并将一些对象放置在机器人前面。
为此,您首先需要对象本身,该对象将被添加到凉亭中。
下载
object.urdf文件并将其放入〜/ catkin_ws / src /
让我们运行它。
第一航站楼:
roslaunch gazebo_ros empty_world.launch
第二名(放置模型):
rosrun gazebo_ros spawn_model -file /home/pi/catkin_ws/src/object.urdf -urdf -x 1 -y 0 -z 1 -model my_object
roslaunch rosbots_description spawn.launch
在仿真中,我们得到以下图片:

机器人模型和还添加为模型的帖子。
可以通过插入编辑器内部的选项卡以更简单的方式将项添加到凉亭编辑器中:

现在,让我们看看机器人看到的东西。
在不关闭前面两个终端的情况下,运行带有机器人说明的rviz:
roslaunch rosbots_description rviz.launch
并在其中添加一个名为“ Image”的新Display:

出现带有摄像机图像的新显示,并且...凉亭编辑器将弹出。
不幸的是,当在带有VMWare映像的虚拟机上工作时,从虚拟摄像机添加广播会导致错误。
如果工作不是在虚拟机上进行,而是在真实的机器上进行,那么我们将从凉亭中的虚拟摄像机获取图像,并带有柱状图:

现在,将IMU添加到模型中。
IMU(陀螺仪)
添加imu的过程类似于添加相机。
首先,打开rosbots.gazebo.xacro并制作
代号 <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <topicName>imu/data</topicName> <serviceName>imu/service</serviceName> <bodyName>base_link</bodyName> <gaussianNoise>0</gaussianNoise> <rpyOffsets>0 0 0</rpyOffsets> <updateRate>30.0</updateRate> <alwaysOn>true</alwaysOn> <gaussianNoise>0</gaussianNoise> </plugin> </gazebo>
我们将在代码中添加此代码以及添加的摄像机的代码
<robot></robot>
由于不难从代码中猜测出来,因此它将在主题/ imu /数据中发布数据。
现在,如果您将机器人模型放到凉亭中并在附近的终端中执行命令:
rostopic list
,则可以看到包含imu数据的主题:

您还可以通过运行以下命令来查看他发布的内容:
rostopic echo /imu/data -n1

简而言之,imu会发布以下信息:
- 方向:机器人沿x,y,z和w轴的方向。
- angular_velocity:机器人的角速度。
- linear_acceleration:线性加速度。
有点感动
。
将rosbots.gazebo.xacro添加到标记中
代号 <gazebo reference="wheel_left_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="wheel_right_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="base_link"> <material>Gazebo/Blue</material> <mu1>0.3</mu1> <mu2>0.3</mu2> <sensor type="contact" name="bumpers"> <always_on>1</always_on> <update_rate>50.0</update_rate> <visualize>true</visualize> <contact> <collision>base_footprint_collision_base_link</collision> </contact> </sensor> </gazebo> <gazebo reference="camera_link"> <mu1>0.2</mu1> <mu2>0.2</mu2> </gazebo>
该代码将确定机器人的其他参数:车轮的摩擦系数,凉亭中的颜色,接触传感器。 机器人保险杠碰到障碍物后立即触发接触传感器。
现在重新启动凉亭,放置模型,并在rviz中像以前一样添加imu显示,并使用相机添加显示:

如果一切顺利,那么我们将看到imu正在该主题中发布。
总之,我们将在仿真中控制机器人,并查看数据如何随imu变化:
第一航站楼:
roslaunch gazebo_ros empty_world.launch
第二名:
roslaunch rosbots_description spawn.launch
roslaunch rosbots_description rviz.launch
第三名:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
操作中可能出现的错误 :
1.机械手模型未出现在凉亭中(软件包[rosbots_description]没有路径)-关闭凉亭,在终端中执行source devel / setup.bash,重新启动凉亭。
2。
gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && "A new DepthBuffer for a RenderTarget was created, but after creation" "it says it's incompatible with that RT"' failed. Aborted (core dumped)
可能的解决方案(未经测试):
https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random