xacro搭建ros仿真机器人(待更新)
Rviz和Gazebo中的效果:
关于urdf和xacro的基于语法及使用可看之前的博客以及ros wiki上的教程:
ROS仿真机器人---URDF的XML格式描述学习笔记(wiki教程)_芃晟的博客-CSDN博客
urdf/XML - ROS Wiki
目录
一、具体的步骤:
二、搭建xacro模型
一、具体的步骤:
- 搭建xacro模型,并用rviz可视化
- 添加gazebo仿真所需要的碰撞属性、惯性矩阵和颜色等
- 给小车添加传感器
- ros小车在gazebo中的运动控制
二、搭建xacro模型
2.1 创建一个工作空间和仿真模型的功能包
mkdir -p myRobot_ws/src # 创建工作空间
cd myRobot_ws/src
catkin_init_workspace
cd myRobot_ws
catkin_make
echo "source ~/myRobot_ws/devel/setup.bash --extend" >> ~/.bashrc
source ~/.bashrc
cd myRobot_ws/src
catkin_create_pkg model_description urdf xacro # 创建功能包,并添加依赖
cd model_description
mkdir urdf # 创建三个文件夹,urdf放置模型文件
mkdir launch # 启动文件
mkdir config # 配置文件
2.2 xacro文件
首先要明确自己的需求,即想要仿真出一个什么样的机器人
本文模型的尺寸是大致按照实验室在使用的机器人尺寸来仿真的,具体的可以自行修改设计
1. 主要框架:
<robot name="robot_base" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- 1. base_footprint -->
<xacro:property name="footprint_radius" value="0.001" />
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="${footprint_radius}"/>
</geometry>
</visual>
</link>
<!-- 2. 底盘 -->
<!-- 3. 驱动轮 -->
<!-- 4. 万向轮 -->
</robot>
默认情况下,底盘的中心点位于地图原点上,导致模型半沉在地下。为了解决这种问题可设置一个尺寸极小的初始link,例如半径为0.001m的球体,然后在初始 link 上添加底盘等刚体,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link一般称之为base_footprint。
使用xacro时必须要在开头添加上:xmlns:xacro="http://www.ros.org/wiki/xacro"
xacro:property用于定义xacro的属性,具体可参考:
6.4.2 Xacro_语法详解 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
2. 底盘
<xacro:property name="base_radius" value="0.2625" />
<xacro:property name="base_height" value="0.2625" />
<xacro:property name="base_mass" value="40" />
<xacro:property name="earth_space" value="0.05" />
<xacro:property name="base_joint_z" value="${base_height/2 + earth_space}" />
<link name="base_link">
<visual>
<geometry>
<cylinder radius="${base_radius}" length="${base_height}"/>
</geometry>
<material name="Orange"/>
</visual>
<!-- 碰撞属性(gazebo仿真必需项) -->
<collision>
<geometry>
<cylinder radius="${base_radius}" length="${base_height}"/>
</geometry>
</collision>
<!-- 调用惯性矩阵函数 -->
<xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_height}" />
</link>
<!-- 设置base_footprint和base_link之间的joint -->
<joint name="link2footprint" type="fixed">
<parent link="base_footprint"/>
<child link="base_link"/>
<origin xyz="0.0 0.0 ${base_joint_z}" rpy="0.0 0.0 0.0"/>
</joint>
<!-- gazebo的颜色属性设置 -->
<gazebo reference="base_link">
<material>Gazebo/Orange</material>
</gazebo>
3. 驱动轮
<!-- 3. 两个驱动轮 -->
<xacro:property name="wheel_radius" value="0.108" />
<xacro:property name="wheel_width" value="0.05" />
<xacro:property name="wheel_mass" value="0.7" />
<xacro:property name="wheel_joint_y" value="0.2" />
<xacro:property name="wheel_joint_z" value="${-1 * (base_height/2 + earth_space - wheel_radius)}" />
<xacro:macro name="wheel" params="wheel_name flag">
<link name="${wheel_name}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_width}"/>
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
<material name="Gray" />
</visual>
<collision>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_width}"/>
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
</collision>
<xacro:cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_width}" />
</link>
<!-- wheel和base_link之间的joint -->
<joint name="${wheel_name}2link" type="continuous">
<parent link="base_link"/>
<child link="${wheel_name}_wheel"/>
<origin xyz="0.0 ${wheel_joint_y * flag} ${wheel_joint_z}" rpy="0.0 0.0 0.0"/>
<axis xyz="0.0 1.0 0.0"/>
</joint>
<gazebo reference="${wheel_name}_wheel">
<material>Gazebo/Gray</material>
</gazebo>
<!-- 为joint添加传动装置 -->
<transmission name="${wheel_name}_wheel_joint_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${wheel_name}2link">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
</joint>
<actuator name="${wheel_name}_wheel_joint_motor">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<!-- 调用驱动的宏 -->
<xacro:wheel wheel_name="left" flag="1" />
<xacro:wheel wheel_name="right" flag="-1" />
4. 万向轮
<!-- 4. 四个支撑万向轮 -->
<xacro:property name="caster_radius" value="0.04" />
<xacro:property name="caster_mass" value="0.1" />
<xacro:property name="caster_joint_x" value="0.15" />
<xacro:property name="caster_joint_y" value="0.12" />
<xacro:property name="caster_joint_z" value="${-1 * (base_height/2 + earth_space - caster_radius)}" />
<xacro:macro name="caster" params="caster_name flag_x flag_y">
<link name="${caster_name}_wheel">
<visual>
<geometry>
<sphere radius="${caster_radius}" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<material name="Gray" />
</visual>
<collision>
<geometry>
<sphere radius="${caster_radius}" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
</collision>
<xacro:sphere_inertial_matrix m="${caster_mass}" r="${caster_radius}" />
</link>
<!-- caster和base_link之间的joint -->
<joint name="${caster_name}2link" type="continuous">
<parent link="base_link"/>
<child link="${caster_name}_wheel"/>
<origin xyz="${caster_joint_x * flag_x} ${caster_joint_y * flag_y} ${caster_joint_z}" rpy="0.0 0.0 0.0"/>
<axis xyz="1.0 1.0 1.0"/>
</joint>
<gazebo reference="${caster_name}_wheel">
<material>Gazebo/Gray</material>
</gazebo>
</xacro:macro>
<!-- 调用万向轮的宏 -->
<xacro:caster caster_name="front_l" flag_x="1" flag_y="1" />
<xacro:caster caster_name="front_r" flag_x="1" flag_y="-1" />
<xacro:caster caster_name="back_l" flag_x="-1" flag_y="1" />
<xacro:caster caster_name="back_r" flag_x="-1" flag_y="-1" />