IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 09 机器人仿真Gazebo实例 -> 正文阅读

[人工智能]09 机器人仿真Gazebo实例

零、Gazebo

1. Gazebo是开源物理仿真环境

支持:
三维可视化环境
传感器仿真、噪声仿真
云仿真、远程仿真等功能

2. 安装对应版本的Gazebo

sudo apt-get install ros-noetic-gazebo-ros-pkgs
sudo apt-get install ros-noetic-gazebo-ros-control

3.进入Gazebo

roscore
rosrun gazebo_ros gazebo

一、建立URDF模型

1. URDF

Unified Robot Description Format 统一机器人描述格式

2. 标签

1. 声明使用xml描述

<?xml version="1.0" ?>

2. link用于描述一个刚体部件的外观和物理属性

<link>下属的<visual>用于描述外观
<visual>下属的<origin>声明三维坐标与旋转姿态 定义起点
<visual>下属的<geometry>用于描述几何形状
<geometry>下属的<cylinder>用于描述该几何的圆柱形状的半径和高
<visual>下属的<material>用于描述材质,如颜色等
<material>下属的<color>用于描述具体的RGBA值

	<link name="base_link">
		<visual>
			<orgin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<cylinder length="0.005" radius="0.13"/>
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1"/>
			</material>
		</visual>
	</link>

3. joint是用于连接两个刚体的关节

type用于描述关节的类型
fixed 固定关节
continuous 单轴旋转关节
<origin>定义了joint的起点
<parent>代表连接的一个刚体
<child>代表连接的另一个刚体
<axis>代表旋转轴

	<joint name="base_to_front_castor_joint" type="fixed">
		<origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="front_castor_link"/>
		<axis xyz="0 1 0"/>
	</joint>

4. robot是link和joint标签的父标签

link和joint标签都包含在robot标签内
当换用.xacro格式后
此处需改为
<robot name=“robot_name” xmlns:xacro=“http:www.ros.org/wiki/xacro”>

5. gazebo标签

<gazebo>在每个link中存在,包含material属性,与<visual>中的material相同,只是方便gazebo使用

3. 建立功能包

catkin_create_pkg robot_description urdf xacro

建立下属文件夹:
urdf:存.urdf或.xacro文件
meshes:存引用的模型渲染文件
launch:存启动文件
config:存rviz配置

4. 创建urdf模型

<?xml version="1.0" ?>

<robot name="robot" >



	<link name="base_link">
		<visual>
			<orgin xyz="0 0 0" rpy="0 0 0"/>
			<geometry>
				<cylinder length="0.005" radius="0.13"/>
			</geometry>
			<material name="yellow">
				<color rgba="1 0.4 0 1"/>
			</material>
		</visual>
	</link>
	
	
	
	<joint name="base_to_left_motor_joint" type="fixed">
		<origin xyz="-0.055 0.075 0" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="left_motor_link"/>
	</joint>
	
	
	
	<link name="left_motor_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.02" length="0.08"/>
			</geometry>
			<material name="gray">
				<color rgba="0.75 0.75 0.75 1"/>
			</material>
		</visual>
	</link>
	
	
	
	<joint name="left_wheel_joint" type="continuous">
		<origin xyz="0 0.0485 0" rpy="0 0 0"/>
		<parent link="left_motor_link"/>
		<child link="left_wheel_link"/>
	</joint>
	
	
	
	
	<link name="left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.033" length= "0.017"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>



	<joint name="base_to_right_motor_joint" type="fixed">
		<origin xyz="-0.055 -0.075 0" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="right_motor_link"/>
	</joint>
	
	
	
	<link name="right_motor_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.02" length="0.08"/>
			</geometry>
			<material name="gray">
				<color rgba="0.75 0.75 0.75 1"/>
			</material>
		</visual>
	</link>
	
	
	
	<joint name="right_wheel_joint" type="continuous">
		<origin xyz="0 -0.0485 0" rpy="0 0 0"/>
		<parent link="right_motor_link"/>
		<child link="right_wheel_link"/>
	</joint>
	
	
	
	
	<link name="right_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<cylinder radius="0.033" length= "0.017"/>
			</geometry>
			<material name="white">
				<color rgba="1 1 1 0.9"/>
			</material>
		</visual>
	</link>
		
	<joint name="base_to_front_castor_joint" type="fixed">
		<origin xyz="0.1135 0 -0.0165" rpy="0 0 0"/>
		<parent link="base_link"/>
		<child link="front_castor_link"/>
		<axis xyz="0 1 0"/>
	</joint>
	
	<link name="front_castor_link">
		<visual>
			<origin xyz="0 0 0" rpy="1.5707 0 0"/>
			<geometry>
				<sphere radius="0.0165"/>
			</geometry>
			<material name="black">
				<color rgba="0 0 0 0.95"/>
			</material>
			
		</visual>
	</link>
	
</robot>	

5. 检查urdf

安装检查工具

