文章目录
安装Rviz
sudo apt-get install ros-kinetic-rviz
rosdep install rviz
rosmake rviz
运行rviz
打开一个linux终端,输入roscore
再打开一个linux终端(一直不明白为什么要打开两个终端或者多个终端,难道在一个终端内不可以?试了下,一个终端确实不可以,但不懂为什么),输入:
rosrun rviz rviz
gazebo 环境设置
1.linux系统:/etc/profile:为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。
/etc/bashrc:为每个运行bash shell的用户执行此文件。
当bash shell被打开时,该文件被读取。
2. 用户:~/.bashrc_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次
打开新的shell时,该文件被读取.
~/bash_logout:当每次退出系统(退出bash shell)时,执行该文件.
每个用户都有一个.bashrc文件,在用户目录下)
3. 在登录Linux时要执行文件的过程如下:
在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,
执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。
如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。
因为在 ~/.bash_profile文件中一般会有下面的代码:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
~/.bashrc中,一般还会有以下代码:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。
执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
4. 以ROS安装后环境配置为例,说明bashrc和source
为方便起见,我们可以在每次打开终端时让系统自动配置好ROS环境变量,方法如下:
//添加ros indigo启动文件setup.bash到.bashrc文件中,用source启动,每次登陆自动运行.bashrc启动ros
echo “source /opt/ros/indigo/setup.bash” >> ~/.bashrc
用source命令运行.bashrc文件,启动ros,或者source /opt/ros/indigo/setup.bash
gazebo 仿真器
1、模型显示
一、为link添加惯性参数和碰撞属性
之前我们创建xacro文件的时候,每个物体只有一个简单的可视化属性,如果要在Gazebo中实现的话,需要对这些可视化模型的每个link添加碰撞属性以及惯性参数。以base_link为例:
<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>
<collision>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="${base_length}" radius="${base_radius}"/>
</geometry>
</collision>
<cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_length}" />
</link>
可以对比一下第六章里面的base_link,会发现其下面多了一个collision以及inertial_matrix,这里需要对每一个link都添加这些属性。关于惯性矩阵的运算,可以自行百度。这里也通过宏定义的形式给出了一个惯性矩阵的计算方式:
<xacro:macro name="sphere_inertial_matrix" params="m r">
<inertial>
<mass value="${m}" />
<inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
iyy="${2*m*r*r/5}" iyz="0"
izz="${2*m*r*r/5}" />
</inertial>
</xacro:macro>
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
这个用在base_footprint中,设置这个的主要原因在于轨迹是一个映射,理论上应该是没有重力的,所以这里我们关闭它的重力属性。
三、为joint添加传动装置。
由于gazebo的控制是针对于joint做控制的,例如我有一个真实的机器人,如果我想让它的轮子动起来,那么我需要一个电机驱动这个轮子做运动。这一步的内容就相当于给我们的机器人模型添加一个电
<transmission name="${prefix}_wheel_joint_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}_wheel_joint" >
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
</joint>
<actuator name="${prefix}_wheel_joint_motor">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
四、添加gazebo控制器插件。
我们现在相当于有了一个模型,通过第三步我们模型有了电机,那我们要让这个电机转起来我们还需要一个控制器,我们给控制器发送一个目标速度这个控制器会发送具体转速给电机,所以在我们的模型文件我们添加一个控制器
<gazebo>
<plugin name="differential_drive_controller"
filename="libgazebo_ros_diff_drive.so"> <!-- gazebo提供得差速控制器插件 -->
<!-- 控制器所需参数 -->
<rosDebugLevel>Debug</rosDebugLevel>
<publishWheelTF>true</publishWheelTF>
<robotNamespace>/</robotNamespace><!-- 机器人命名空间 订阅和发布得话题 前面 会加上命名空间 /说明没有添加-->
<publishTf>1</publishTf>
<publishWheelJointState>true</publishWheelJointState>
<alwaysOn>true</alwaysOn>
<updateRate>100.0</updateRate>
<legacyMode>true</legacyMode>
<leftJoint>left_wheel_joint</leftJoint> <!-- 控制得joint在哪里,必须和上面得joint名称一致 -->
<rightJoint>right_wheel_joint</rightJoint><!-- 控制得joint在哪里,必须和上面得joint名称一致 -->
<wheelSeparation>${wheel_joint_y*2}</wheelSeparation><!-- 两个轮子得间距 -->
<wheelDiameter>${2*wheel_radius}</wheelDiameter>
<broadcastTF>1</broadcastTF>
<wheelTorque>30</wheelTorque>
<wheelAcceleration>1.8</wheelAcceleration>
<commandTopic>cmd_vel</commandTopic> <!-- 订阅得话题:速度控制指令 -->
<odometryFrame>odom</odometryFrame>
<odometryTopic>odom</odometryTopic> <!-- 发布里程计信息 -->
<robotBaseFrame>base_footprint</robotBaseFrame><!-- 设置controler所控制的机器人的坐标系是哪个坐标系 -->
</plugin>
</gazebo>
可以看出,其首先启动了一个gazebo的仿真环境(find gazebo_ros)/launch/empty_world.launch),然后加载一个机器人模型,同样的在下面启动一个joint_state_publisher以及robot_state_publisher。最后通过<node name=“urdf_spawner” pkg=“gazebo_ros” type=“spawn_model” respawn=“false” output="screen"节点把机器人放置到gazebo中去。
然后我们可以启动这个launch文件,在shenlan的源码中这个文件在mbot_gazebo文件夹下:
roslaunch mbot_gazebo view_gazebo_empty_world.launch
不出意外的话就可以在gazebo中得到一个机器人模型了,但是这里gazebo的启动比较慢,因为它需要远程访问一些国外的网站加载一些模型。可能还会出现连接失败的问题。这里为了保证模型顺利加载,我们也可以将模型文件下载并放置到~/.gazebo/models下。.gazebo为隐藏文件,在home文件夹下,ctrl+h可以显示。下载地址:
https://bitbucket.org/osrf/gazebo_models/downloads/
这里我一开始没有下载的,等了有五六分钟才加载出来,终端还出现了两个警告。
2、创建仿真环境
当我们的机器人出现在gazebo的时候,可以看到我们加载的文件里面只有一个机器人,那我们希望能给它添加一些障碍物,这时应该怎么做呢?
方法一、直接添加环境模型
如果有从上面网址下载过模型放置到model文件夹下的,可以直接在gazebo的左侧列表点击“insert”,可以看到里面会有很多的模型,我们只需要从列表中拖出我们需要的模型放置到仿真环境中就可以了。如果这些模型不能满足建模需求也可以自己通过三维软件搭建模型放到文件夹中使用。例如solidworks建模
方法二、使用building editor环境设计
在gazebo软件上面列表点击:edit-building editor,可以出现一个类似于画板的界面,这个界面可以用于图形编辑,比如说绘制三维场景中的一堵墙或者一个门。
编辑完成后我们点击file-save保存我们的文件,然后退出编辑界面,就可以看到我们的仿真环境已经在gazebo中显示了
然后再点击file-save world as保存我们创建的环境。这里我保存在mbot_gazebo/worlds/文件夹下,命名为room2.world。