机器人ROS系统学习随笔->3《ROS机器人系统设计URDF模型优化》
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+rviz功能仿真
安装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
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文件。