sudo apt-get install liburdfdom-tools

执行检查

check_urdf robot.urdf 

生成关系树pdf

urdf_to_graphiz  robot.urdf

6. 导入rviz检查3d模型

1. 创建launch文件

<launch>
	<param name="robot_description" textfile="$(find robot_description)/urdf/robot.urdf"/>
 

<!-- Set GUI Parameters, Show Joints Control Plugins -->
	<param name="use_gui" value="true"/>

<!-- Run joint_state_publisher Node, Pub Joints Statement of Robot -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>

<!-- Run robot_state_publisher Node,Pub TF Data-->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>

<!-- Run RVIZ -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find robot_description)/config/robot_urdf.rviz" required="true"/>

</launch>

注意需要先打开rviz加载机器人保存robot_urdf.rviz在config文件夹里以便launch文件调用

2. 运行launch文件观察效果

7. 添加物理或碰撞模型(可选)

添加物理惯性和碰撞的属性
两者都是与<visual>同级的属性标签

            <inertial>
                <mass value="0.001" />
                <origin xyz="0 0 0" />
                <inertia ixx="0.0001" ixy="0.0" ixz="0.0"
                         iyy="0.0001" iyz="0.0"
                         izz="0.0001" />
            </inertial>
<collision>
                <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
            </collision>

二、xacro:改进的urdf

.xacro是.urdf的优化版 便于阅读、复用、模块化

1.修改robot处的标签

当换用.xacro格式后
robot标签首处需改为

\<robot name="robot_name" xmlns:xacro="http:www.ros.org/wiki/xacro">

1. xacro可以定义常量,便于后期修改

\<xacro:property name="wheel_radius" value="0.033"/>
\<xacro:property name="M_PI" value="3.14159"/>

调用常量的方法:
${}可以接调用的常量,在${}里面可以有数学式子做加减乘除
推荐把部件内部的各组件关系都用加减乘除来表示,这样只需要修改常量值即可适配整个文件

\<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

2. xacro可以使用宏定义

宏(英语:Macro)是一种批量处理的称谓。
计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。
宏定义,可近似看做编程里的“函数”概念,方便复用

注意:当没有调用该宏定义的时候,它不会出现在转化出的urdf文件里

<xacro:macro name="mrobot_standoff_2in" params="parent number x_loc y_loc z_loc">
        <joint name="standoff_2in_${number}_joint" type="fixed">
            <origin xyz="${x_loc} ${y_loc} ${z_loc}" rpy="0 0 0" />
            <parent link="${parent}"/>
            <child link="standoff_2in_${number}_link" />
        </joint>

        <link name="standoff_2in_${number}_link">
            <inertial>
                <mass value="0.001" />
                <origin xyz="0 0 0" />
                <inertia ixx="0.0001" ixy="0.0" ixz="0.0"
                         iyy="0.0001" iyz="0.0"
                         izz="0.0001" />
            </inertial>

            <visual>
                <origin xyz=" 0 0 0 " rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
                <material name="black">
                    <color rgba="0.16 0.17 0.15 0.9"/>
                </material>
            </visual>

            <collision>
                <origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
                <geometry>
                    <box size="0.01 0.01 0.07" />
                </geometry>
            </collision>
        </link>
    </xacro:macro>

调用宏(macro):

<macro_name parameter1 parameter2 parameter_and_so_on/>

例子:

<triangle_board_macro parent="base_link" number="6" x_location="standoff_x/2"  y_location="standoff_y"  z_location="Height/2"/> 

3. 引用xacro

在xacro总文件里引用并调用其他机器人部件的.xacro文件
可以达到模块化开发,逻辑清晰的目的,当增删组件时,只需要修改总.xacro文件就可以了
先将部件的.xacro文件include

<xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />

|<mrobot_body/>调用mrobot_body这个组件
mrobot_body是在body这个分部件.xacro文件下的一个xacro:macro宏定义,它不需要输入参数,而且构造了整个body,在body分部件的.xacro文件下还有其他的xacro:macro宏定义,他们是mrobot_body这个宏定义的嵌套小宏定义,因此在总.xacro文件下直接调用就可以填入整个body的数据

   <!-- 引用这个.xacro文件 即编程概念里的include某个函数库 -->
    <xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />
    <!-- 调用mrobot_body这个宏定义-->
    <xacro:mrobot_body/>

4.将xacro转化成urdf

rosrun xacro xacro filename.xacro > filename.urdf

可能出现的情况:xacro转urdf为空
解释:古月居及网上一些教程有错误,没有在调用宏定义的时候给予xacro:macro_name
因此xacro转换器无法识别这条命令,解决方法如下:
注意:当没有调用该宏定义的时候,它不会出现在转化出的urdf文件里
就像是编程里的函数,如果不调用,就不会生效

<xacro:function_name param1="xxxx" param2="xxxxxx" and_so_on="xxx"/>
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:23:58  更:2022-03-30 18:28:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:33:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码