XACRO模型文件

数学计算(原来URDF不支持)

宏定义机制

文件包含

模型显示

方法一:在模型根目录下操作

  1 rosrun xacro xacro.py mbot.xcaro>mbot.urdf

运行launch文件:

  1 roslaunch mbot_description display_mbot_base_urdf.launch

一般会用第二种方法:(添加xacro功能包解析器)

  1 roslaunch mbot_description display_mbot_base_xacro.launch

安装ArbotiX

在melodic中可以按indigo版安装

配置ArbotiX

launch文件在mbot_description中的launch文件夹

文件是.yaml格式的,路径在mbot_description中的config文件夹中。

注意:自己写的python文件需要添加可执行权限

rbx1在github上的位置:https://github.com/pirobot/

需要的包:

(1)gmapping

  1  git clone https://github.com/ros-perception/slam_gmapping.git 

(2)amcl:

  1 git clone https://github.com/ros-planning/navigation.git

(3)书中可能用到的包

  1 sudo apt-get install ros-indigo-turtlebot-bringup \
  2 ros-indigo-turtlebot-create-desktop ros-indigo-openni-* \ros-indigo-openni2-* ros-indigo-freenect-* ros-indigo-usb-cam \ros-indigo-laser-* ros-indigo-hokuyo-node \ros-indigo-audio-common gstreamer0.10-pocketsphinx \
  3 ros-indigo-pocketsphinx ros-indigo-slam-gmapping \
  4 ros-indigo-joystick-drivers python-rosinstall \
  5 ros-indigo-orocos-kdl ros-indigo-python-orocos-kdl \python-setuptools ros-indigo-dynamixel-motor-* \
  6 libopencv-dev python-opencv ros-indigo-vision-opencv \
  7 ros-indigo-depthimage-to-laserscan ros-indigo-arbotix-* \ros-indigo-turtlebot-teleop ros-indigo-move-base \ros-indigo-map-server ros-indigo-fake-localization \ros-indigo-amcl git subversion mercurial

rbx1 package下载:

  1 cd ~/catkin_ws/src
  2 git clone https://github.com/pirobot/rbx1.git 
  3 cd rbx1
  4 git checkout indigo-devel
  5 cd ~/catkin_ws
  6 catkin_make
  7 source ~/catkin_ws/devel/setup.bash
  8 rospack profile

启动环境:

  1 roslaunch rbx1_bringup fake_turtlebot.launch
  2 rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz

控制运动:

  1 rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

或者是用mboy_teley包

ros_control使用最多的四种控制器

Gazebo物理仿真环境的搭建

第一步:为link添加惯性参数和碰撞属性

文件在mbot_description包中的/urdf/xacro/gazebo中。为所有的<link>标签添加。

第二步:为link添加gazebo标签

给link添加颜色在给gazebo中的显示配置的。

第三步:为joint添加传动装置

控制是针对joint控制的,

第四步:添加gazebo控制器插件

相当于给电机加一个控制器。gazebo中已经提供了一个差速控制插件。

