# 机器人仿真

课件

# 目标

  • 能够使用 URDF 创建机器人模型,并在 Rviz (感知环境) 和 Gazebo (创建仿真环境) 分别显示
  • 能够使用 Gazebo 搭建仿真环境
  • 能够使用机器人模型中的传感器 (雷达、摄像头...) 获取仿真环境参数

# 工具介绍

  • URDF:URDF 是 Unified Robot Description Format 的首字母缩写,直译为统一 (标准化) 机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度....., 该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件

  • Rviz:RViz 是 ROS Visualization Tool 的首字母缩写,直译为 ROS 的三维可视化工具。它的主要目的是以三维方式显示 ROS 消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离,RealSense、Kinect 或 Xtion 等三维距离传感器的点云数据(PCD, Point Cloud Data),从相机获取的图像值等

    以 “ros- [ROS_DISTRO] -desktop-full” 命令安装 ROS 时,RViz 会默认被安装。

    运行使用命令 rvizrosrun rviz rviz

    sudo apt install ros-[ROS_DISTRO]-rviz
  • Gazebo:Gazebo 是一款 3D 动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo 提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

    以 “ros- [ROS_DISTRO] -desktop-full” 命令安装 ROS 时,gzebo 会默认被安装。

    运行使用命令 gazeborosrun gazebo_ros gazebo

# URDF 语法

