ROS | xacro模型—阿克曼(Ackermann)四轮小车模型


Github链接: https://github.com/chanchanchan97/ROS

1. 模型描述

本项目的目的是创建一个基于阿克曼转向机构(Ackermann steering)的自动驾驶小车模型,该模型在之前URDF模型的基础上修改了前轮转向轴的形状与位置,修改了前端摄像头的位置和尺寸,并且添加了激光雷达和树莓派的简易模型。

2. xacro模型与URDF模型的区别

2.1 URDF模型存在的问题

(1) 模型冗长,重复内容过多;
(2) 参数修改麻烦,不便于二次开发;
(3) 没有参数计算功能。

2.2 xacro模型的特点

(1) 精简模型代码

  • 创建宏定义
  • 文件包含

(2) 提供可编程接口

  • 常量
  • 变量
  • 数学计算
  • 条件语句

3. xacro优化方法

3.1 常量定义

<xacro:property name="M_PI" value="3.14159"/>

标签定义:

  • 在标签xacro:property后面定义如下两个参数属性:
    • name - 所定义的常量名;
    • value - 常量名对应的常量值。

3.2 常量使用

<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

标签定义:

  • ${ }在括号里使用常量,也可以进行数学运算(所有数学运算都会转换成浮点数进行,以保证运算精度)。

3.3 宏定义

<xacro:macro name="cylinder_inertial_matrix" params="m r h">
	<inertial>
		<mass value="${m}" />
		<inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
				 iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
				 izz="${m*r*r/2}" /> 
	</inertial>
</xacro:macro> 

标签定义:

  • 在标签xacro:macro后面定义如下两个参数属性:
    • name - 宏定义的名字类似函数名;
    • params - 类似函数参数,也可以是字符串。

3.4 宏调用

<cylinder_inertial_matrix m="1" r="0.025" h="0.02"/>

标签定义:

  • 首先调用宏定义的名字,然后为参数赋值。

3.5 文件包含

<xacro:include filename="$(find smartcar_description)/urdf/xacro/smartcar_sim.xacro"/>

标签定义:

  • 在标签xacro:include后面定义$(find+功能包)功能包的具体路径

4. 创建xacro文件

在urdf文件夹下创建一个新的文件夹xacro,并且在xacro文件夹中创建一个.xacro文件。

5. xacro模型显示

5.1 将xacro文件转化成URDF文件

在xacro文件夹中打开一个新的终端,输入以下指令:

$ rosrun xacro xacro.py smartcar.xacro > smartcar.urdf

此时xacro文件夹下会生成一个.urdf文件。
在这里插入图片描述

5.2 直接调用xacro文件解析器

这种方法更为常见,在launch文件中加入如下代码,从而实现.xacro文件的转换。

<arg name="urdf_file" default="$(find xacro)/xacro --inorder '$(find smartcar_description)/urdf/xacro/smartcar.xacro'" />
<param name="robot_description" command="$(arg urdf_file)" />

5.3 启动Rviz

打开一个新的终端,输入以下指令,启动Rviz,查看所创建的模型。

$ roslaunch smartcar_description smartcar_rviz.launch

在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS小车的URDF模型可以根据具体的小车类型和设计进行创建,下面是一个简单的示例: ```xml <?xml version="1.0"?> <robot name="ros_car"> <!-- 定义小车的基座 --> <link name="base_link"> <visual> <geometry> <box size="0.5 0.3 0.2"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> <material name="blue"> <color rgba="0.2 0.2 0.8 1"/> </material> </visual> <collision> <geometry> <box size="0.5 0.3 0.2"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0"/> </collision> <inertial> <mass value="1.0"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> </link> <!-- 定义小车的轮子 --> <link name="wheel_link"> <visual> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> <origin rpy="0 1.5708 0" xyz="0 0 0"/> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> <collision> <geometry> <cylinder length="0.1" radius="0.05"/> </geometry> <origin rpy="0 1.5708 0" xyz="0 0 0"/> </collision> <inertial> <mass value="0.1"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.0005" ixy="0.0" ixz="0.0" iyy="0.0005" iyz="0.0" izz="0.0005"/> </inertial> </link> <!-- 定义小车的轮子连接 --> <joint name="wheel_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_link"/> <origin xyz="0.25 0 -0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <!-- 定义小车的传感器 --> <link name="sensor_link"> <visual> <geometry> <cylinder length="0.05" radius="0.02"/> </geometry> <origin rpy="0 0 0" xyz="0.2 0 0"/> <material name="red"> <color rgba="1 0 0 1"/> </material> </visual> <collision> <geometry> <cylinder length="0.05" radius="0.02"/> </geometry> <origin rpy="0 0 0" xyz="0.2 0 0"/> </collision> <inertial> <mass value="0.05"/> <origin rpy="0 0 0" xyz="0 0 0"/> <inertia ixx="0.00005" ixy="0.0" ixz="0.0" iyy="0.00005" iyz="0.0" izz="0.00005"/> </inertial> </link> <!-- 定义小车的传感器连接 --> <joint name="sensor_joint" type="fixed"> <parent link="base_link"/> <child link="sensor_link"/> <origin xyz="0.25 0 0.1" rpy="0 0 0"/> </joint> </robot> ``` 在这个示例中,我们定义了一个名为"ros_car"的机器人,它由基座、轮子和传感器组成。基座由一个长方体表示,轮子由一个圆柱体表示,传感器由一个较小的圆柱体表示。连接由各自的关节表示。您可以根据您的小车类型和设计进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值