完整模型代码示例:
  1 <?xml version="1.0"?>
  2 <robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  3 
  4     <!-- PROPERTY LIST -->
  5     <xacro:property name="M_PI" value="3.1415926"/>
  6     <xacro:property name="base_mass"   value="20" />
  7     <xacro:property name="base_radius" value="0.20"/>
  8     <xacro:property name="base_length" value="0.16"/>
  9 
 10     <xacro:property name="wheel_mass"   value="2" />
 11     <xacro:property name="wheel_radius" value="0.06"/>
 12     <xacro:property name="wheel_length" value="0.025"/>
 13     <xacro:property name="wheel_joint_y" value="0.19"/>
 14     <xacro:property name="wheel_joint_z" value="0.05"/>
 15 
 16     <xacro:property name="caster_mass"    value="0.5" />
 17     <xacro:property name="caster_radius"  value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
 18     <xacro:property name="caster_joint_x" value="0.18"/>
 19 
 20     <!-- Defining the colors used in this robot -->
 21     <material name="yellow">
 22         <color rgba="1 0.4 0 1"/>
 23     </material>
 24     <material name="black">
 25         <color rgba="0 0 0 0.95"/>
 26     </material>
 27     <material name="gray">
 28         <color rgba="0.75 0.75 0.75 1"/>
 29     </material>
 30 
 31     <!-- Macro for inertia matrix -->
 32     <xacro:macro name="sphere_inertial_matrix" params="m r">
 33         <inertial>
 34             <mass value="${m}" />
 35             <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
 36                 iyy="${2*m*r*r/5}" iyz="0"
 37                 izz="${2*m*r*r/5}" />
 38         </inertial>
 39     </xacro:macro>
 40 
 41     <xacro:macro name="cylinder_inertial_matrix" params="m r h">
 42         <inertial>
 43             <mass value="${m}" />
 44             <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
 45                 iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
 46                 izz="${m*r*r/2}" />
 47         </inertial>
 48     </xacro:macro>
 49 
 50     <!-- Macro for robot wheel -->
 51     <xacro:macro name="wheel" params="prefix reflect">
 52         <joint name="${prefix}_wheel_joint" type="continuous">
 53             <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/>
 54             <parent link="base_link"/>
 55             <child link="${prefix}_wheel_link"/>
 56             <axis xyz="0 1 0"/>
 57         </joint>
 58 
 59         <link name="${prefix}_wheel_link">
 60             <visual>
 61                 <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
 62                 <geometry>
 63                     <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
 64                 </geometry>
 65                 <material name="gray" />
 66             </visual>
 67             <collision>
 68                 <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
 69                 <geometry>
 70                     <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
 71                 </geometry>
 72             </collision>
 73             <cylinder_inertial_matrix  m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}" />
 74         </link>
 75 
 76         <gazebo reference="${prefix}_wheel_link">
 77             <material>Gazebo/Gray</material>
 78         </gazebo>
 79 
 80         <!-- Transmission is important to link the joints and the controller -->
 81         <transmission name="${prefix}_wheel_joint_trans">
 82             <type>transmission_interface/SimpleTransmission</type>
 83             <joint name="${prefix}_wheel_joint" >
 84                 <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
 85             </joint>
 86             <actuator name="${prefix}_wheel_joint_motor">
 87                 <!-- 接口是速度控制的接口,还可以是力、位置等 -->
 88                 <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
 89                  <!-- 电机减速比设为了1 -->
 90                 <mechanicalReduction>1</mechanicalReduction>
 91             </actuator>
 92         </transmission>
 93     </xacro:macro>
 94 
 95     <!-- Macro for robot caster -->
 96     <xacro:macro name="caster" params="prefix reflect">
 97         <joint name="${prefix}_caster_joint" type="continuous">
 98             <origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/>
 99             <parent link="base_link"/>
