本笔记包含四部分
- urdf模型导入gazebo
- ros_control与实现
- 使用Qt Creator加载Rviz显示机械臂模型
- 使用ros+rviz控制真实的机械臂
这篇笔记主要记录urdf模型导入gazebo的过程对应下图绿框的部分。
1. 生成gazebo功能包
cd ~/catkin_ws/src
catkin_create_pkg myrobot_gazebo std_msgs rospy roscpp
cd myrobot_gazebo
mkdir launch
mkdir config
2. 修改SolidWorks生成的urdf文件
想要在gazebo中实现机械臂仿真,需要在已生成的urdf模型里面添加传动装置(transmission),即需要为每个joint添加驱动,链接执行器和关节,从而让它在真实的物理环境中转动起来;同时要为添加控制插件,它会自动解析transmission标签,装载合适的硬件接口和controller manager。具体代码如下:
<!--add transmission for every joint-->
<transmission name="trans_joint1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="joint1">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
</joint>
<actuator name="joint1_motor">
<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<!-- add one gazebo plugin-->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/</robotNamespace>
<robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType>
<legacyModeNS>true</legacyModeNS>
</plugin>
</gazebo>
固定到世界坐标系(非常重要,如果你的机器人是以悬空的状态摆放,它在gazebo模型中会因为重力立马掉落到地上)
<!-- Used for fixing robot to Gazebo 'base_link' -->
<link name="world"/>
<joint name="fixed" type="fixed">
<parent link="world"/>
<child link="based_linkl"/>
</joint>
修改urdf在gazebo中显示的颜色(对应.STL文件格式):
<gazebo reference="link节点名称">
<material>Gazebo/Blue</material>
</gazebo>
注意事项:
- transmission是专门为了gazebo实现对模型驱动添加的标签,如果你不搞仿真而是为了控制真实的机械臂则不需要该标签;
- 模型有几个joint就添加几个transmission;
- 关节转角限制在urdf中配置,但速度和角加速度只能在.yaml文件中配置;
- robotNamespace:插件实例所用的命名空间,名字随便起,主要是为了避免出现多机器人仿真重名的问题;
- 对于有力控仿真需求的情况,不要随意修改urdf模型中interia项的值;
- 像在rviz中一样,gazebo中的模型支持.STL和.DAE两种格式,个人建议使用.DAE文件,因为他们支持颜色和纹理,显示起来更加逼真,推荐使用SimLab Collada插件将solidworks模型生成.dae文件。
3. 添加launch文件
在launch文件夹新建.launch文件:
cd ~/catkin_ws/src/myrobot_gazebo/launch
touch myrobot_gazebo_world.launch
复制以下代码,具体使用时将模型及路径换成你的就行:
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- We resume the logic in empty_world.launch -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description" textfile = “$(find package)/urdf/xx.urdf” />
<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model myrobot -param robot_description"/>
</launch>
4. 测试
cd ~/catkin_ws
catkin_make
roslaunch myrobot_gazebo myrobot_gazebo_world.launch
gazebo成功打开,模型显示,证明模型导入gazebo成功,但是此时模型由于没有control,会出现乱动的现象。