gazebo中仿真模型搭建相关总结+urdf生成

本文详细介绍了如何使用SolidWorks导出URDF文件,并在ROS环境中进行机械臂建模,涵盖关节设置、控制器配置、视觉与碰撞模型定义,以及在Gazebo中的仿真调试。

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

具体过程可参考
 

从零开始的ROS机械臂,边学边做03-SW2URDF篇  https://www.jianshu.com/p/040635e4d8c8

Solidworks 2016中导出URDF文件 https://www.cnblogs.com/21207-iHome/p/7821269.html

Solidworks模型转化为URDF文件格式+三连杆机械臂示例+逆运动学  https://blog.csdn.net/gpeng832/article/details/73917487

相关总结:



## SolidWorks中,仿真模型的相关设置
- 建立轴和坐标系需要在装配体环境下,零件环境下建立的轴和坐标系不能在导出时使用(坐标系之间的相对关系错乱);
- 其它软件生成的中性文件,也可在solidworks中组装后,用sw2urdf插件导出urdf文件;

- 1.子连杆必须指定,否则在previe and export时,会报错:“未将对象引用设置到对象的实例”;
- - 对于末端参考点,可通过dumy link形式增加,后续有介绍;

- 关节类型为fixed,其轴线可以不指定,但关节名必须给定,否则previe and export时,会提示;


- 设置完所有link和joint,选择导出,如果关节是旋转关节,则需要设置限制参数;
- - lower、upper、velocity合理设置,否则关节可能不动;
- - gazebo仿真时,关节 effort 不能为0,否则无法驱动;


- 默认生成的package.xml里的email是不合法的,要改成合法的,如<maintainer email="yzy@gmail.com" />;
- - 这个在2018版本以后已经修正

- display.launch文件里的里的False改为True,否则无法打开Joint State Publish工具;
- - kinetic版本以后,joint-state-publisher变成joint-state-publisher-gui,还需安装 sudo apt-get install ros-kinetic-joint-state-publisher-gui

- 启动display.launch以后,在rviz的界面中将Global Options下的Fixed Frame 由map改为base_link(自己定义的基座的名字);
- Joint axis的方向定义在Joint frame中,而Joint frame(即子坐标系)则相对于其父坐标系Parent frame定义;



- 错误: (使用rviz中,使用motion plan选项时)
[ERROR] [1531378477.804970828]: Robot semantic description not found. Did you forget to define or remap '/robot_description_semantic'? 
原因:没有运行moveIt! 
请先运行MoveIt!


- gazebo.launch,打开时,各关节未定义驱动;直接在重力作用下自由晃动;
- - 需在urdf文件中,增加gazebo中的相关配置;

- <robotname>_control package
- - 定义每个关节控制器,控制器种类、pid参数等
- - 仿着写!


[ WARN] [1572440451.309709717]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia.  As a workaround, you can add an extra dummy link to your URDF.
- - 注释掉URDF文件中 base_link的<inertia>...</inertia>属性部分;会报错,不行!
- - 以下是个解决方案:增加dummy link
- - 若不root link 不是dummy link,则KDL计算动力学时,也会将该root link包括在内,整体会晃动、未固定!
<link name="dummy">
   </link>
<link name="base_link">
    <inertial>
      <origin xyz="0.15 0.15 .2" rpy="0 0 0"/>
      <mass value="10"/>
      <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
                   <box size="0.01 0.01 0.01"/>
      </geometry>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
      <box size="0.01 0.01 0.01"/>
      </geometry>
    </collision>
  </link>
  <joint name="dummy_joint" type="fixed">
     <parent link="dummy"/>
     <child link="base_link"/>
   </joint>



- 末端参考点,如TCP和fingertip,也可通过增加虚拟连杆的形式增加;
<link
name="dummy">
</link>
<joint
name="dummy_joint"
type="fixed">
<origin
    xyz="0.024 0 0"
    rpy="1.5708 0 1.5708" />
<parent
    link="link1" />
<child
    link="dummy" />
<axis
    xyz="0 0 0" />
</joint>




 <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find two_finger_module)/urdf/two_finger_module.urdf -urdf -model two_finger_module -z 0.2 -r 1" />
- 此处 -z 0.2  是将仿真模型放置于环境中(0,0,200mm)处; -r 还不知具体含义?


先启动display.launch再启动gazebo.launch,Rviz中RobotModel项就会有如下报错:
突然报错:Status erro
- No transform from [link0_left] to [base_link]
sudo apt-get install unicode  后,也会出现该情况;未解决?

# 异常:
- 设置完各关节的控制器以后,gazebo中打开,零件飞起、散落
- - 不加控制器时,不会飞落;应该是控制器相关参数设置导致的;
- - gazebo仿真时,关节 effort 为0,无法驱动,在重力作用下会自由晃动。
- - 由于采用的是effort_controllers/JointPositionController,涉及到力控
- - - 调节PID参数和各连杆转动惯量;
- - -  转动惯量放大1.0E-04 到 1.0E-05倍
- - - 给定目标关节角,看是否有超调现象,调节PID参数;


