ROS仿真学习笔记_xacro
xacro优化代码:
新建功能包:
catkin_create_pkg xx urdf xacro
1 . 优化上节小车代码:
① 底盘代码
在xacro文件夹下创建robot.xacro
touch robot.xacro
<!-- 设置机器人底盘-->
<!--
1.代码复用
2.参数设计
-->
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- 一、属性封装-->
<xacro:property name="footprint_radius" value="0.001" />
<!-- 1.base_footprint-->
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="${footprint_radius}" />
</geometry>
</visual>
</link>
<xacro:property name="base_link_radius" value="0.1" />
<xacro:property name="base_link_length" value="0.08" />
<xacro:property name="lidi" value="0.015" />
<xacro:property name="base_joint_z" value="${base_link_length/2+lidi}" />
<!-- 2.底盘link-->
<link name="base_link">
<visual>
<geometry>
<cylinder radius="${base_link_radius}" length="${base_link_length}" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="car_color">
<color rgba="1.0 0.5 0 0.5" />
</material>
</visual>
</link>
<!-- 2.1 关联 base_footprint 与 底盘base_link -->
<joint name="link2footprint" type="fixed">
<!-- 父级 link-->
<parent link="base_footprint" />
<!-- 子级 link-->
<child link="base_link" />
<!-- 设置偏移量-->
<origin xyz="0 0 ${base_joint_z}" rpy="0 0 0" />
</joint>
<xacro:property name="wheel_radius" value="0.0325" />
<xacro:property name="wheel_length" value="0.015" />
<xacro:property name="PI" value="3.1415927" />
<xacro:property name="wheel_joint_z" value="${(base_link_length/2+lidi-wheel_radius)*(-1)}" />
<!--二、 宏封装-->
<!--
wheel_name : left or right
flag : 1 or -1
-->
<xacro:macro name="wheel_func" params="wheel_name flag">
<link name="${wheel_name}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="${PI/2} 0 0" />
<material name="${wheel_name}_wheel_color">
<color rgba="0 0 0 0.5" />
</material>
</visual>
</link>
<joint name="${wheel_name}_2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="${wheel_name}_wheel" />
<!-- 设置偏移量-->
<origin xyz="0 ${0.1 * flag} ${wheel_joint_z}" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
</xacro:macro>
<!--三、 宏调用才会生效-->
<xacro:wheel_func wheel_name="left" flag="1" />
<xacro:wheel_func wheel_name="right" flag="-1" />
<!--四、 万向轮-->
<!--4.1 属性封装-->
<xacro:property name="small_wheel_radius" value="0.0075" />
<xacro:property name="small_joint_z" value="${(base_link_length/2+lidi-small_wheel_radius)*(-1)}" />
<xacro:macro name="small_wheel_func" params="small_wheel_name flag">
<!-- 4.2 万向轮link-->
<link name="${small_wheel_name}_wheel">
<visual>
<geometry>
<sphere radius="${small_wheel_radius}" />
</geometry>
<!-- 先默认使用,后期需要更改-->
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="${small_wheel_name}_wheel_color">
<color rgba="1 0 0 0.5" />
</material>
</visual>
</link>
<!-- 4.3万向轮joint-->
<joint name="${small_wheel_name}_wheel2base" type="continuous">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="${small_wheel_name}_wheel" />
<!-- 设置偏移量-->
<origin xyz="${0.08*flag} 0 ${small_joint_z}" rpy="0 0 0" />
<!-- 设置关节旋转参考的坐标轴-->
<axis xyz="0 1 0" />
</joint>
</xacro:macro>
<xacro:small_wheel_func small_wheel_name="front" flag="1" />
<xacro:small_wheel_func small_wheel_name="back" flag="-1" />
</robot>
② 相机代码
在xacro文件夹下创建camera.xacro
touch camera.xacro
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- 摄像头部件-->
<!-- 1.摄像头link-->
<!-- 厚度-->
<xacro:property name="camera_length" value="0.02" />
<!-- 宽度-->
<xacro:property name="camera_width" value="0.05" />
<!-- 高度-->
<xacro:property name="camera_height" value="0.05" />
<xacro:property name="joint_camera_x" value="0.08" />
<xacro:property name="joint_camera_y" value="0" />
<xacro:property name="joint_camera_z" value="${base_link_length/2+camera_height/2}" />
<!-- 2.设置连杆与关节-->
<link name="camera">
<visual>
<geometry>
<box size="${camera_length} ${camera_width} ${camera_height}" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="camera_color">
<color rgba="1.0 1.0 0 0.5" />
</material>
</visual>
</link>
<joint name="camera2base" type="fixed">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="camera" />
<!-- 设置偏移量-->
<origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0 0 0" />
</joint>
</robot>
③ 雷达代码
在xacro文件夹下创建lidar.xacro
touch lidar.xacro
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- 雷达部件-->
<!-- 支架半径-->
<xacro:property name="support_radius" value="0.01" />
<!-- 支架高度-->
<xacro:property name="support_length" value="0.15" />
<!-- 雷达半径-->
<xacro:property name="lidar_radius" value="0.03" />
<!-- 雷达高度-->
<xacro:property name="lidar_length" value="0.05" />
<!-- 支架的坐标偏移-->
<xacro:property name="joint_support_x" value="0" />
<xacro:property name="joint_support_y" value="0" />
<xacro:property name="joint_support_z" value="${base_link_length/2+support_length/2}" />
<!-- 雷达的坐标偏移-->
<xacro:property name="joint_lidar_x" value="0" />
<xacro:property name="joint_lidar_y" value="0" />
<xacro:property name="joint_lidar_z" value="${support_length/2+lidar_length/2}" />
<!-- 支架link-->
<link name="support">
<visual>
<geometry>
<cylinder radius="${support_radius}" length="${support_length}" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="support_color">
<color rgba="1.0 0.5 1 0.5" />
</material>
</visual>
</link>
<!-- 支架joint-->
<joint name="support2base" type="fixed">
<!-- 父级 link-->
<parent link="base_link" />
<!-- 子级 link-->
<child link="support" />
<!-- 设置偏移量-->
<origin xyz="${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy="0 0 0" />
</joint>
<!-- 雷达link-->
<link name="lidar">
<visual>
<geometry>
<cylinder radius="${lidar_radius}" length="${lidar_length}" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="lidar_color">
<color rgba="1.0 0.5 0.5 0.5" />
</material>
</visual>
</link>
<!-- 雷达joint-->
<joint name="lidar2support" type="fixed">
<!-- 父级 link-->
<parent link="support" />
<!-- 子级 link-->
<child link="lidar" />
<!-- 设置偏移量-->
<origin xyz="${joint_lidar_x} ${joint_lidar_y} ${joint_lidar_z}" rpy="0 0 0" />
</joint>
</robot>
④ 整合代码
在xacro文件夹下创建car.xacro
touch car.xacro
<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- 1.包含底盘、摄像头和雷达的 xacro文件-->
<xacro:include filename="robot.urdf.xacro" />
<xacro:include filename="camera.urdf.xacro" />
<xacro:include filename="lidar.urdf.xacro" />
</robot>