环境

solidworks2024

Ubuntu22.04

humble+ros2

C++包

前言

最近在学东西,刚好到仿真这一步,在显示模型这一步卡了很久,解决后记录一下,可能第二天就忘了,所有的都用大白话说,真实。

文章包括建立URDF,导入rviz2,以及遇到问题后的解决方法。有机械臂和小车两种。

一、Solidworks导出URDF

下载、安装sw_urdf_exporter插件

https://wiki.ros.org/sw_urdf_exporter

Solidworks2021版本之后的都下这个版本,安装位置随便,安装好后,sw的工具里直接就会有,不用另外设置。

尝试了两种,一个是简单版机械臂,一个是小车。

因为一直不显示模型,就以为是机械臂的模型面太多了导致加载不出来,所以构建了两个URDF,两种的构建方式略有不同,下面来介绍

1、小车

1.1先构建一个小车

非常简单,直接给大家。

sw_小车

以及构建后的urdf_小车

打开“车.SLDASM”

1.2 建立底盘原点及坐标系

先点底盘的一个面,再点“点”出现以下界面:

然后点“√”原点就建好了

坐标系创建按照这个顺序点,出现:

其中,

红色:x

绿色:y

蓝色:z

这一步什么都不用加,直接点左上角的“√”就行。

建好为这样。

1.3 建立车轮原点、坐标系及基准轴

根据如图顺序,出现:

这个情况,就点“√”

然后依次将其他的3个轮子建立好点

就是这样。

然后建立坐标系。顺序与建立底盘坐标系一样

点开后依旧什么都不用改直接点“√”:

然后剩下的3个轮子的坐标系建立步骤一样:

基准轴

首先隐藏车轮,将鼠标移动到车轮上,按“TAB”键隐藏车轮零件:

点内壁,再点基准轴

这样 其他的都是直接选择好的 直接点“√”即可:

将另外3个基准轴也同样建立好

建立完后使用“shift”+“TAB”的方式将隐藏的轮子重新显示。

后开始重命名,以x指向方向为前方,设置如下

前左为forward left 也就是fl,前右为forward right(fr),后左back left(bf),后右back right(br)

1.4 URDF转换(这一步开始之前记得保存)

看到网上有人说,建立URDF基本上是直接覆盖你原来的模型,就是要改很多东西,所以之后在自己的模型上,如果要建立URDF,一定要备份

打开“Export as URDF”,出现:

默认就是设置base_link,我个人是这么理解的,base_link应该是基座,比如说小车底盘、机械臂底座,就是不能动的。

有可能会出现:

它的意思是开始之前需要保存并且重构文件,点“是”(开始之后我的sw就崩了,还以为坐标什么的要重新搞,还好保存了,吓人)

然后要选择它的零件、坐标系

然后,把0加到4

会出现4个Empty_Link,这里小车的4个link同属于base_link下,大概就是4个车轮是同级的。然后点第一个Empty_Link,开始对其设置。

框选的都要改,然后fr、bl、br的同理

没问题了就点Preview...

直接Next

Next后才会出现base_link,和其他4个link,直接点右下角那个按钮生成URDF和Meshes(里面是STL文件)

这里一定要重命名,为了方便复刻,建议都和我一样,写armrobot

这里

urdf_小车

可以直接下载

2、机械臂

机械臂的sw图来自:晴晴的机械臂

导出的urdf:urdf_基准轴机械臂

2.1以基准轴为核心

2.1.1建立基准轴

顺序是,点一下第一个轴的电机,再建立基准轴

这样操作后,出来的基准轴就是在圆柱中心的,没有要修改的,直接点“√”

依次建立剩下两个电机的基准轴,并修改基准轴的名字:joint_x

后在工具中下拉找到URDF的插件:

出现:      1:选择基线零件,也就是底座吧,把底座和第一个轴的电机选上

2:加1

3:点击新出来的Empty_Link

Empty_Link进来的界面是这样的:

设置为如下:

1:改名link1

2:改名joint1

3:选基准轴jonit_1

4:改为revolute(为什么选这个,这个是什么意思,等我后面再看看)

5:选零件(也就是第一个电机直接控制的零件,大概是这个意思)

6:+1

7:点击新出来的Empty_Link

下一个是:

零件选择第二个轴的电机直接控制的

设置完后,点新出来的Empty_Link。

下一个:

设置完了,看一下没问题后点击:

2.1.2 URDF转换

出现:

点击joint1:

将框选的jointType设置一下,好像是会重置,然后第二个框,就是你这个电机的最小弧度、最大弧度、力矩、速度,将3个joint都设置好后点右下角的Next:

点击base_link设置Mass(kg),设置底座的重量,设置大一点,为了防止在仿真中,电机给底座甩飞,剩下3个关节的重量可以根据实际设置,因为这里只是学怎么建立,就懒得搞了。设置好后点击右下角的Export URDF and Meshes

文件名一定要改,不然是其他的格式。学习的话就跟我改成一样的,因为后面要改代码,一样的话简单一点。

2.2以坐标轴为核心

跟着教程走了一遍感觉怪怪的,放到rviz2里显示也有问题,等后续再加上。

二、导入Linux并在rviz2里打开

1、 修改导出文件

正常情况下是这些文件:

在我分享的里面只有

我把.....log和textures删了,.log是日志,textures是空的,都没用,就删了。

建立完成后,生成出来的是ros格式的,而我们要用的是ros2,所以要改

需要改的是CMakeLists.txt 、package.xml、launch文件夹下新建display.launch.py(这里是两个“.”)

如果保存名是armrobot的话就直接复制粘贴,啥也不用改

1、CMakeLists.txt 

cmake_minimum_required(VERSION 3.8)
project(armrobot)

find_package(ament_cmake REQUIRED)