control 依赖于 robot_description;




# 检查URDF语法:在urdf文件所在目录打开终端: check_urdf two_finger_module.urdf
## sudo apt install liburdfdom-tools 

robot name is: two_finger_module
---------- Successfully Parsed XML ---------------
root Link: base_link has 2 child(ren)
    child(1):  link0_left
        child(1):  link1_left
            child(1):  link2_left
                child(1):  link3_left
                    child(1):  link4_left
                        child(1):  tip_left
    child(2):  link0_right
        child(1):  link1_right
            child(1):  link2_right
                child(1):  link3_right
                    child(1):  link4_right
                        child(1):  tip_right
##### gazebo仿真相关配置:
- 在urdf文件中,增加gazebo相关属性配置;
- 设置关节控制器 --- 否则关节会在重力作用下, 自由晃动;
- - <robotname>_control package  定义每个关节控制器,控制器种类、pid参数等, 仿着写!

相关问题解决:
- 设置完各关节的控制器以后,gazebo中打开,零件飞起、散落;不加控制器时,不会飞落;应该是控制器相关参数设置导致的;
- - 由于采用的是effort_controllers/JointPositionController,涉及到力控
- - - 调节PID参数和各连杆转动惯量;
- - -  转动惯量放大1.0E-04 到 1.0E-05倍
- - - 给定目标关节角,看是否有超调现象,调节PID参数;

control 依赖于 robot_description;

#### 对灵巧手或其它具有较多相同模块的机器人,urdf文件生成
- 相同模块生成一次,接口部分统一;
- 注意:joint转动轴线 必须在 子连杆坐标轴上;
- 坐标系必须与连杆绑定;

<!-- 此标记中间模块,为结构上的共用模块,五个手指可共用相同的STL文件,但XML文件中,link和joint的名称不能相同,必须唯一-->

<link>.STL文件,是包含坐标系的3D图形文件
导出文件时,sw2urdf工具,将3维模型及指定的坐标系相关联,生成对应连杆的STL文件;

连杆的相对位置,由<joint>中的<origin>属性指定,xyzrpy设定了child连杆在parent连杆坐标系中的位姿;关节轴,是child连杆坐标系的某一坐标轴;

sw2urdf工具导出的urdf文件,往往会有错误,如:Rviz显示时,某些零件相对位置反了,这就是因为<joint>中的<origin>属性的rpy角度生成错误,需要手动修正;

#### 相关问题:
 <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find two_finger_module)/urdf/two_finger_module.urdf -urdf -model two_finger_module -z 0.2 -r 1" />
- 此处 -z 0.2  是将仿真模型放置于环境中(0,0,200mm)处; -r 还不知具体含义?

- 先启动display.launch再启动gazebo.launch,Rviz中RobotModel项就会有如下报错:
突然报错:Status erro
- No transform from [link0_left] to [base_link]
sudo apt-get install unicode  后,也会出现该情况;未解决?

[ WARN] [1572440451.309709717]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia.  As a workaround, you can add an extra dummy link to your URDF.
- - 注释掉URDF文件中 base_link的<inertia>...</inertia>属性部分;会报错,不行!
- - 以下是个解决方案:增加dummy link
- - 若root link 不是dummy link,则KDL计算动力学时,也会将该root link包括在内,整体会晃动、未固定!
<link name="dummy">//world
   </link>
<link name="base_link">
    <inertial>
      <origin xyz="0.15 0.15 .2" rpy="0 0 0"/>
      <mass value="10"/>
      <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
                   <box size="0.01 0.01 0.01"/>
      </geometry>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
      <box size="0.01 0.01 0.01"/>
      </geometry>
    </collision>
  </link>
  <joint name="dummy_joint" type="fixed">
     <parent link="dummy"/>
     <child link="base_link"/>
   </joint>

No transform from [thumb_l1] to [base_link]
# xacro的使用
- 使用宏定义,简化urdf文件,增加模块复用率;

[WARN]: Controller Spawner couldn't find the expected controller_manager ROS Interface
1.ros-kinetic-gazebo-ros-control未安装
解决方法:sudo apt-get install ros-kinetic-gazebo-ros-control
2.urdf文件, gazebo-ros-control 的 robotNamespace未配置正确

  <gazebo>
    <plugin filename="libgazebo_ros_control.so" name="gazebo_ros_control">
    </plugin>
  </gazebo>
  改为:
  <gazebo>
    <plugin filename="libgazebo_ros_control.so" name="gazebo_ros_control">
      <robotNamespace>/robot_hand_left</robotNamespace>
    </plugin>
  </gazebo>