# robot

  • robot:urdf 中为了保证 xml 语法的完整性,使用了 robot 标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称

  • name: 指定机器人模型的名称

    <robot name="mycar">
        ......
        ......
    </robot>
  • liink:urdf 中的 link 标签用于描述机器人某个部件 (也即刚体部分) 的外观和物理属性,比如:机器人底座、轮子、激光雷达、摄像头... 每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性

  • name ---> 为连杆命名 (配对出现)

    <link name="base_link">
    </link>
  • 子标签

    • visual ---> 描述外观 (对应的数据是可视的)
      • geometry 设置连杆的形状
        • 标签 1: box (盒状)
          • 属性:size = 长 (x) 宽 (y) 高 (z)=abc
        • 标签 2: cylinder (圆柱)
          • 属性:radius = 半径, length = 高度
        • 标签 3: sphere (球体)
          • 属性:radius = 半径
        • 标签 4: mesh (为连杆添加皮肤)
          • 属性: filename = 资源路径 (格式:package://// 文件)
      • origin 设置偏移量与倾斜弧度
        • 属性 1: xyz=x 偏移 y 偏移 z 偏移
        • 属性 2: rpy=x 翻滚 y 俯仰 z 偏航 (单位是弧度)
      • metrial 设置材料属性 (颜色)
        • 属性: name
        • 标签: color
          • 属性: rgba = 红绿蓝权重值与透明度 (每个权重值以及透明度取值 [0,1])
    • collision ---> 连杆的碰撞属性
    • Inertial ---> 连杆的惯性矩阵

# joint

  • joint:urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件 (分别称之为 parent link 与 child link) 以 "关节" 的形式相连接,不同的关节有不同的运动形式:旋转、滑动、固定、旋转速度、旋转角度限制...., 比如:安装在底座上的轮子可以 360 度旋转,而摄像头则可能是完全固定在底座上。joint 标签对应的数据在模型中是不可见的

  • name ---> 为关节命名

    <joint name="1_joint">
    </joint>

    type ---> 关节运动形式

    • continuous: 旋转关节,可以绕单轴无限旋转
    • revolute: 旋转关节,类似于 continues, 但是有旋转角度限制
    • prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
    • planer: 平面关节,允许在平面正交方向上平移或旋转
    • floating: 浮动关节,允许进行平移、旋转运动
    • fixed: 固定关节,不允许运动的特殊关节
  • 子标签

    • parent (必需)

      parent link 的名字是一个强制的属性:

      • link: 父级连杆的名字,是这个 link 在机器人结构树中的名字。
    • child (必需)

      child link 的名字是一个强制的属性:

      • link: 子级连杆的名字,是这个 link 在机器人结构树中的名字。
    • origin

      • 属性: xyz = 各轴线上的偏移量 rpy = 各轴线上的偏移弧度。
    • axis

      • 属性: xyz 用于设置围绕哪个关节轴运动。

# URDF 与 Rviz 初步配置

  • 安装功能包

    catkin_create_pkg urdf01_rviz urdf xacro

  • 在当前功能包新建目录

    wode

  • 在 urdf 子文件新建 01.urdf 文档并输入

    <robot name="mycar">
        <link name="base_link">
            <visual>
                <geometry>
                    <box size="0.5 0.2 0.1" />
                </geometry>
            </visual>
        </link>
    </robot>
  • 在 launch 目录下新建 01.launch 文档并输入

    <launch>
        <!-- 设置参数 -->
        <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
        <!-- 启动 rviz -->
        <node pkg="rviz" type="rviz" name="rviz" />
    </launch>
    <!-- 包名:urdf01_rviz -->
    <!-- urdf01_HelloWorld:01 , 根据 1 自己的文档名 -->
  • 运行 Rviz 后 add——robotmodel,axes

  • 将当前配置保存到 config 目录下,命名为 show_mycar.rviz,之后更改 launch 文档的内容

    <launch>
        <param name="robot_description" textfile="$(find 包名)/urdf/urdf/01.urdf" />
        <node pkg="rviz" type="rviz" name="rviz" args="-d $(find 包名)/config/rviz/show_mycar.rviz" />
    </launch>
  • 启动

    source ./devel/setup.bash

    roslaunch urdf01_rviz 01.launch

# xacro

在 urdf/xacro 目录下进行

  • 编写 Xacro 文件,以变量的方式封装属性 (常量半径、高度、车轮半径...),以函数的方式封装重复实现 (车轮的添加)

  • 命令行进入 xacro 文件 所属目录,执行: rosrun xacro xacro xxx.xacro > xxx.urdf , 会将 xacro 文件解析为 urdf 文件

    rosrun xacro xacro 03_car_base.urdf.xacro > 03_car_base.urdf

  • 检查代码是否正确

    check_urdf 文件名.urdf

  • 小车实现 (仅实现)

    wode

  • 添加雷达和摄像头

    wode

# URDF 与 Gazebo 学习

wode

  • 创建功能包,添加依赖

    urdf xacro gazebo_ros gazebo_ros_control gazebo_plugins

  • 建立相关目录,如 rviz

  • 在 urdf 子文件新建 11.urdf 文档并输入

    <!-- 
        创建一个机器人模型 (盒状即可,box),显示在 Gazebo 中 
    -->
    <robot name="mycar">
        <link name="base_link">
            <!-- 可视化部分 -->
            <visual>
                <!-- 几何标签 -->
                <geometry>
                    <box size="0.5 0.2 0.1" />
                </geometry>
                <!-- 使用默认值 -->
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
                <!-- 颜色标签,子标签 color 中第四个为透明度,在 gazebo 中不再生效 -->
                <material name="yellow">
                    <color rgba="0.5 0.3 0.0 1" />
                </material>
            </visual>
            <!-- 设置碰撞参数,如果是标准几何体,代码同上 -->
            <collision>
                <geometry>
                    <box size="0.5 0.2 0.1" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            </collision>
            <!-- 设置惯性矩阵 -->
            <inertial>
                <origin xyz="0 0 0" />  <!-- 重心的偏移 -->
                <mass value="6" />   <!-- 质量 -->
                <inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1" />  <!-- 不同空间维度的惯性参数 -->
            </inertial>
        </link>
        <!-- gazebo 自己的颜色设置,大写 -->
        <gazebo reference="base_link">  <!-- 应用与哪部分连杆 -->
            <material>Gazebo/Black</material>
        </gazebo>
    </robot>
  • 在 launch 目录下新建 11.launch 文档并输入

    <launch>
        <!-- 将 Urdf 文件的内容加载到参数服务器 -->
        <param name="robot_description" textfile="$(find urdf11_gazebo)/urdf/11.urdf" />
        <!-- 启动 gazebo,不做任何修改 -->
        <include file="$(find gazebo_ros)/launch/empty_world.launch" />
        <!-- 在 gazebo 中显示机器人模型,下面命令行的固定 -->
        <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
    </launch>
  • 运行命令

    rosrun gazebo_ros spawn_model -urdf -model car -param robot_description

    roslaunch urdf11_gazebo 11.launch

# 构造机器人模型 (仅在电脑上实现运行)

wode

launch 文件夹内容

wode

urdf 文件夹内容

wide

# 机器人运动控制

# Arbotix

Arbotix 是一款控制电机、舵机的控制板,并提供相应的 ros 功能包,这个功能包的功能不仅可以驱动真实的 Arbotix 控制板,它还提供一个差速控制器,通过接受速度控制指令更新机器人的 joint 状态,从而帮助我们实现机器人在 rviz 中的运动。这个差速控制器在 arbotix_python 程序包中,完整的 arbotix 程序包还包括多种控制器,分别对应 dynamixel 电机、多关节机械臂以及不同形状的夹持器。

# 实现流程

  1. 安装 Arbotix noetic (rviz)

    git clone https://github.com/vanadiumlabs/arbotix_ros.git

  2. 创建新功能包,准备机器人 urdf、xacro 文件

  3. 添加 Arbotix 配置文件 control.yaml

  4. 编写 launch 文件配置 Arbotix

    <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
         <rosparam file="$(find my_urdf05_rviz)/config/hello.yaml" command="load" />
         <param name="sim" value="true" />
    </node>
  5. 启动 launch 文件并控制机器人模型运动

wode

# gazebo 下流程

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

    下 urdf 目录下新建 gazebo 目录,新建 move.xacro 文档,输入代码

  2. 将此文件集成进 xacro 文件

    在集合总代码中加入 move.xacro 的路径

  3. 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

安装 Generic keyboard teleop for twist robots.

sudo apt-get install ros-noetic-teleop-twist-keyboard

键盘控制

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3 _turn:=0.5 更改速度

wode

话题控制

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear

wode

# a1 激光雷达

  1. 下载功能包的方法:在你的终端中输入如下命令
    cd ~/catkin_ws/src //catkin_ws 为你的工作空间名称
    git clone https://github.com/Slamtec/rplidar_ros.git
    cd .. / // 返回上层空间
    catkin_make // 编译工作空间,或直接访问 github 下载 rplidar_ros 文件后放到 src 文件夹下

  2. usb 外接雷达

  3. ls -l /dev/ttyUSB* 查看雷达信息

  4. sudo chmod 666 /dev/ttyUSB0 赋予权限

  5. roslaunch rplidar_ros view_rplidar.launch 进入 rviz

# chmod:

若用 chmod 4755 filename 可使此程序具有 root 的权限

sudo chmod 600 ××× (只有所有者有读和写的权限)

sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)

sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)

sudo chmod 666 ××× (每个人都有读和写的权限)

sudo chmod 777 ××× (每个人都有读和写以及执行的权限)

安装 ros_arduino_bridge 功能包

访问 hbrobotics/ros_arduino_bridge: ROS + Arduino = Robot (github.com) 下载相关文件

编译

安装 tianbot 的 github 中的 lubot_slam 功能包

访问 tianbot/lubot_slam: 使用 Arduino 作为 BaseController 配合 ROS 机器人操作系统,构建具备 SLAM 能力的 luBot 自主导航机器人,也许还有点弱智能(机器视觉与深度学习)。 (github.com)

编译

安装

gamapping 功能包
navigation 功能包

cd ~/catkin_ws/src
git clone https://github.com/ros-planning/navigation.git
git clone https://github.com/ros-perception/openslam_gmapping.git
git clone https://github.com/ros-perception/slam_gmapping.git
git init
git checkout -b kinetic-devel

若克隆连接失败,将 https 改为 git

sudo apt-get install libbullet-dev
sudo apt-get install libsdl1.2-dev
sudo apt-get install libsdl-image1.2-dev
sudo apt-get install ros-kinetic-geometry2
sudo apt-get install ros-kinetic-nav-msgs

若报错:E:定位软件包失败