# 安装启动文件、配置文件、3D网格文件、URDF文件 到合适位置
install(
  DIRECTORY config launch meshes urdf
  DESTINATION share/${PROJECT_NAME}
)

ament_package()

这里面就是加了一个install

2、package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>armrobot</name>
  <version>1.0.0</version>
  <description>
    <p>URDF Description package for armrobot</p>
    <p>This package contains configuration data, 3D models and launch files for armrobot robot</p>
  </description>
  <author>TODO</author>
  <maintainer email="TODO@email.com">TODO</maintainer>
  <license>BSD</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>robot_state_publisher</depend>
  <depend>joint_state_publisher_gui</depend>
  <depend>rviz2</depend>
  <depend>ros2launch</depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

加了些depend

3、display.launch.py

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    pkg_share = get_package_share_directory('armrobot') #获取包的路径
    
    urdf_path = os.path.join(pkg_share, 'urdf', 'armrobot.urdf') 
    #定义urdf文件路径 包路径/urdf/armrobot.urdf
    with open(urdf_path, 'r') as f:
        robot_description = f.read()
    
    return LaunchDescription([
    	#启动节点: 关节状态发布器-gui版本
        Node(
            package='joint_state_publisher_gui',
            executable='joint_state_publisher_gui',
            name='joint_state_publisher_gui'
        ),
        #启动节点: 机器人状态发布器
        Node(
            package='robot_state_publisher',
            executable='robot_state_publisher',
            name='robot_state_publisher',
            parameters=[{
                'robot_description': robot_description
            }]
        ),
        #这个加不加无所谓,大概就是直接把map引到base_link,作用就是不用改Fixed Frame了,可以直接用map
        Node(
            package='tf2_ros',
            executable='static_transform_publisher',
            arguments=['0', '0', '0', '0', '0', '0', 'map', 'base_link']
        ),
        #启动节点: rviz2
        Node(
            package='rviz2',
            executable='rviz2',
            name='rviz2'
        )
    ])

ros一键启动是直接用launch,ros2要一键启动需要建立.py

2、新建包

进入Linux

打开终端后使用

mkdir ros_ws
cd ros_ws

新建文件夹并进入,后:

ros2 pkg create armrobot --build-type ament_cmake

创建一个以C++为核心的,名叫armrobot的ros2包

2、导入URDF

在这个路径下,将Windows导出的URDF包中的

这一坨全部复制进去,我的环境是VMware,直接Ctrl+C、Ctrl+V,会出现:

直接点跳过,会出现两次,都跳过,貌似是Windows与Linux的环境冲突?跳过对后续操作没有任何影响。

3、构建并运行

首先安装依赖

sudo apt update
sudo apt install ros-humble-robot-state-publisher 
sudo apt install ros-humble-joint-state-publisher
sudo apt install ros-humble-joint-state-publisher-gui

新开一个终端,使用:

cd ros2_ws
colcon build
source install/setup.bash
ros2 launch armrobot display.launch.py

即可打开rviz2

有些人这里可能是报错的,我没有是因为我在CMakeList.txt里加了

Node(
            package='tf2_ros',
            executable='static_transform_publisher',
            arguments=['0', '0', '0', '0', '0', '0', 'map', 'base_link']
        ),

加不加无所谓,没有任何区别(不显示跟这里没关系)

1.改Fixed Frame 为 base_link

2.Add RobotModel

新建后是这样的

啥也没有,最最最最最最最最最最最最最最最最重要的来了

框选的Topic要选择如图所示的,选好后再点一下空白处,就显示出来了,刚开始比较小,放大就显示了

三、不显示问题集合

整个流程是sw导出urdf,Linux新建包,把URDF复制进去,然后装依赖,再构建运行,打开rviz2后改Fixed Frame、加RobotModel、设置xxx Topic 为/robot_descirption

我就是“设置xxx Topic 为/robot_descirption”这一步一直没设置,然后模型显示不出来,但是TF又可以显示,然后就狂问AI,AI给我的解决办法是

(db:豆包、dp:deepseek、gpt:chatgpt)

1.db,dp,gpt:构建的模型太大/小了,你放大或者缩小后就有了,或者是你视角有问题,构建的urdf可能出现在犄角旮旯里,自测:纯神经病,0关系。

2.三兄弟:你的Fixed Frame没有改成base_name,可能有用吧。

3.db大将军:是你的颜色设置了255,rviz2显示不了255的颜色。(颜色这个没测试过)。你透明度是不是搞的0,应该设置为1(也是神经病,没改过,怎么可能默认是0啊)

4.三兄弟:路径问题,改xxx.urdf文件

<mesh
          filename="package://armrobot/meshes/link3.STL" />

试试绝对路径用File:///(大致长这样)。(不可能,因为urdf是生成的文件,基本没问题,可以在.py里加print看路径有没有找到)

5.用ros2 node list

ros2 topic list 等命令看节点、话题(基本都是没问题的)


总结

最近一年天天熬夜,记忆下降很严重,不记录我可能第二天就忘了,所以速成出来记录一下,所以肯定有很多问题,各位看到哪里有问题直接私信我或者评论区留言。

看了很多教程,好像都没有说要设置Description Topic,所以就一直搞不出来,他们都是导入进去然后改Fixed Frame,再Add RobotModel,就显示了,卡了我两天,太折磨了,希望这个能对各位有所帮助。

本来想着构建等操作直接放个链接,但是一篇全是链接的文章实在是看不下去,所以全部手搓了一下。

参考文献

小车构建

机械臂基准轴构建

机械臂坐标轴构建

真神(解决问题的关键):看这篇文章的时候瞥了一眼

感觉这个robot_description在哪见过,然后在Topic里加了它,就显示了!太神了!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