100             <child link="${prefix}_caster_link"/>
101             <axis xyz="0 1 0"/>
102         </joint>
103 
104         <link name="${prefix}_caster_link">
105             <visual>
106                 <origin xyz="0 0 0" rpy="0 0 0"/>
107                 <geometry>
108                     <sphere radius="${caster_radius}" />
109                 </geometry>
110                 <material name="black" />
111             </visual>
112             <collision>
113                 <origin xyz="0 0 0" rpy="0 0 0"/>
114                 <geometry>
115                     <sphere radius="${caster_radius}" />
116                 </geometry>
117             </collision>
118             <sphere_inertial_matrix  m="${caster_mass}" r="${caster_radius}" />
119         </link>
120 
121         <gazebo reference="${prefix}_caster_link">
122             <material>Gazebo/Black</material>
123         </gazebo>
124     </xacro:macro>
125 
126     <xacro:macro name="mbot_base_gazebo">
127         <link name="base_footprint">
128             <visual>
129                 <origin xyz="0 0 0" rpy="0 0 0" />
130                 <geometry>
131                     <box size="0.001 0.001 0.001" />
132                 </geometry>
133             </visual>
134         </link>
135         <gazebo reference="base_footprint">
136             <turnGravityOff>false</turnGravityOff>
137         </gazebo>
138 
139         <joint name="base_footprint_joint" type="fixed">
140             <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" />
141             <parent link="base_footprint"/>
142             <child link="base_link" />
143         </joint>
144 
145         <link name="base_link">
146             <visual>
147                 <origin xyz=" 0 0 0" rpy="0 0 0" />
148                 <geometry>
149                     <cylinder length="${base_length}" radius="${base_radius}"/>
150                 </geometry>
151                 <material name="yellow" />
152             </visual>
153             <collision>
154                 <origin xyz=" 0 0 0" rpy="0 0 0" />
155                 <geometry>
156                     <cylinder length="${base_length}" radius="${base_radius}"/>
157                 </geometry>
158             </collision>
159             <cylinder_inertial_matrix  m="${base_mass}" r="${base_radius}" h="${base_length}" />
160         </link>
161 
162         <gazebo reference="base_link">
163             <material>Gazebo/Blue</material>
164         </gazebo>
165 
166         <wheel prefix="left"  reflect="-1"/>
167         <wheel prefix="right" reflect="1"/>
168 
169         <caster prefix="front" reflect="-1"/>
170         <caster prefix="back"  reflect="1"/>
171 
172         <!-- controller -->
173         <gazebo>
174             <plugin name="differential_drive_controller"
175                     filename="libgazebo_ros_diff_drive.so">
176                 <rosDebugLevel>Debug</rosDebugLevel>
177                 <publishWheelTF>true</publishWheelTF>
178                 <!-- 机器人命名空间,所有插件订阅发布的话题都会在前边加一个命名空间,因为只有一个机器人,这里就不用添加。 -->
179                 <robotNamespace>/</robotNamespace>
180                 <publishTf>1</publishTf>
181                 <publishWheelJointState>true</publishWheelJointState>
182                 <alwaysOn>true</alwaysOn>
183                 <updateRate>100.0</updateRate>
184                 <legacyMode>true</legacyMode>
185                  <!-- 一个左轮一个右轮必须和上边的模型的定义是一致的 -->
186                 <leftJoint>left_wheel_joint</leftJoint>
187                 <rightJoint>right_wheel_joint</rightJoint>
188                  <!-- 轮子的间距和尺寸 -->
189                 <wheelSeparation>${wheel_joint_y*2}</wheelSeparation>
190                 <wheelDiameter>${2*wheel_radius}</wheelDiameter>
191                 <broadcastTF>1</broadcastTF>
192                 <wheelTorque>30</wheelTorque>
193                 <wheelAcceleration>1.8</wheelAcceleration>
194                 <!-- 这个控制器所需要订阅的话题,需要订阅速度控制指令 -->
195                 <commandTopic>cmd_vel</commandTopic>
196                 <odometryFrame>odom</odometryFrame>
197                 <!-- 发布里程计信息 -->
198                 <odometryTopic>odom</odometryTopic>
199                 <!-- 控制的机器人的坐标系 -->
200                 <robotBaseFrame>base_footprint</robotBaseFrame>
201             </plugin>
202         </gazebo>
203     </xacro:macro>
204 
205 </robot>

在gazebo中加载机器人模型

创建仿真环境

ubuntu下载指令:

  1 hg clone https://bitbucket.org/osrf/gazebo_models

再在好后放在主目录   .gazebo/models中。注意,此文件为隐藏文件,在主目录按ctrl+h显示隐藏文件。

方法一:直接添加环境模型

方法二:使用building rditor

有时候保存世界时会卡,可以通过指令来查看是不是系统资源的原因:任务管理器

  1 gnome-system-monitor

用超级管理员模式保存

进入超级终端指令

开始仿真

如果要修改世界环境需要在mbot_gazebo/launch文件夹中修改对应的lanuch文件。不过要在worlds中添加gazebo生成的世界对应的  .word文件。

传感器仿真

激光雷达仿真

小结

__EOF__

  • 本文作者: DuYiming
  • 本文链接: https://www.cnblogs.com/vcan123/p/12231428.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐】一下。