网站二级页面做哪些东西,凡科建站是什么,深圳网络科技有限公司,网站index.php被修改目录 1 机器人系统仿真的必要性与本篇学习目的
1.1 机器人系统仿真的必要性
1.2 一些概念
URDF是 Unified Robot Description Format 的首字母缩写#xff0c;直译为统一(标准化)机器人描述格式#xff0c;可以以一种 XML 的方式描述机器人的部分结构#xff0c;比如底盘…目录 1 机器人系统仿真的必要性与本篇学习目的
1.1 机器人系统仿真的必要性
1.2 一些概念
URDF是 Unified Robot Description Format 的首字母缩写直译为统一(标准化)机器人描述格式可以以一种 XML 的方式描述机器人的部分结构比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C 内置的解释器转换成可视化的机器人模型是 ROS 中实现机器人仿真的重要组件
RViz 是 ROS Visualization Tool 的首字母缩写直译为ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息可以将 数据进行可视化表达。例如:可以显示机器人模型可以无需编程就能表达激光测距仪LRF传感器中的传感 器到障碍物的距离RealSense、Kinect或Xtion等三维距离传感器的点云数据PCD Point Cloud Data从相机获取的图像值等
2 URDF 集成 RVIZ 基本流程
2.1 urdf语法
2.1.1 robot标签
2.1.2 link标签
1.属性
2.子标签
3.一个案例
2.1.3 joint标签
1.属性
2.子标签
3.案例实现
2.1.4 设置base_footprint优化urdf
2.1.5 可能问题
2.2 案例设计机器人
2.2.1 需求
2.2.2 添加base_footprint
2.2.3 添加底盘
2.2.4 驱动轮添加
2.2.5 万向轮添加
2.2.6 urdf工具
3 Urdf优化--Xacro
3.1 应用场景
3.2 利用xacro实现2.2案例实现快速通关
3.3 XACRO语法详解
3.3.1 xmlns
3.3.2 属性与算数运算
3.3.3 宏
3.3.4 文件包含
3.4 用xacro完成2.2节的机器人的设计
3.4.1 添加xacro的链接
3.4.2 base_footprint的实现
3.4.3 底盘的实现
3.4.4 驱动轮的实现
3.4.5 万向轮的实现
3.5 案例
3.5.1 总体的xacro文件
3.5.2 总体的launch文件
3.5.3 相机实现
3.5.4 雷达实现
4 在RVIZ中控制机器人运动
5 Urdf集成gazebo
5.1 URDF 与 Gazebo 集成流程
5.2 计算方法惯性矩阵等
1.collision
2.inertial
3.颜色设置
5.3 实际操作将机器人模型显示在gazebo里面
5.3.1 实现流程
5.3.2 编写封装惯性矩阵算法的 xacro 文件
5.3.3 封装总的xacro小车雷达相机惯性
5.3.4 launch文件
5.3.5 底盘修改
5.3.6 传感器修改
6 Gazebo仿真环境搭建 1 机器人系统仿真的必要性与本篇学习目的
1.1 机器人系统仿真的必要性 对于ROS新手而言可能会有疑问学习机器人操作系统实体机器人是必须的吗答案是否定的机器人一般价格不菲为了降低机器人学习、调试成本在ROS中提供了系统的机器人仿真实现通过仿真可以实现大部分需求本章主要就是围绕“仿真”展开的比如本章会介绍 如何创建并显示机器人模型如何搭建仿真环境如何实现机器人模型与仿真环境的交互。 本章预期的学习目标如下: 能够独立使用URDF创建机器人模型并在Rviz和Gazebo中分别显示能够使用Gazebo搭建仿真环境能够使用机器人模型中的传感器(雷达、摄像头、编码器...)获取仿真环境数据。 1.2 一些概念 URDF是 Unified Robot Description Format 的首字母缩写直译为统一(标准化)机器人描述格式可以以一种 XML 的方式描述机器人的部分结构比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度.....,该文件可以被 C 内置的解释器转换成可视化的机器人模型是 ROS 中实现机器人仿真的重要组件 RViz 是 ROS Visualization Tool 的首字母缩写直译为ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息可以将 数据进行可视化表达。例如:可以显示机器人模型可以无需编程就能表达激光测距仪LRF传感器中的传感 器到障碍物的距离RealSense、Kinect或Xtion等三维距离传感器的点云数据PCD Point Cloud Data从相机获取的图像值等 以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时RViz会默认被安装。 运行使用命令rviz或rosrun rviz rviz 如果rviz没有安装请调用如下命令自行安装: sudo apt install ros-[ROS_DISTRO]-rvizGazebo是一款3D动态模拟器用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似Gazebo提供高保真度的物理模拟其提供一整套传感器模型以及对用户和程序非常友好的交互方式。 以“ros- [ROS_DISTRO] -desktop-full”命令安装ROS时gzebo会默认被安装。 2 URDF 集成 RVIZ 基本流程 URDF 不能单独使用需要结合 Rviz 或 GazeboURDF 只是一个文件需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型当前首先演示URDF与Rviz的集成使用因为URDF与Rviz的集成较之于URDF与Gazebo的集成更为简单后期基于Rviz的集成实现我们再进一步介绍URDF语法。 我们需要建立一个盒型机器人并在RVIZ中显示 实现流程 准备:新建功能包导入依赖 核心:编写 urdf 文件 核心:在 launch 文件集成 URDF 与 Rviz 在 Rviz 中显示机器人模型 第一步新建功能包 依赖于urdf与xacro cmake_minimum_required(VERSION 2.8.3)
project(test)######################
### Cmake flags
######################
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS -stdc11)
set(CMAKE_CXX_FLAGS_RELEASE -O3 -Wall -g -pthread)find_package(catkin REQUIRED COMPONENTSroscpprospyroslib# msgurdfxacro
)catkin_package()include_directories(${catkin_INCLUDE_DIRS})第二步编写urdf文件测试 robot namemycarlink namebase_linkvisualgeometrybox size0.5 0.2 0.1 //geometry/visual/link
/robot第三步在 launch 文件中集成 URDF 与 Rviz launch!-- 设置参数 --param namerobot_description textfile/home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/urdf/demo01_testing.urdf /!-- 启动 rviz --node pkgrviz typerviz namerviz //launch我的目录结构如下 我们启动launch文件 liuhongweiliuhongwei-Legion-Y9000P-IRX8H:~/Desktop/final/catkin_studyrobot$ source devel/setup.bash
liuhongweiliuhongwei-Legion-Y9000P-IRX8H:~/Desktop/final/catkin_studyrobot$ roslaunch test demo01_test.launch 发现Rviz啥也没有....需要配置一下 在Rviz中添加机器人模型 改正参考坐标系base_link 机器人完全被导入了。 那么我们每次都要这么设置太麻烦了我们在Rviz中保存设置 我们修改launch文件让读取的时候载入我们的设置。 launch!-- 设置参数 --param namerobot_description textfile/home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/urdf/demo01_testing.urdf /!-- 启动 rviz --node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz //launch再次打开就是直接这个界面啦 2.1 urdf语法 URDF 文件是一个标准的 XML 文件在 ROS 中预定义了一系列的标签用于描述机器人模型机器人模型可能较为复杂但是 ROS 的 URDF 中机器人的组成却是较为简单可以主要简化为两部分:连杆(link标签) 与 关节(joint标签)接下来我们就通过案例了解一下 URDF 中的不同标签: robot 根标签类似于 launch文件中的launch标签link 连杆标签joint 关节标签gazebo 集成gazebo需要使用的标签 关于gazebo标签后期在使用 gazebo 仿真时才需要使用到用于配置仿真环境所需参数比如: 机器人材料属性、gazebo插件等但是该标签不是机器人模型必须的只有在仿真时才需设置 2.1.1 robot标签 urdf 中为了保证 xml 语法的完整性使用了robot标签作为根标签所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称 1.属性 name: 指定机器人模型的名称 2.子标签 其他标签都是子级标签 2.1.2 link标签 urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性比如: 机器人底座、轮子、激光雷达、摄像头...每一个部件都对应一个 link, 在 link 标签内可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性。 1.属性 name --- 为连杆命名 2.子标签 visual --- 描述外观(对应的数据是可视的) geometry 设置连杆的形状 标签1: box(盒状) 属性:size长(x) 宽(y) 高(z) 标签2: cylinder(圆柱) 属性:radius半径 length高度 标签3: sphere(球体) 属性:radius半径 标签4: mesh(为连杆添加皮肤) 属性: filename资源路径(格式:package://packagename/path/文件) origin 设置偏移量与倾斜弧度 属性1: xyzx偏移 y便宜 z偏移 属性2: rpyx翻滚 y俯仰 z偏航 (单位是弧度) metrial 设置材料属性(颜色) 属性: name 标签: color 属性: rgba红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1]) collision --- 连杆的碰撞属性 Inertial --- 连杆的惯性矩阵 在此只演示visual使用。 3.一个案例 分别生成长方体、圆柱与球体的机器人部件 先生成立方体用我们之前的rviz配置 robot name mycarlink namebase_linkvisualgeometrybox size0.3 0.2 0.1 //geometry/visual/link/robot launch文件还是和前面一样。 生成圆柱 robot name mycarlink namebase_linkvisualgeometry!-- box size0.3 0.2 0.1 / --cylinder radius0.1 length10 //geometry/visual/link/robot mesh标签可以将外部的模型导入 其中package是功能包的名字。后面是相对于ros工作目录的相对路径我们执行一下。 成功导入了。 这个机器人是歪的如何摆正呢我们先拿立方体举例子 origin 设置偏移量与倾斜弧度 属性1: xyzx偏移 y便宜 z偏移 属性2: rpyx翻滚 y俯仰 z偏航 (单位是弧度) robot name mycarlink namebase_linkvisualgeometrybox size0.3 0.2 0.1 /!-- cylinder radius0.1 length10 / --!-- mesh filenamepackage://test/meshes/autolabor_mini.stl / --/geometryorigin xyz3 0 0 rpy0 0 0 //visual/link/robot RPY呢感受一下先改变R。沿着X轴翻转。 P呢 沿Y轴进行了运动。Yaw当然是Z轴的旋转啦。 了解这些后我们看看我们的小车。怎么将它摆正呢 沿着x轴旋转90度是不是就可以了。 robot name mycarlink namebase_linkvisualgeometry! -- box size0.3 0.2 0.1 / --!-- cylinder radius0.1 length10 / --mesh filenamepackage://test/meshes/autolabor_mini.stl //geometryorigin xyz0 0 0 rpy1.57 0 0 //visual/link/robot 那我还想让他摆向X轴正方向呢沿Z轴转改变偏航角就ok啦 我想换个颜色呢 metrial 设置材料属性(颜色) 属性: name 标签: color robot name mycarlink namebase_linkvisualgeometry! -- box size0.3 0.2 0.1 / --!-- cylinder radius0.1 length10 / --mesh filenamepackage://test/meshes/autolabor_mini.stl //geometryorigin xyz0 0 0 rpy1.57 0 1.57 /material namecar_colorcolor rgba0 0 1 1 //material/visual/link/robot 变成蓝色 2.1.3 joint标签 urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性还可以指定关节运动的安全极限机器人的两个部件(分别称之为 parent link 与 child link)以关节的形式相连接不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制...., 比如:安装在底座上的轮子可以360度旋转而摄像头则可能是完全固定在底座上。 joint标签对应的数据在模型中是不可见的。 父级和子级和物理实现的运动关系有关。 1.属性 name --- 为关节命名 type --- 关节运动形式 continuous: 旋转关节可以绕单轴无限旋转 revolute: 旋转关节类似于 continues,但是有旋转角度限制 prismatic: 滑动关节沿某一轴线移动的关节有位置极限 planer: 平面关节允许在平面正交方向上平移或旋转 floating: 浮动关节允许进行平移、旋转运动 fixed: 固定关节不允许运动的特殊关节 2.子标签 parent(必需的) parent link的名字是一个强制的属性 link:父级连杆的名字是这个link在机器人结构树中的名字。 child(必需的) child link的名字是一个强制的属性 link:子级连杆的名字是这个link在机器人结构树中的名字。 origin 属性: xyz各轴线上的偏移量 rpy各轴线上的偏移弧度。joint添加到parent的哪个位置 axis 属性: xyz用于设置围绕哪个关节轴运动。 3.案例实现 创建机器人模型底盘为长方体在长方体的前面添加一摄像头摄像头可以沿着 Z 轴 360 度旋转。 我们设置摄像头还有小车底盘信息 !--需求: 创建机器人模型底盘为长方体在长方体的前面添加一摄像头摄像头可以沿着 Z 轴 360 度旋转--
robot namemycar!-- 底盘 --link namebase_linkvisualgeometrybox size0.5 0.2 0.1 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/link!-- 摄像头 --link namecameravisualgeometrybox size0.02 0.05 0.05 //geometryorigin xyz0 0 0 rpy0 0 0 /material nameredcolor rgba1 0 0 0.5 //material/visual/link/robot 再设置关节信息我们假设摄像头可以360度旋转类型是continuous。 我们设置子节点、父节点 parent linkbase_link /
child linkcamera / 现在计算一下偏移我们画个图 因为摄像头只能绕Z轴转axis要设置为1。 !--需求: 创建机器人模型底盘为长方体在长方体的前面添加一摄像头摄像头可以沿着 Z 轴 360 度旋转--
robot namemycar!-- 底盘 --link namebase_linkvisualgeometrybox size0.5 0.2 0.1 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/link!-- 摄像头 --link namecameravisualgeometrybox size0.02 0.05 0.05 //geometryorigin xyz0 0 0 rpy0 0 0 /material nameredcolor rgba1 0 0 0.5 //material/visual/link!-- 关节 --joint namecamera2baselink typecontinuousparent linkbase_link /child linkcamera /!-- 需要计算两个 link 的物理中心之间的偏移量 --origin xyz0.2 0 0.075 rpy0 0 0 /axis xyz0 0 1 //joint/robot 写launch文件 launch!-- 设置参数 --param namerobot_description textfile/home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/urdf/test_threecomposerobot.urdf /!-- 启动 rviz --node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz //launch 运行发现有问题摄像头应该是在我的车子上怎么这样了颜色也不对。 存在问题摄像头显示位置不对没有cam到base_link的TF 原因是rviz显示urdf的时候必须发布不同不同部件间的坐标系关系 解决ROS提供了关于机器人模型显示的坐标发表相关节点。 完整的launch文件 launch!-- 设置参数 --param namerobot_description textfile/home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/urdf/demo03_cam_robot.urdf /!-- 启动 rviz --node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz /!-- 添加关节状态发布节点 --node pkgjoint_state_publisher typejoint_state_publisher namejoint_state_publisher /!-- 添加机器人状态发布节点 --node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher /!-- 可选:用于控制关节运动的节点 --node pkgjoint_state_publisher_gui typejoint_state_publisher_gui namejoint_state_publisher_gui /
/launch发现嵌入了。。。。 这是因为关节Z轴的偏移量是0.05那么关节点刚好在上面平面上。因为关节点和相机的中心点是重合的。需要让中心点上移半个cam的高度。0.05 1/2 0.05/2 0.075 joint namecamera2baselink typecontinuousparent linkbase_link /child linkcamera /origin xyz0.2 0 0.05 rpy0 0 0 /axis xyz0 0 1 //joint 显示正常啦 旋转一下哈哈。 2.1.4 设置base_footprint优化urdf 前面实现的机器人模型是半沉到地下的因为默认情况下: 底盘的中心点位于地图原点上所以会导致这种情况产生可以使用的优化策略将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体或边长为 0.001m 的立方体)然后再在初始 link 上添加底盘等刚体这样实现虽然仍然存在初始link半沉的现象但是基本可以忽略了。这个初始 link 一般称之为 base_footprint。 先设置一个极小的base_footprint link namebase_footprintvisualgeometrybox size0.001 0.001 0.001 //geometry/visual/link关联base_link与base_footprintbase_link到base_footprintZ轴增加了0.05米 joint namelink2footprint typefixedparent linkbase_footprint /child linkbase_link /origin xyz0 0 0.05 rpy0 0 0 /axis xyz0 0 0 //joint 启动launch看看效果。 2.1.5 可能问题 问题UnicodeEncodeError: ascii codec cant encode characters in position 463-464: ordinal not in range(128) [joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:joint_state_publisher __log:/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log]. log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log 解决去除urdf中文注释 问题[ERROR] [1584370263.037038]: Could not find the GUI, install the joint_state_publisher_gui package 解决sudo apt install ros-melodic-joint-state-publisher-gui 2.2 案例设计机器人
2.2.1 需求 创建一个四轮圆柱状机器人模型机器人参数如下底盘为圆柱状半径 10cm高 8cm四轮由两个驱动轮和两个万向支撑轮组成两个驱动轮半径为 3.25cm,轮胎宽度1.5cm两个万向轮为球状半径 0.75cm底盘离地间距为 1.5cm(与万向轮直径一致)。 实现流程: 创建机器人模型可以分步骤实现 新建 urdf 文件并与 launch 文件集成 搭建底盘 在底盘上添加两个驱动轮 在底盘上添加两个万向轮 2.2.2 添加base_footprint link namebase_footprintvisualgeometrysphere radius0.001 //geometry/visual/link 2.2.3 添加底盘 参数 形状:圆柱 半径:10 cm 高度:8 cm 离地:1.5 cm 我们先不设置偏移量 link namebase_linkvisualgeometrycylinder radius0.1 length0.08 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/link添加baselink到basefootprint的关节 joint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 0.055 //joint原来parent link到child link只需要变化一个1/2的底盘高也就是0.04米。但是又要离地1.5cm即0.015m那就是0.055米。 我们现在启动节点 满足需求。 2.2.4 驱动轮添加 驱动轮是侧翻的圆柱 参数 半径: 3.25 cm 长度: 1.5 cm 颜色: 黑色 关节设置: x 0 y 底盘的半径 轮胎宽度 / 2 z 离地间距 底盘长度 / 2 - 轮胎半径 1.5 4 - 3.25 2.25(cm) axis 0 1 0 我们需要设置欧拉角让他是侧躺的。 需要沿着x红色轴翻转90度。 因此base_link到left_wheel的偏移是-0.0225米。 我们看看TF robot namemycarlink namebase_footprintvisualgeometrysphere radius0.001 //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius0.1 length0.08 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 0.055 //jointlink nameleft_wheelvisualgeometrycylinder radius0.0325 length0.015 //geometryorigin xyz0 0 0 rpy1.5708 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linklink nameright_wheelvisualgeometrycylinder radius0.0325 length0.015 //geometryorigin xyz0 0 0 rpy1.5708 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linkjoint namebase_link2left_wheel typecontinuousparent linkbase_link /child linkleft_wheel/origin xyz0 0.1 -0.0225 /axis xyz0 1 0 //jointjoint namebase_link2right_wheel typecontinuousparent linkbase_link /child linkright_wheel/origin xyz0 -0.1 -0.0225 /axis xyz0 1 0 //joint/robot2.2.5 万向轮添加 形状: 球体 半径: 0.75 cm 颜色: 黑色 x有偏移万向轮一般都小于车体的半径。车体的半径是10cm0.10m我们设置为0.08my上面没有偏移。 对于Z。关节在万象轮的中点。我们需要计算万向轮相对于车体中间节点的距离。车体距离地面是0.055米。万向轮中点距离地面是万向轮的半径0.0075。那么这个落差就是0.055-0.00750.0475。. 完整代码如下 robot namemycarlink namebase_footprintvisualgeometrysphere radius0.001 //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius0.1 length0.08 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 0.055 //jointlink nameleft_wheelvisualgeometrycylinder radius0.0325 length0.015 //geometryorigin xyz0 0 0 rpy1.5708 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linklink nameright_wheelvisualgeometrycylinder radius0.0325 length0.015 //geometryorigin xyz0 0 0 rpy1.5708 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linkjoint namebase_link2left_wheel typecontinuousparent linkbase_link /child linkleft_wheel/origin xyz0 0.1 -0.0225 /axis xyz0 1 0 //jointjoint namebase_link2right_wheel typecontinuousparent linkbase_link /child linkright_wheel/origin xyz0 -0.1 -0.0225 /axis xyz0 1 0 //jointlink namefront_wheelvisualgeometrysphere radius0.0075 //geometryorigin xyz0 0 0 rpy0 0 0 /material nameblackcolor rgba0.0 0.0 0.0 1.0 //material/visual/linkjoint namefront_wheel2base_link typecontinuousparent linkbase_link /child linkfront_wheel /origin xyz0.0925 0 -0.0475 /axis xyz1 1 1 //jointlink nameback_wheelvisualgeometrysphere radius0.0075 //geometryorigin xyz0 0 0 rpy0 0 0 /material nameblackcolor rgba0.0 0.0 0.0 1.0 //material/visual/linkjoint nameback_wheel2base_link typecontinuousparent linkbase_link /child linkback_wheel /origin xyz-0.0925 0 -0.0475 /axis xyz1 1 1 //joint/robot我们运行一下 demo结束啦 2.2.6 urdf工具 在 ROS 中提供了一些工具来方便 URDF 文件的编写比如: check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题 urdf_to_graphiz命令可以查看 urdf 模型结构显示不同 link 的层级关系 当然要使用工具之前首先需要安装安装命令:sudo apt install liburdfdom-tools check_urdf 语法检查 liuhongweiliuhongwei-Legion-Y9000P-IRX8H:~/Desktop/final/catkin_studyrobot/src/urdf/urdf$ check_urdf demo05.urdf
robot name is: mycar
---------- Successfully Parsed XML ---------------
root Link: base_footprint has 1 child(ren)child(1): base_linkchild(1): back_wheelchild(2): left_wheelchild(3): right_wheelchild(4): front_wheel没问题会显示如下内容。 错误的话给给出报错信息的。 会显示机器人的。 3 Urdf优化--Xacro
3.1 应用场景 前面 URDF 文件构建机器人模型的过程中存在若干问题。 问题1:在设计关节的位置时需要按照一定的公式计算公式是固定的但是在 URDF 中依赖于人工计算存在不便容易计算失误且当某些参数发生改变时还需要重新计算。 问题2:URDF 中的部分内容是高度重复的驱动轮与支撑轮的设计实现不同轮子只是部分参数不同形状、颜色、翻转量都是一致的在实际应用中构建复杂的机器人模型时更是易于出现高度重复的设计按照一般的编程涉及到重复代码应该考虑封装。...... 如果在编程语言中可以通过变量结合函数直接解决上述问题在 ROS 中已经给出了类似编程的优化方案称之为:Xacro Xacro 是 XML Macros 的缩写Xacro 是一种 XML 宏语言是可编程的 XML。 Xacro 可以声明变量可以通过数学运算求解使用流程控制控制执行顺序还可以通过类似函数的实现封装固定的逻辑将逻辑中需要的可变的数据以参数的方式暴露出去从而提高代码复用率以及程序的安全性。 较之于纯粹的 URDF 实现可以编写更安全、精简、易读性更强的机器人模型文件且可以提高编写效率。 3.2 利用xacro实现2.2案例实现快速通关 我们先来看一个写好的 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacro!-- 属性封装 --xacro:property namewheel_radius value0.0325 /xacro:property namewheel_length value0.0015 /xacro:property namePI value3.1415927 /xacro:property namebase_link_length value0.08 /xacro:property namelidi_space value0.015 /!-- 宏 --xacro:macro namewheel_func paramswheel_name flag link name${wheel_name}_wheelvisualgeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0 0 0 rpy${PI / 2} 0 0 /material namewheel_colorcolor rgba0 0 0 0.3 //material/visual/link!-- 3-2.joint --joint name${wheel_name}2link typecontinuousparent linkbase_link /child link${wheel_name}_wheel /!--x 无偏移y 车体半径z z 车体高度 / 2 离地间距 - 车轮半径--origin xyz0 ${0.1 * flag} ${(base_link_length / 2 lidi_space - wheel_radius) * -1} rpy0 0 0 /axis xyz0 1 0 //joint/xacro:macroxacro:wheel_func wheel_nameleft flag1 /xacro:wheel_func wheel_nameright flag-1 /
/robot很像函数哈哈。 如何将xacro转换成urdf呢 rosrun xacro xacro demo01.urdf.xacro 成功 rosrun xacro xacro demo01.urdf.xacro 文件名称可以将urdf写入一个文件中。 3.3 XACRO语法详解 xacro 提供了可编程接口类似于计算机语言包括变量声明调用、函数声明与调用等语法实现。在使用 xacro 生成 urdf 时根标签robot中必须包含命名空间声明:xmlns:xacrohttp://wiki.ros.org/xacro 3.3.1 xmlns robot namemycar xmlns:xacrohttp://wiki.ros.org/xacro
/robot 必须要这样的robot name是机器人的名称。 3.3.2 属性与算数运算 用于封装 URDF 中的一些字段比如: PAI 值小车的尺寸轮子半径 .... xacro:property namexxxx valueyyyy /robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namePI value3.1415927 /xacro:property nameradius value0.03 //robot定义两个变量。 属性调用我们来看看这个结果证明xacro是可以编程的。 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namePI value3.1415927 /xacro:property nameradius value0.03 /myusepro name${PI} /myusepro name${radius} /
/robot算术运算呢 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namePI value3.1415927 /xacro:property nameradius value0.03 /myusepro name${PI} /myusepro name${radius} /myusecal result${PI/2} /
/robotOK! 3.3.3 宏 类似于函数实现提高代码复用率优化代码结构提高安全性。 定义如下 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:macro namegetSum paramsnum1 num2result value${num1 num2} //xacro:macro/robot调用如下 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:macro namegetSum paramsnum1 num2result value${num1 num2} //xacro:macroxacro:getSum num11 num22 /
/robot 3.3.4 文件包含 机器人由多部件组成不同部件可能封装为单独的 xacro 文件最后再将不同的文件集成组合为完整机器人可以使用文件包含实现。 robot namexxx xmlns:xacrohttp://wiki.ros.org/xacroxacro:include filenamemy_base.xacro /xacro:include filenamemy_camera.xacro /xacro:include filenamemy_laser.xacro /....
/robot3.4 用xacro完成2.2节的机器人的设计
3.4.1 添加xacro的链接 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacro/robot 3.4.2 base_footprint的实现 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacrolink namebase_footprintvisualgeometrysphere radius0.001 //geometry/visual/link/robot 半径可以封装为xacro属性。 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namefootprint_radius value0.001/link namebase_footprintvisualgeometrysphere radius${footprint_radius} //geometry/visual/link/robot 我们执行这个文件看看对不对。 没毛病。 3.4.3 底盘的实现 link namebase_linkvisualgeometrycylinder radius0.1 length0.08 //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 0.055 //joint 观察urdf文件需要封装车体高度、离地偏移量、小车的半径高度。 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namefootprint_radius value0.001/xacro:property namebase_radius value0.1/xacro:property namebase_length value0.08/xacro:property namelidi value0.015/xacro:property namebase_joint_z value${base_length/2 lidi}/link namebase_footprintvisualgeometrysphere radius${footprint_radius} //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 ${base_joint_z} //joint/robot 执行 没毛病 我们查看一下这个模型呢在launch文件中集成xacro。 launchparam namerobot_description command$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/demo05carbase.xacro /node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz /node pkgjoint_state_publisher typejoint_state_publisher namejoint_state_publisher /node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher /node pkgjoint_state_publisher_gui typejoint_state_publisher_gui namejoint_state_publisher_gui /
/launch 执行launch文件。 没毛病。 3.4.4 驱动轮的实现 看一下差异link name和偏移量不同 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namefootprint_radius value0.001/xacro:property namebase_radius value0.1/xacro:property namebase_length value0.08/xacro:property namelidi value0.015/xacro:property namebase_joint_z value${base_length/2 lidi}/link namebase_footprintvisualgeometrysphere radius${footprint_radius} //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 ${base_joint_z} //jointxacro:property namewheel_radius value0.0325/xacro:property namewheel_length value0.015/xacro:property namePI value3.1415927/xacro:property namewheel_joint_Z value${-base_length/2-lidiwheel_radius}/xacro:macro namewheel_func paramswheel_name flaglink name${wheel_name}_wheelvisualgeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0 0 0 rpy${PI/2} 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linkjoint namebase_link2_${wheel_name} typecontinuousparent linkbase_link /child link${wheel_name}_wheel/origin xyz0 ${0.1 * flag} ${wheel_joint_Z} /axis xyz0 1 0 //joint/xacro:macroxacro:wheel_func wheel_nameleft flag1 /xacro:wheel_func wheel_nameright flag-1 //robot Successfully! 3.4.5 万向轮的实现 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namefootprint_radius value0.001/xacro:property namebase_radius value0.1/xacro:property namebase_length value0.08/xacro:property namelidi value0.015/xacro:property namebase_joint_z value${base_length/2 lidi}/link namebase_footprintvisualgeometrysphere radius${footprint_radius} //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visual/linkjoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 ${base_joint_z} //jointxacro:property namewheel_radius value0.0325/xacro:property namewheel_length value0.015/xacro:property namePI value3.1415927/xacro:property namewheel_joint_Z value${-base_length/2-lidiwheel_radius}/xacro:macro namewheel_func paramswheel_name flaglink name${wheel_name}_wheelvisualgeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0 0 0 rpy${PI/2} 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visual/linkjoint namebase_link2_${wheel_name} typecontinuousparent linkbase_link /child link${wheel_name}_wheel/origin xyz0 ${0.1 * flag} ${wheel_joint_Z} /axis xyz0 1 0 //joint/xacro:macroxacro:wheel_func wheel_nameleft flag1 /xacro:wheel_func wheel_nameright flag-1 /xacro:property namesmall_radius value0.0075/xacro:property namesmall_jointz value${-base_length/2-lidismall_radius}/xacro:macro namesmall_wheel_func paramssmall_wheel_name flaglink name${small_wheel_name}_wheelvisualgeometrysphere radius${small_radius} //geometryorigin xyz0 0 0 rpy0 0 0 /material nameblackcolor rgba0.0 0.0 0.0 1.0 //material/visual/linkjoint name${small_wheel_name}2base_link typecontinuousparent linkbase_link /child link${small_wheel_name}_wheel /origin xyz${0.0925 * flag} 0 ${small_jointz} /axis xyz1 1 1 //joint/xacro:macroxacro:small_wheel_func small_wheel_namefront flag1 /xacro:small_wheel_func small_wheel_nameback flag-1 //robot 启动 3.5 案例 在前面小车底盘基础之上添加摄像头和雷达传感器。 3.5.1 总体的xacro文件 robot namemycarwithlidarandcamera xmlns:xacrohttp://wiki.ros.org/xacroxacro:include filenamecam.xacro /xacro:include filenamelidar.xacro /xacro:include filenamedemo05carbase.xacro //robot包含三个子文件 3.5.2 总体的launch文件 launchparam namerobot_description command$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_with_lidar_cam.xacro /node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz /node pkgjoint_state_publisher typejoint_state_publisher namejoint_state_publisher /node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher /node pkgjoint_state_publisher_gui typejoint_state_publisher_gui namejoint_state_publisher_gui /
/launch 先启动一下 没毛病。 3.5.3 相机实现 摄像头的长宽高、偏移量都需要设置 开始编程。 robot namecam xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namecam_x value0.02 /xacro:property namecam_y value0.05 /xacro:property namecam_z value0.05 /xacro:property namecam_off_x value0.08 / xacro:property namecam_off_y value0 /xacro:property namecam_off_z value${base_length/2 cam_z/2 } //robot设置连杆关节 robot namecam xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namecam_x value0.02 /xacro:property namecam_y value0.05 /xacro:property namecam_z value0.05 /xacro:property namecam_off_x value0.08 /xacro:property namecam_off_y value0 /xacro:property namecam_off_z value${base_length/2 cam_z/2 } /link namecameravisualgeometrybox size${cam_x} ${cam_y} ${cam_z} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameblack //visual/linkjoint namecamera2base_link typefixedparent linkbase_link /child linkcamera /origin xyz${cam_off_x} ${cam_off_y} ${cam_off_z} //joint
/robot再次运行launch文件。 成功 3.5.4 雷达实现 雷达支架设计支架圆柱的半径以及高度。 安装在车体中心X、Y偏移量都是0。 我们看Z的偏移量。很简单 robot namelidar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namesupport_radius value0.01 /xacro:property namesupport_length value0.15 /xacro:property namelaser_radius value0.03 /xacro:property namelaser_length value0.05 /xacro:property namesupport_off_x value0 /xacro:property namesupport_off_y value0 /xacro:property namesupport_off_z value${ base_length/2 laser_length/2 } /xacro:property namelidar_off_x value0 /xacro:property namelidar_off_y value0 /xacro:property namelidar_off_z value${support_off_z/2 laser_length/2} //robot 关节、link实现。 robot namelidar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namesupport_radius value0.01 /xacro:property namesupport_length value0.15 /xacro:property namelaser_radius value0.03 /xacro:property namelaser_length value0.05 /xacro:property namesupport_off_x value0 /xacro:property namesupport_off_y value0 /xacro:property namesupport_off_z value${ base_length/2 laser_length/2 } /xacro:property namelidar_off_x value0 /xacro:property namelidar_off_y value0 /xacro:property namelidar_off_z value${support_off_z/2 laser_length/2} /link namesupportvisualgeometrycylinder radius${support_radius} length${support_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameredcolor rgba0.8 0.2 0.0 0.8 //material/visual/linkjoint namesupport2base_link typefixedparent linkbase_link /child linksupport /origin xyz${support_off_x} ${support_off_y} ${support_off_z} //jointlink namelaservisualgeometrycylinder radius${laser_radius} length${laser_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameblack //visual/linkjoint namelaser2support typefixedparent linksupport /child linklaser /origin xyz${lidar_off_x} ${lidar_off_y} ${lidar_off_z} //joint/robot最终效果 4 在RVIZ中控制机器人运动 通过 URDF 结合 rviz 可以创建并显示机器人模型不过当前实现的只是静态模型如何控制模型的运动呢在此可以调用 Arbotix 实现此功能。 Arbotix:Arbotix 是一款控制电机、舵机的控制板并提供相应的 ros 功能包这个功能包的功能不仅可以驱动真实的 Arbotix 控制板它还提供一个差速控制器通过接受速度控制指令更新机器人的 joint 状态从而帮助我们实现机器人在 rviz 中的运动。 这个差速控制器在 arbotix_python 程序包中完整的 arbotix 程序包还包括多种控制器分别对应 dynamixel 电机、多关节机械臂以及不同形状的夹持器。 实现流程: 安装 Arbotix 创建新功能包准备机器人 urdf、xacro 文件 添加 Arbotix 配置文件 编写 launch 文件配置 Arbotix 启动 launch 文件并控制机器人模型运动 安装 sudo apt-get install ros-melodic-arbotix 创建新功能包准备机器人 urdf、xacrourdf 和 xacro 调用上一讲实现即可 添加 arbotix 所需的配置文件 # 该文件是控制器配置,一个机器人模型可能有多个控制器比如: 底盘、机械臂、夹持器(机械手)....
# 因此根 name 是 controller
controllers: {# 单控制器设置base_controller: {#类型: 差速控制器type: diff_controller,#参考坐标base_frame_id: base_footprint, #两个轮子之间的间距base_width: 0.2,#控制频率ticks_meter: 2000, #PID控制参数使机器人车轮快速达到预期速度Kp: 12, Kd: 12, Ki: 0, Ko: 50, #加速限制accel_limit: 1.0 }
}建立control.yaml 然后编写 launch 文件配置 Arbotix 节点 launchparam namerobot_description command$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_with_lidar_cam.xacro /node pkgrviz typerviz namerviz args-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz /node pkgjoint_state_publisher typejoint_state_publisher namejoint_state_publisher /node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher /node pkgarbotix_python typearbotix_driver namedriver outputscreenrosparam commandload file/home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/control.yaml /param namesim valuetrue //node
/launch 运行launch文件启动仿真环境。 选择odom坐标系。 rostopic pub -r 10 /cmd_vel geometry_msgs/Twist {linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}} 小车动起来了 添加TF、ODOM。 5 Urdf集成gazebo URDF 需要集成进 Rviz 或 Gazebo 才能显示可视化的机器人模型前面已经介绍了URDF 与 Rviz 的集成本节主要介绍: URDF 与 Gazebo 的基本集成流程如果要在 Gazebo 中显示机器人模型URDF 需要做的一些额外配置关于Gazebo仿真环境的搭建。 5.1 URDF 与 Gazebo 集成流程 URDF 与 Gazebo 集成流程与 Rviz 实现类似主要步骤如下: 创建功能包导入依赖项 编写 URDF 或 Xacro 文件 启动 Gazebo 并显示机器人模型 在CMakeLists.txt中添加依赖 find_package(catkin REQUIRED COMPONENTSroscpprospyroslib# msgurdfxacrogazebo_rosgazebo_ros_controlgazebo_plugins
) 在package.xml添加依赖 build_dependgazebo_ros/build_dependrun_dependgazebo_ros/run_dependbuild_dependgazebo_ros_control/build_dependrun_dependgazebo_ros_control/run_dependbuild_dependgazebo_plugins/build_dependrun_dependgazebo_plugins/run_depend 注意 当 URDF 需要与 Gazebo 集成时和 Rviz 有明显区别:1.必须使用 collision 标签因为既然是仿真环境那么必然涉及到碰撞检测collision 提供碰撞检测的依据。 2.必须使用 inertial 标签此标签标注了当前机器人某个刚体部分的惯性矩阵用于一些力学相关的仿真计算。 3.颜色设置也需要重新使用 gazebo 标签标注因为之前的颜色设置为了方便调试包含透明度仿真环境下没有此选项。 collision如果是标准几何体把geometry复制一下就好了 collisiongeometrybox size0.5 0.2 0.1 //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 //collision 设置惯性矩阵先忽略、设置颜色 !-- 创建一个机器人模型(盒状即可)显示在 Gazebo 中
--robot namemycarlink namebase_linkvisualgeometrybox size0.5 0.2 0.1 //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameyellowcolor rgba0.5 0.3 0.0 1 //material/visualcollisiongeometrybox size0.5 0.2 0.1 //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 //collisioninertialorigin xyz0 0 0 /mass value6 /inertia ixx1 ixy0 ixz0 iyy1 iyz0 izz1 //inertial/linkgazebo referencebase_linkmaterialGazebo/Black/material/gazebo/robot集成进launch文件 launchparam namerobot_description textfile/home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/urdf/gazebo_1.urdf /include file$(find gazebo_ros)/launch/empty_world.launch /node pkggazebo_ros typespawn_model namemodel args-urdf -model mycar -param robot_description /
/launch 启动launch文件发现已经集成了。 5.2 计算方法惯性矩阵等 1.collision 如果机器人link是标准的几何体形状和link的 visual 属性设置一致即可。 2.inertial 惯性矩阵的设置需要结合link的质量与外形参数动态生成标准的球体、圆柱与立方体的惯性矩阵公式如下(已经封装为 xacro 实现): 球体惯性矩阵 !-- Macro for inertia matrix --xacro:macro namesphere_inertial_matrix paramsm rinertialmass value${m} /inertia ixx${2*m*r*r/5} ixy0 ixz0iyy${2*m*r*r/5} iyz0 izz${2*m*r*r/5} //inertial/xacro:macro圆柱惯性矩阵 xacro:macro namecylinder_inertial_matrix paramsm r hinertialmass value${m} /inertia ixx${m*(3*r*rh*h)/12} ixy 0 ixz 0iyy${m*(3*r*rh*h)/12} iyz 0izz${m*r*r/2} / /inertial/xacro:macro立方体惯性矩阵 xacro:macro nameBox_inertial_matrix paramsm l w hinertialmass value${m} /inertia ixx${m*(h*h l*l)/12} ixy 0 ixz 0iyy${m*(w*w l*l)/12} iyz 0izz${m*(w*w h*h)/12} //inertial/xacro:macro需要注意的是原则上除了 base_footprint 外机器人的每个刚体部分都需要设置惯性矩阵且惯性矩阵必须经计算得出如果随意定义刚体部分的惯性矩阵那么可能会导致机器人在 Gazebo 中出现抖动移动等现象。 3.颜色设置 在 gazebo 中显示 link 的颜色必须要使用指定的标签: gazebo referencelink节点名称materialGazebo/Blue/material
/gazebomaterial 标签中设置的值区分大小写颜色可以设置为 Red Blue Green Black ..... 5.3 实际操作将机器人模型显示在gazebo里面
5.3.1 实现流程 需要编写封装惯性矩阵算法的 xacro 文件 为机器人模型中的每一个 link 添加 collision 和 inertial 标签并且重置颜色属性 在 launch 文件中启动 gazebo 并添加机器人模型 5.3.2 编写封装惯性矩阵算法的 xacro 文件 interial.xacro 这个专业性太强了。 robot namebase xmlns:xacrohttp://wiki.ros.org/xacro!-- Macro for inertia matrix --xacro:macro namesphere_inertial_matrix paramsm rinertialmass value${m} /inertia ixx${2*m*r*r/5} ixy0 ixz0iyy${2*m*r*r/5} iyz0izz${2*m*r*r/5} //inertial/xacro:macroxacro:macro namecylinder_inertial_matrix paramsm r hinertialmass value${m} /inertia ixx${m*(3*r*rh*h)/12} ixy 0 ixz 0iyy${m*(3*r*rh*h)/12} iyz 0izz${m*r*r/2} //inertial/xacro:macroxacro:macro nameBox_inertial_matrix paramsm l w hinertialmass value${m} /inertia ixx${m*(h*h l*l)/12} ixy 0 ixz 0iyy${m*(w*w l*l)/12} iyz 0izz${m*(w*w h*h)/12} //inertial/xacro:macro
/robot5.3.3 封装总的xacro小车雷达相机惯性 robot namemycarwithlidarandcamera xmlns:xacrohttp://wiki.ros.org/xacroxacro:include filenameinterial.xacro /xacro:include filenamedemo05carbase.xacro /xacro:include filenamecam.xacro /xacro:include filenamelidar.xacro //robot5.3.4 launch文件 launchparam namerobot_description command$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro /include file$(find gazebo_ros)/launch/empty_world.launch /node pkggazebo_ros typespawn_model namemodel args-urdf -model mycar -param robot_description /
/launch 目前我们框架搭建完毕。 5.3.5 底盘修改 小车主体部分加颜色 惯性矩阵信息 link namebase_linkvisualgeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visualcollisiongeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 //collisionxacro:cylinder_inertial_matrix m${2} r${base_radius} h${base_length} //linkgazebo referencebase_linkmaterial Gazebo/Yellow/material/gazebo 执行launch文件 小车主体部分已经有了 驱动轮和支承轮也是同样道理完整代码如下 xacro:property namewheel_radius value0.0325/xacro:property namewheel_length value0.015/xacro:property namePI value3.1415927/xacro:property namewheel_joint_Z value${-base_length/2-lidiwheel_radius}/xacro:macro namewheel_func paramswheel_name flaglink name${wheel_name}_wheelvisualgeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0 0 0 rpy${PI/2} 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visualcollisiongeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0.0 0.0 0.0 rpy${PI / 2} 0.0 0.0 //collisionxacro:cylinder_inertial_matrix m${1} r${wheel_radius} h${wheel_length} //linkjoint namebase_link2_${wheel_name} typecontinuousparent linkbase_link /child link${wheel_name}_wheel/origin xyz0 ${0.1 * flag} ${wheel_joint_Z} /axis xyz0 1 0 //jointgazebo reference${wheel_name}_wheelmaterial Gazebo/Red/material/gazebo/xacro:macro 最完整的代码如下 robot namemycar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namefootprint_radius value0.001/xacro:property namebase_radius value0.1/xacro:property namebase_length value0.08/xacro:property namelidi value0.015/xacro:property namebase_joint_z value${base_length/2 lidi}/link namebase_footprintvisualgeometrysphere radius${footprint_radius} //geometry/visual/linklink namebase_linkvisualgeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 /material namebluecolor rgba0 0 1.0 0.5 //material/visualcollisiongeometrycylinder radius${base_radius} length${base_length} //geometryorigin xyz0 0 0 rpy0 0 0 //collisionxacro:cylinder_inertial_matrix m${2} r${base_radius} h${base_length} //linkgazebo referencebase_linkmaterial Gazebo/Yellow/material/gazebojoint namebase_link2base_footprint typefixedparent linkbase_footprint /child linkbase_link/origin xyz0 0 ${base_joint_z} //jointxacro:property namewheel_radius value0.0325/xacro:property namewheel_length value0.015/xacro:property namePI value3.1415927/xacro:property namewheel_joint_Z value${-base_length/2-lidiwheel_radius}/xacro:macro namewheel_func paramswheel_name flaglink name${wheel_name}_wheelvisualgeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0 0 0 rpy${PI/2} 0 0 /material namewheel_colorcolor rgba0 0 1.0 0.5 0.3 //material/visualcollisiongeometrycylinder radius${wheel_radius} length${wheel_length} //geometryorigin xyz0.0 0.0 0.0 rpy${PI / 2} 0.0 0.0 //collisionxacro:cylinder_inertial_matrix m${1} r${wheel_radius} h${wheel_length} //linkjoint namebase_link2_${wheel_name} typecontinuousparent linkbase_link /child link${wheel_name}_wheel/origin xyz0 ${0.1 * flag} ${wheel_joint_Z} /axis xyz0 1 0 //jointgazebo reference${wheel_name}_wheelmaterial Gazebo/Red/material/gazebo/xacro:macroxacro:wheel_func wheel_nameleft flag1 /xacro:wheel_func wheel_nameright flag-1 /xacro:property namesmall_radius value0.0075/xacro:property namesmall_jointz value${-base_length/2-lidismall_radius}/xacro:macro namesmall_wheel_func paramssmall_wheel_name flaglink name${small_wheel_name}_wheelvisualgeometrysphere radius${small_radius} //geometryorigin xyz0 0 0 rpy0 0 0 /material nameblackcolor rgba0.0 0.0 0.0 0.6 //material/visualcollisiongeometrysphere radius${small_radius} //geometryorigin xyz0 0 0 rpy0 0 0 //collisionxacro:sphere_inertial_matrix m${0.08} r${small_radius} //linkjoint name${small_wheel_name}2base_link typecontinuousparent linkbase_link /child link${small_wheel_name}_wheel /origin xyz${0.0925 * flag} 0 ${small_jointz} /axis xyz1 1 1 //jointgazebo reference${small_wheel_name}_wheelmaterial Gazebo/Red/material/gazebo/xacro:macroxacro:small_wheel_func small_wheel_namefront flag1 /xacro:small_wheel_func small_wheel_nameback flag-1 //robot gazebo显示 5.3.6 传感器修改 总结了一下。 robot namecam xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namecam_x value0.02 /xacro:property namecam_y value0.05 /xacro:property namecam_z value0.05 /xacro:property namecam_off_x value0.08 /xacro:property namecam_off_y value0 /xacro:property namecam_off_z value${base_length/2 cam_z/2 } /link namecameravisualgeometrybox size${cam_x} ${cam_y} ${cam_z} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameblack //visualcollisiongeometrybox size${cam_x} ${cam_y} ${cam_z} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 //collisionxacro:Box_inertial_matrix m${0.01} l${cam_x} w${cam_y} h${cam_z} //linkjoint namecamera2base_link typefixedparent linkbase_link /child linkcamera /origin xyz${cam_off_x} ${cam_off_y} ${cam_off_z} //jointgazebo referencecameramaterialGazebo/Blue/material/gazebo/robot图片上有个错误gazebo reference应该和link name一致的。 再设置下雷达 雷达有两个连杆因此要设置两次 robot namelidar xmlns:xacrohttp://wiki.ros.org/xacroxacro:property namesupport_radius value0.01 /xacro:property namesupport_length value0.15 /xacro:property namelaser_radius value0.03 /xacro:property namelaser_length value0.05 /xacro:property namesupport_off_x value0 /xacro:property namesupport_off_y value0 /xacro:property namesupport_off_z value${ base_length/2 laser_length/2 } /xacro:property namelidar_off_x value0 /xacro:property namelidar_off_y value0 /xacro:property namelidar_off_z value${support_off_z/2 laser_length/2} /link namesupportvisualgeometrycylinder radius${support_radius} length${support_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameredcolor rgba0.8 0.2 0.0 0.8 //material/visualcollisiongeometrycylinder radius${support_radius} length${support_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 //collisionxacro:cylinder_inertial_matrix m${0.1} r${support_radius} h${support_length} //linkgazebo referencesupportmaterialGazebo/Grey/material/gazebojoint namesupport2base_link typefixedparent linkbase_link /child linksupport /origin xyz${support_off_x} ${support_off_y} ${support_off_z} //jointlink namelaservisualgeometrycylinder radius${laser_radius} length${laser_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 /material nameblack //visualcollisiongeometrycylinder radius${laser_radius} length${laser_length} //geometryorigin xyz0.0 0.0 0.0 rpy0.0 0.0 0.0 //collisionxacro:cylinder_inertial_matrix m${0.15} r${laser_radius} h${laser_length} //linkjoint namelaser2support typefixedparent linksupport /child linklaser /origin xyz${lidar_off_x} ${lidar_off_y} ${lidar_off_z} //jointgazebo referencelasermaterialGazebo/Black/material/gazebo/robot运行launch文件 OK啦 6 Gazebo仿真环境搭建 在gazebo中显示别人搭建好的仿真环境。 建立world文件夹放入事先建立好的world文件。 launchparam namerobot_description command$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro /include file$(find gazebo_ros)/launch/empty_world.launcharg nameworld_name value/home/liuhongwei/Desktop/final/catkin_studyrobot/src/world/box_house.world //includenode pkggazebo_ros typespawn_model namemodel args-urdf -model mycar -param robot_description /
/launch执行 成功