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 许可协议。转载请注明出处!
- 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。
评论(0)
您还未登录,请登录后发表或查看评论