# 机器人仿真
课件
# 目标
- 能够使用 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 会默认被安装。
运行使用命令
rviz或rosrun rviz rvizsudo apt install ros-[ROS_DISTRO]-rviz
Gazebo:Gazebo 是一款 3D 动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo 提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。
以 “ros- [ROS_DISTRO] -desktop-full” 命令安装 ROS 时,gzebo 会默认被安装。
运行使用命令
gazebo或rosrun gazebo_ros gazebo
# URDF 语法
# robot
robot:urdf 中为了保证 xml 语法的完整性,使用了
robot标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称name: 指定机器人模型的名称
<robot name="mycar">......
......
</robot>
# link
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://
/ )/ 文件
- 属性: filename = 资源路径 (格式:package://
- 标签 1: box (盒状)
- origin 设置偏移量与倾斜弧度
- 属性 1: xyz=x 偏移 y 偏移 z 偏移
- 属性 2: rpy=x 翻滚 y 俯仰 z 偏航 (单位是弧度)
- metrial 设置材料属性 (颜色)
- 属性: name
- 标签: color
- 属性: rgba = 红绿蓝权重值与透明度 (每个权重值以及透明度取值 [0,1])
- geometry 设置连杆的形状
- collision ---> 连杆的碰撞属性
- Inertial ---> 连杆的惯性矩阵
- visual ---> 描述外观 (对应的数据是可视的)
# 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.bashroslaunch 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 学习

创建功能包,添加依赖
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_descriptionroslaunch urdf11_gazebo 11.launch
# 构造机器人模型 (仅在电脑上实现运行)

launch 文件夹内容

urdf 文件夹内容

# 机器人运动控制
# Arbotix
Arbotix 是一款控制电机、舵机的控制板,并提供相应的 ros 功能包,这个功能包的功能不仅可以驱动真实的 Arbotix 控制板,它还提供一个差速控制器,通过接受速度控制指令更新机器人的 joint 状态,从而帮助我们实现机器人在 rviz 中的运动。这个差速控制器在 arbotix_python 程序包中,完整的 arbotix 程序包还包括多种控制器,分别对应 dynamixel 电机、多关节机械臂以及不同形状的夹持器。
# 实现流程
安装 Arbotix noetic (rviz)
git clone https://github.com/vanadiumlabs/arbotix_ros.git创建新功能包,准备机器人 urdf、xacro 文件
添加 Arbotix 配置文件 control.yaml
编写 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>启动 launch 文件并控制机器人模型运动

# gazebo 下流程
已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器
下 urdf 目录下新建 gazebo 目录,新建 move.xacro 文档,输入代码
将此文件集成进 xacro 文件
在集合总代码中加入 move.xacro 的路径
启动 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 更改速度

话题控制
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear

# a1 激光雷达
下载功能包的方法:在你的终端中输入如下命令
cd ~/catkin_ws/src//catkin_ws 为你的工作空间名称git clone https://github.com/Slamtec/rplidar_ros.gitcd ../ // 返回上层空间catkin_make// 编译工作空间,或直接访问 github 下载 rplidar_ros 文件后放到 src 文件夹下usb 外接雷达
ls -l /dev/ttyUSB*查看雷达信息sudo chmod 666 /dev/ttyUSB0赋予权限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/srcgit clone https://github.com/ros-planning/navigation.gitgit clone https://github.com/ros-perception/openslam_gmapping.gitgit clone https://github.com/ros-perception/slam_gmapping.gitgit initgit checkout -b kinetic-devel
若克隆连接失败,将 https 改为 git
sudo apt-get install libbullet-devsudo apt-get install libsdl1.2-devsudo apt-get install libsdl-image1.2-devsudo apt-get install ros-kinetic-geometry2sudo 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 chronysudo apt-get install openssh-serverping 待连机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
# 建图算法切换
- 修改 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
# 摄像头
实现功能
视觉巡线
物体识别
3D 建图
颜色跟踪
lsusb查看摄像头![wodde]()
0502:rgb 摄像头
0403:深度摄像头
开启摄像头
rgb 摄像头:
roslaunch usb_cam usb_cam-test.launch深度摄像头:
roslaunch astra_camera astra.launch都打开:
roslaunch astra_camera astrapro.launch
# 色块跟踪
根据要跟踪色块颜色,在 visualTracker.launch 更改,shv 格式
运行
roalaunch simple_follower visual_follower.launch远程登陆查看话题
rostpic listrostopic echo /.......
# 视觉巡线
roslaunch simple_follower line_follower.launch
# 3D 建图导航
安装 rtabmap
sudo apt-get update(更新软件列表)sudo apt-get install ros-noetic-rtabmap-ros(安装 rtabmap)跑官方测试包(可选,远程端)
roslaunch rtabmap_ros demo_robot_mapping.launch rviz:=true rtabmapviz:=false(官方测试例程)rosbag play --clock demo_mapping.bag(官方测试包,在 /home/wheeltec/ 的路径下执行)建图
roslaunch turn_on_wheeltec_robot 3d_mapping.launch(启动 3d 建图)roslaunch wheeltec_robot_rc keyboard_teleop.launch(启动键盘控制节点)导航
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-pluginssudo apt-get install ros-%YOUR_ROS_DISTRO%-rqt-robot-pluginssudo apt-get install ros-%YOUR_ROS_DISTRO%-rqt-pr2-dashboard (only when you need PR2 dashboard feature)sudo apt-get updatesudo 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