如 geometry2

在 github 中搜索找到 geometry2

复制对应网址 ros/geometry2: A set of ROS packages for keeping track of coordinate transforms. (github.com)

打开终端,进入要放置的位置,输入 git clone git://github.com/ros/geometry2.git

继续上述操作

编译 catkin_make

# NFS 详解

# ssh 通信

# 连接准备

  • ifconfig 查看 ip 地址,如 192.168.43.128
  • 用于连接的两台电脑处于同一局域网内,手机热点
  • 查看主机名,终端输入 hostname
  • 终端输入 sudo gedit /etc/hosts , 在文件中第三行输入本机 ip 地址和主机名,第四行输入待连机 ip 地址和主机名(忽略)
  • sudo /ect/init.d/networking restart , 若报错,在 /etc/init.d 中找到 network 文件,将之替换 networking。仍然报错,将 /etc/init.d 改为 service,还报错,hosts 中 ip 地址写错,检查

# 连接

  • 安装 chrony 包和 ssh 服务器

    sudo apt-get install chrony sudo apt-get install openssh-server

  • ping 待连机ip地址或主机名 ,建议 ip 地址

  • ssh 待连机用户名@待连机主机名或ip地址

  • 连接成功

# 删除冲突 IP

ssh-keygen -f "/home/wlp/.ssh/known_hosts" -R "joul"

查看系统是否已经安装 ssh 客户端或者服务端:dpkg -l | grep ssh。
启动 ssh 服务:sudo /etc/init.d/ssh start
关闭 ssh 服务:sudo /etc/init.d/ssh stop
重启 ssh 服务:sudo /etc/init.d/ssh restart

# 连接控制 mini 小车(18.04 密码:raspberry,使用 wheeltec 系列小车)

  • 打开终端,通过 ssh 连接到小车上的树莓派,192.168.0.100

    ssh -Y wheeltec@192.168.0.100

    密码:dongguan

    注:没有 - Y,图形化等功能无法使用

  • 远程登录后: roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch

  • 远程登录后: roslaunch wheeltec_robot_rc keyboard_teleop.launch

通过上述操作可以键盘控制小车移动

# 启动雷达

  • roslaunch rplidar_ros rplidar.launch

  • 查看雷达发布的话题

    rostopic list

  • 查看数据类型

    rosmsg show sensor_msgs/LaserScan

# 控制小车雷达建图

  • 终端 ssh 连接

  • 终端输入 roslaunch turn_on_wheeltec_robot mapping.launch

  • 新终端输入 rviz , 使用远程终端较卡,使用本机终端

    .bushrc 文件加入

    export ROS_MASTER_URI=http://192.168.0.100:11311
    export ROS_HOSTNAME=192.168.0.136

  • 控制小车走完全场,完成建图

  • 保存图形:

    一键保存: roslaunch turn_on_wheeltec_robot map_saver.launch

    打开地图路径: cd /home/wheeltec/wheeltec_robot/src/turn_on_wheeltec_robot/map

    保存地图: rosrun map_server map_saver -f 地图名

  • 查看图形:将远程文件挂载到本机 sudo mount -t nfs 192.168.0.100:/home/wheeltec/wheeltec_robot /mnt

    打开 mnt 文件查看,保存路径在保存图形时终端有显示

  • 建图
    mapping.launch
    小车初始化节点:turn_on_wheeltec_robot.launch
    雷达节点:rplidar.launch
    gmapping 建图节点:algorithm_gmapping.launch

# 建图算法切换

  1. 修改 mapping.launch 文件开头 <arg name="mapping_node" default="gmapping" doc="opt:gmapping,hector,cartographer,karto"/>

# 雷达跟随

roslaunch simple_follower laser_follower.launch

