零、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格式后
此处需改为
5. gazebo标签
在每个link中存在,包含material属性,与中的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文件调用
其他例子:
<launch>
<arg name="model" default="$(find xacro)/xacro --inorder '$(find mrobot_description)/urdf/mrobot_with_camera.urdf.xacro'" />
<arg name="gui" default="true" />
<param name="robot_description" command="$(arg model)" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="$(arg gui)"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot.rviz" required="true" />
</launch>
2. 运行launch文件观察效果
7. 添加物理或碰撞模型(可选)
添加物理惯性和碰撞的属性
两者都是与同级的属性标签
<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):
<xacro:macro_name parameter1 parameter2 parameter_and_so_on/>
例子:
<xacro:triangle_board_macro parent="base_link" number="6" x_location="standoff_x/2" y_location="standoff_y" z_location="Height/2"/>
为宏设置默认参数(忽视此部分,存在错误)
<xacro:macro name="kinect_camera" params="param_name:=defalut_value">
<link name="${param_name}_link">
<!-- and so on -->
3. 引用xacro
在xacro总文件里引用并调用其他机器人部件的.xacro文件
可以达到模块化开发,逻辑清晰的目的,当增删组件时,只需要修改总.xacro文件就可以了
先将部件的.xacro文件include
<xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />
|调用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"/>
5.在launch文件中转化xacro为urdf直接使用
<arg name="mode" default="$(find xacro)/xacro '$(find robot_description)/urdf/robot.urdf.xacro' "/>
<param name="robot_description" command="$(arg model)"/>
三、ROS_control
1.框架结构
ROS_control的框架结构为
1.Controller Manager 控制器管理器
使用通用接口用于管理各个控制器
2.Controller 控制器
控制joint 读取硬件资源接口状态 发布控制指令 提供pid控制器
3.Hardware Resource Interface Layer 硬件资源接口层
为上下两层提供硬件资源的接口
4.RobotHW 抽象硬件
接触硬件资源,通过Read和Write完成硬件操作
5.Real Robot 真实机器人
真实的控制器、执行器
2.运行工具controller_manager
1.controller_manager
rosrun controller_manager controller_manager command controller_name
commands:
load unload start stop spawn(加载并启动控制器) kill(停止并卸载控制器)
list 列出所有控制器,并显示其状态
list-types等
2.spawner/unspawner
controller_manager包下也存在可以一次性加载多个控制器的命令
如果需要加载并启动,可以去掉–stopped
rosrun controller_manager spawner --stopped name1 name2 name3
一次性停止但不卸载
rosrun controller_manager unspawner name1 name2 name3
3.在launch文件中使用controller_manager
参数–stopped为可选项 添加后可仅加载不启动
<launch>
<node pkg="controller_manager" type="spawner" args="--stopped controller_name1 controller_name2 controller_name3"/>
</launch>
四、为模型添加 属性标签
1.
每个link都需要添加标签,包含属性仅有material
因为gazebo不支持的material,需要单独设置,否则默认为灰白
在link中添加:
<gazebo reference="link_name">
<material>Gazebo/Black</material>
</gazebo>
referrence若不添加,则默认作用在标签上
2.
传动装置可以用来表示驱动机器人运动的动力源
actuator 执行器
joint为要绑定驱动器的joint,是提供动力的原件
type为使用的传动类型
hardwareInterface定义硬件接口类型
<transmission name="wheel_joint_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="base_to_wheel_joint"/>
<actuator name="wheel_joint_motor">
<hardwareInterface>VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1<mechanicalReduction>
</actuator>
</transmission>
五、添加gazebo控制器插件
1. 为添加gazebo插件
<gazebo>
<plugin name="unique_name" filename="plugin_name.so">
<!-- more plugin parameters -->
</plugin>
</gazebo>
2. 为或者添加gazebo插件
<gazebo reference="link_or_joint_name">
<plugin name="unique_name" filename="plugin_name.so">
<!-- more plugin parameters -->
</plugin>
</gazebo>
gazebo默认的插件存放位置为/opt/ros/noetic/lib,形式为libgazeboXXXX.so
0000
安装ROS自带的导航包
move-base在包中
sudo apt-get install ros-noetic-navigation