ROS仿真学习笔记_xacro

本文介绍了如何通过xacro优化小车底盘设计,包括创建robot.xacro文件,复用代码并定义参数,以及添加camera和lidar组件。作者详细展示了底盘链接、万向轮和传感器的配置,最终整合所有部分到car.xacro中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
<think>我们参考用户提供的引用内容,结合之前回答的步骤,详细说明在ROS1(Ubuntu18.04)中导入机械臂模型并进行仿真的步骤。这里以UR5机械臂为例,因为引用[2]中提到了UR5的仿真。###详细步骤####1.**准备工作**-安装Ubuntu18.04和ROSMelodic(桌面完整版)-创建ROS工作空间####2.**安装UR5机械臂模型包**根据引用[2]中的步骤,安装UniversalRobots的ROS驱动包:```bash#创建catkin工作空间mkdir-p~/catkin_ws/srccd~/catkin_ws/src#克隆universal_robot仓库(melodic分支)gitclone-bmelodic-develhttps://github.com/ros-industrial/universal_robot.git#安装依赖cd~/catkin_wsrosdepupdaterosdepinstall--from-pathssrc--ignore-src-y#编译catkin_make#设置环境变量sourcedevel/setup.bash```####3.**启动Gazebo仿真环境**-启动Gazebo并加载UR5机械臂模型:```bashroslaunchur_gazebour5.launch```这个launch文件会启动Gazebo,加载UR5的URDF模型,并启动必要的控制器。####4.**启动MoveIt进行运动规划**-在新终端中启动MoveIt节点:```bashroslaunchur5_moveit_configur5_moveit_planning_execution.launchsim:=true```注意:`sim:=true`表示在仿真模式下运行。####5.**启动Rviz进行可视化**-在新终端中启动Rviz:```bashroslaunchur5_moveit_configmoveit_rviz.launchconfig:=true```在Rviz中,你可以使用MoveIt插件进行运动规划:1.在"Planning"标签页下,设置目标位姿(通过拖动交互式标记)2.点击"Plan"按钮规划路径3.点击"Execute"按钮在Gazebo中执行运动###关键配置说明####1.**URDF模型位置**-安装的模型位于:`~/catkin_ws/src/universal_robot/ur_description/urdf/ur5.urdf.xacro`-该模型已经包含Gazebo所需的`<transmission>`等标签####2.**控制器配置**-控制器配置文件位于:`~/catkin_ws/src/universal_robot/ur_gazebo/config/ur5_controllers.yaml`-内容示例:```yamlarm_controller:type:position_controllers/JointTrajectoryControllerjoints:-shoulder_pan_joint-shoulder_lift_joint-elbow_joint-wrist_1_joint-wrist_2_joint-wrist_3_joint```####3.**Gazebo启动文件解析**`ur_gazebo/launch/ur5.launch`主要完成:-加载URDF到参数服务器-启动Gazebo空世界-生成机器人模型-加载并启动关节控制器###常见问题解决1.**模型无法加载/显示异常**-检查URDF路径是否正确-确保`universal_robot`包已正确编译2.**控制器启动失败**-检查`rosdepinstall`是否成功安装所有依赖-确认`ur5_controllers.yaml`文件存在且格式正确3.**MoveIt规划失败**-在Rviz中检查"PlanningScene"是否正常显示机器人-调整"StartState"为当前状态(通常选择"current")###进阶:自定义机械臂模型若需导入自定义机械臂模型,参考以下流程:1.将你的URDF/XACRO模型放入`~/catkin_ws/src/my_robot_description/urdf/`2.创建Gazebo启动文件(参考`ur_gazebo`包)3.配置MoveIt(使用MoveItSetupAssistant生成配置包)###相关问题1.如何将UR5仿真模型替换为自定义机械臂模型?2.在Gazebo中如何添加障碍物与机械臂进行交互?3.MoveIt规划路径时如何避免关节超限?[^1]:学习笔记:Ubuntu18.04+melodic+UR5e真实机械臂的驱动[^2]:Ubuntu18.04+ROS环境+moveitUR5机械臂仿真</think>### 在ROS1 (Ubuntu 18.04) 中导入机械臂并进行仿真的详细步骤 #### 1. **环境准备** ```bash # 安装ROS Melodic(Ubuntu 18.04对应版本) sudo apt install ros-melodic-desktop-full # 创建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make source devel/setup.bash ``` #### 2. **获取机械臂模型(以UR5为例)**[^2] ```bash cd ~/catkin_ws/src git clone -b melodic-devel https://github.com/ros-industrial/universal_robot.git rosdep install --from-paths . --ignore-src -y cd ~/catkin_ws catkin_make ``` #### 3. **启动Gazebo仿真** ```bash # 启动UR5在Gazebo中的仿真 roslaunch ur_gazebo ur5.launch ``` 此时会看到: - Gazebo界面显示UR5机械臂模型 - 终端显示控制器加载成功信息: ``` [INFO] [controller_spawner]: Started controllers: arm_controller, joint_state_controller ``` #### 4. **启动MoveIt运动规划** ```bash # 新终端中启动MoveIt roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true ``` #### 5. **使用Rviz可视化与控制** ```bash # 启动Rviz可视化界面 roslaunch ur5_moveit_config moveit_rviz.launch config:=true ``` 操作步骤: 1. 在Rviz中点击"Planning"标签 2. 拖动末端执行器(绿色/红色球体)设置目标位姿 3. 点击"Plan"按钮生成运动轨迹(灰色虚线) 4. 点击"Execute"执行运动(Gazebo中机械臂将同步运动)[^1] #### 6. **手动控制关节(可选)** ```bash # 发布关节角度指令示例 rostopic pub /arm_controller/command trajectory_msgs/JointTrajectory "{ joint_names: ['shoulder_pan_joint', 'shoulder_lift_joint', ...], points: [{ positions: [0.0, -1.57, 1.57, 0.0, 0.0, 0.0], time_from_start: {secs: 2}}]}" -1 ``` #### 关键配置文件说明 1. **URDF模型路径** `~/catkin_ws/src/universal_robot/ur_description/urdf/ur5.urdf.xacro` 2. **控制器配置** `~/catkin_ws/src/universal_robot/ur_gazebo/config/ur5_controllers.yaml` 3. **Gazebo启动文件** `~/catkin_ws/src/universal_robot/ur_gazebo/launch/ur5.launch` ### 自定义机械臂配置流程 若使用非UR机械臂: 1. **创建URDF模型** ```xml <!-- 示例关节定义 --> <joint name="joint1" type="revolute"> <parent link="base_link"/> <child link="link1"/> <axis xyz="0 0 1"/> <limit lower="-3.14" upper="3.14"/> </joint> ``` 2. **添加Gazebo扩展** ```xml <gazebo reference="link1"> <material>Gazebo/Red</material> </gazebo> <transmission name="tran_joint1"> <type>transmission_interface/SimpleTransmission</type> <joint name="joint1"/> <actuator name="motor1"/> </transmission> ``` 3. **生成MoveIt配置包** ```bash roslaunch moveit_setup_assistant setup_assistant.launch ``` 按向导步骤配置规划组、末端执行器等 ### 常见问题解决 1. **模型无法显示** - 检查URDF路径是否正确 - 确认`<gazebo>`标签存在 2. **控制器加载失败** - 检查`transmission`标签配置 - 确认YAML控制器文件格式正确 3. **规划失败** - 调整碰撞检测参数 - 检查关节限位设置 ### 相关问题 1. 如何将真实UR机械臂的校准参数应用到仿真环境中?[^1] 2. MoveIt和Gazebo通信失败时如何调试? 3. 如何添加自定义末端执行器工具并进行抓取仿真? [^1]: 学习笔记:Ubuntu18.04+melodic+UR5e真实机械臂的驱动 [^2]: Ubuntu18.04+ROS环境+moveit UR5机械臂仿真
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值