<think>好的,我需要帮助用户了解如何在Gazebo搭建带有贴图的仿真场景。用户提到了现有的贴图不足,导致视觉SLAM仿真时出现错误的闭环问题,所以他们需要添加自定义贴图。首先,我得回顾一下Gazebo的基础知识,然后结合引用中的信息来组织步骤。 根据引用[3],Gazebo中可以通过手动建立模型,并使用control + B来打开墙体编辑界面,设置贴图的z轴位置。这可能涉及到在模型中添加不同层次的墙体,并选择贴图。此外,引用[1]提到用户需要添加自己的贴图来避免闭环问题,这可能与材质文件的路径设置有关。引用[2]虽然主要讲多无人机仿真,但可能涉及到场景的搭建,不过暂时可能用不上。 首先,用户需要知道如何创建或编辑模型,并应用贴图。Gazebo的材质通常存储在特定的目录下,如~/.gazebo/models,或者项目的资源路径中。用户可能需要将自定义的贴图图片(如PNG或JPEG)放入这些目录,并编写对应的材质脚本(.material文件)来引用这些图片。然后,在模型文件中(如SDF或URDF)指定使用的材质。 接下来,步骤可能包括:创建模型结构(如墙体)、应用贴图到表面、设置材质属性(如反光度、纹理缩放)。可能需要使用Gazebo的Building Editor工具(通过control + B进入)来绘制墙体并选择贴图。另外,用户可能需要手动编辑模型文件,添加材质路径和配置。 还需要注意,贴图文件需要正确链接,否则Gazebo无法加载。材质文件中的纹理路径应该是正确的相对或绝对路径。此外,贴图的分辨率和尺寸可能会影响仿真效果,尤其是在视觉SLAM中,高分辨率和清晰纹理可能更有利于特征匹配,减少错误闭环。 可能的问题包括:贴图不显示、路径错误、材质属性设置不正确。需要指导用户检查Gazebo的日志输出,查找材质加载的错误信息。同时,可能推荐用户使用绝对路径测试,再调整为相对路径,确保模型在不同环境中的可移植性。 最后,根据用户的问题,生成相关问题可能涉及Gazebo的其他材质设置、优化仿真性能、与其他工具(如ROS)的集成等。需要确保回答结构清晰,步骤详细,并引用提供的参考资料中的信息。</think>### Gazebo仿真场景搭建与贴图设置教程 #### 一、基础模型搭建 1. **使用Building Editor创建墙体** 在Gazebo界面中按 `Ctrl+B` 进入墙体编辑模式,通过点击画布绘制平面结构,右键结束当前绘制。 - 通过左侧面板切换 `Level1` 和 `Level2` 可创建多层结构[^3]。 - 按 `Ctrl+X` 保存并退出时会自动生成模型文件。 2. **手动编辑模型文件** 生成的模型文件默认存储在 `~/.gazebo/models` 目录下,可修改其SDF文件以调整尺寸、位置或添加其他部件。 --- #### 二、自定义贴图与材质设置 1. **准备贴图文件** - 贴图格式需为 `.png`、`.jpg` 等Gazebo支持的格式。 - 建议将贴图文件放在模型目录的 `materials/textures` 子目录中,例如: ```bash my_custom_wall/ ├── model.sdf └── materials/ └── textures/ └── brick_wall.png ``` 2. **编写材质脚本** 在模型目录下创建 `materials/scripts` 子目录,新建 `.material` 文件(如 `custom.material`),内容示例: ```cpp material Custom/BrickWall { technique { pass { texture_unit { texture brick_wall.png scale 1.0 1.0 // 控制纹理缩放 } } } } ``` 3. **在模型文件中引用材质** 编辑模型的SDF文件,在 `<visual>` 标签内指定材质: ```xml <visual name="wall_visual"> <material> <script> <uri>model://my_custom_wall/materials/scripts</uri> <name>Custom/BrickWall</name> </script> </material> </visual> ``` --- #### 三、高级材质属性调整 1. **反射与光照效果** 在 `.material` 文件中添加以下参数可调整表面反光度: ```cpp material Custom/ShinyBrickWall { technique { pass { ambient 0.5 0.5 0.5 1.0 diffuse 0.8 0.8 0.8 1.0 specular 0.3 0.3 0.3 1.0 } } } ``` 2. **解决贴图路径问题** 若贴图显示,检查以下内容: - 确认材质脚本中的文件名与实际文件一致。 - 在Gazebo启动时添加资源路径: ```bash export GAZEBO_RESOURCE_PATH=$GAZEBO_RESOURCE_PATH:/path/to/your/model ``` --- #### 四、应用场景验证 完成贴图设置后,启动SLAM算法(如ORB-SLAM)测试场景,观察特征点匹配是否稳定。若仍出现错误闭环,可尝试: - 增加贴图细节复杂度(如添加随机噪点图案)[^1]。 - 调整环境光照参数,避免反光干扰。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值