# SublimeText

  • 小车开机,连接 WIFI,密码:dongguan。

  • NFS 挂载 (passoni 密码:raspberry):

  • ssh 登录到服务端,并修改服务端系统时间为现在: sudo date -s "2021-7-7 00:00:00" 精确到分即可

    这一步是因为树莓派 / Nano/TX2/NX/ 工控机的系统时间在没有连接互联网 时,系统时间可能会混乱。同时我们程序修改是需要编译后才能生效的,而编译 规则是只编译最新时间的修改,同时修改时间在未来即大于当前系统时间的不编译。

    上一次修改时间 > 此次修改时间:不编译

    此次修改时间 > 当前系统时间:不编译

  • 指定编译编译单个功能包:

    catkin_make -DCATKIN_WHITELIST_PACKAGES="功能包名"

    解除指定功能包编译:

    catkin_make -DCATKIN_WHITELIST_PACKAGES=""

#

export ROS_MASTER_URI=http://192.168.0.100:11311
export ROS_HOSTNAME=192.168.0.136

# 自主导航

  • 运行导航节点

    roslaunch turn_on_wheeltec_robot navigation.launch

  • 启动 rviz

  • 查看里程计传感器(odom)

    rostopic echo /odom

# 摄像头

  1. 实现功能

    • 视觉巡线

    • 物体识别

    • 3D 建图

    • 颜色跟踪

  2. lsusb 查看摄像头

    wodde

    0502:rgb 摄像头

    0403:深度摄像头

  3. 开启摄像头

    rgb 摄像头: roslaunch usb_cam usb_cam-test.launch

    深度摄像头: roslaunch astra_camera astra.launch

    都打开: roslaunch astra_camera astrapro.launch

# 色块跟踪

  1. 根据要跟踪色块颜色,在 visualTracker.launch 更改,shv 格式

  2. 运行 roalaunch simple_follower visual_follower.launch

  3. 远程登陆查看话题 rostpic list

    rostopic echo /.......

# 视觉巡线

roslaunch simple_follower line_follower.launch

# 3D 建图导航

  1. 安装 rtabmap

    sudo apt-get update (更新软件列表)
    sudo apt-get install ros-noetic-rtabmap-ros (安装 rtabmap)

  2. 跑官方测试包(可选,远程端)

    roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=true rtabmapviz:=false (官方测试例程)

    rosbag play --clock demo_mapping.bag (官方测试包,在 /home/wheeltec/ 的路径下执行)

  3. 建图
    roslaunch turn_on_wheeltec_robot 3d_mapping.launch (启动 3d 建图)
    roslaunch wheeltec_robot_rc keyboard_teleop.launch (启动键盘控制节点)

  4. 导航
    roslaunch turn_on_wheeltec_robot 3d_navigation.launch (启动 3d 导航)

# 纯视觉见图导航

建图:

roslaunch turn_on_wheeltec_robot pure3d_mapping.launch

导航:

roslaunch turn_on_wheeltec_robot pure3d_navigation.launch

# KCF 跟踪

roslaunch kcf_tracker.launch

# 自主建图

roslaunch turn_on_wheeltec_robot rrt_slam.launch

# TF 坐标

# ros 坐标管理系统

# TF 坐标的基本概念

  • TF 树:rqt 可视化工具插件,查看所有 tf 坐标之间的链接关系

    安装 rqt:

    • sudo apt-get install ros-%YOUR_ROS_DISTRO%-rqt ros-%YOUR_ROS_DISTRO%-rqt-common-plugins
    • sudo apt-get install ros-%YOUR_ROS_DISTRO%-rqt-robot-plugins
    • sudo apt-get install ros-%YOUR_ROS_DISTRO%-rqt-pr2-dashboard (only when you need PR2 dashboard feature)
    • sudo apt-get update
    • sudo apt-get dist-upgrade
  • TF 的 brosdcsster:两个坐标的索引关系

  • TF 的 frame_id

  • TF 的基坐标:如 map

  • TF 的消息数据类型

# AR 标签识别

roslaunch turn_on_wheeltec_robot ar_label.launch

生成 ar 标签

  • 相应功能包下 rosrun ar_track_alvar createMarker -s 5 0
更新于 阅读次数