【自动驾驶入门:从建模到跟随】1 环境搭建和建模准备
【自动驾驶入门:从建模到跟随】1 环境搭建和建模准备
准备工作:具备ROS基础知识(古月:ROS入门21讲)
自动驾驶入门:从建模到跟随
学习笔记
1 配置环境
Ubuntu16.04
VMWare
参考: http://wiki.ros.org/melodic/Installation/Ubuntu.
第一步:设置软件源
willing@willing-virtual-machine:~$sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
在中国上面这个软件源可能不够快,可以尝试下面几个:
willing@willing-virtual-machine:~$sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
willing@willing-virtual-machine:~$sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
willing@willing-virtual-machine:~$sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.bfsu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
willing@willing-virtual-machine:~$sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.sjtug.sjtu.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
第二步:设置密钥
willing@willing-virtual-machine:~$sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
第三步:更新
willing@willing-virtual-machine:~$sudo apt update
第四步:安装
willing@willing-virtual-machine:~$ sudo apt update
willing@willing-virtual-machine:~$sudo apt install ros-melodic-desktop-full
第五步:初始化rosdep
willing@willing-virtual-machine:~$ sudo rosdep init
willing@willing-virtual-machine:~$ rosdep update
第六步:环境建立
把bashrc写到setup.bash,之后就可以运行ros的相关指令了。
willing@willing-virtual-machine:~$echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
willing@willing-virtual-machine:~$source ~/.bashrc
第七步:安装相关的依赖包
willing@willing-virtual-machine:~$sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
完成。
2 Gazebo
2.1 Gazebo
第一步:在terminal输入
willing@willing-virtual-machine:~$ gazebo

2.2 使用roslaunch打开world模型
第一步,下载GitHub源码: https://github.com/ros-simulation/gazebo_ros_pkgs.
然后将文件夹放入~/catkin_ws/src中。
在终端运行:
cd catkin_ws
catkin_make
中途我遇到了一个报错:
c++: internal compiler error: Killed (program cc1plus) Please submit a full bug report, with preproc
通过查阅资料发现是我内存不够造成的,最后通过增加虚拟内存得到解决。
sudo dd if=/dev/zero of=swapfile bs=1073741824 count=16
sudo mkswap swapfile
sudo swapon swapfile
好,接下来就可以通过roslaunch来启动gazebo了,首先我们在终端输入:
roscore
roslaunch是一个启动ROS节点并插入机器人模型的标准方法.要建立一个空的world模型,我们只需要在另一个终端运行:
willing@willing-virtual-machine:~$roslaunch gazebo_ros empty_world.launch
得到同样效果。
3 在仿真世界中添加一个立方体
之后开始就要搭建小车模型以及将小车模型放入空白世界里面去。
3.1 学习 urdf
(Unified Robot Description Format,统一的机器人描述文件格式)
参考:https://github.com/czhherry/self-driving-vehicle-101/tree/master/04_intro_to_urdf.
- 用来表述你的机器人有哪些零部件,以及你的机器人是由哪些连接的。比如:转动的关节;
- 可描述机器人外观,如有一些三维立体的mash文件就是放在这个描述文件里面。
在这节我们使用URDF建造一个立方体模型,并把立方体模型放入世界里面。
第一步:建立catkin_workspace
第二步:在catkin_ws/src中创建一个package
catkin_create_pkg box
第三步:在catkin_ws/src/box中创建两个文件夹:launch和urdf
第四步:在launch文件夹中创建.launch文件,描述文件的解析文件,将urdf中的描述文件解析到gazebo
spawn_box_urdf.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<!--生成盒子-->
<include file="$(find box)/launch/spawn_xacro.launch">
<arg name="x" value="0.0"/>
<arg name="y" value="0.0"/>
<arg name="z" value="0.0"/>
<arg name="urdf_robot_file" value="$(find box)/urdf/box.urdf"/>
<arg name="robot_name" value="my_box"/>
</include>
</launch>
spawn_xacro.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<arg name="x" default="0.0"/>
<arg name="y" default="0.0"/>
<arg name="z" default="0.0"/>
<arg name="urdf_robot_file" default=""/>
<arg name="robot_name" default=""/>
<!-- <param name="robot_description" command="$(arg urdf_robot_file)"/> -->
<!--用xacro这个节点来解析传进来的路径以及取的节点名字是什么,xacro是另一种更方便的定义机器人的方式-->
<!--把文件放到robot_description里面了,然后用gazebo ros里面的spawn_model里面的文件读取以后,把它放到gazebo world里面,放的位置是根据传进来的x,y,z rpy来决定-->
<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='$(arg robot_name)'" />
<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -model $(arg robot_name) -param robot_description"/>
</launch>
第五步:在urdf文件中创建机器人的描述文件。
box.urdf
<?xml version="1.0" ?>
<!--机器人名字-->
<robot name="box">
<!--两个link-->
<!--base_link:定义底盘部件-->
<link name="base_link">
<!--定义零部件的碰撞体积-->
<collision>
<!--origin:定义机器人相对位置在哪里,原点这里设置为世界里面的(0,0,0),origin后面的是相对于原点而言的,而且没有任何旋转角度-->
<origin xyz="0 0 0" rpy="0 0 0"/>
<!--定义几何关系-->
<geometry>
<!--box这里是自带的原始类型,长宽高都为1米,碰撞体积为1*1*1-->
<box size="1 1 1"/>
</geometry>
</collision>
<!--定义零部件外观,如果有3Dmash的文件的话就要放到这里来-->
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="1 1 1"/> <!--外观和碰撞体积可以不一样-->
</geometry>
</visual>
</link>
<!--joint关节,两个link关联在一起,这里用到的fixed是不能动的,只有第一个定义的零部件是需要用joint来连接的,后面可以一起写-->
<joint name="inertial_joint" type="fixed">
<parent link="base_link"/>
<child link="main_mass"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
<!--定义质量和转动惯量的link-->
<link name="main_mass" type="fixed">
<parent link="inertial_joint"/>
<!--定义惯量-->
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1000"/> <!--100kg-->
<inertia
ixx="166.6666" ixy="0.000000" ixz="0.000000"
iyy="166.6666" iyz="0.000000"
izz="166.6666"/>
</inertial>
</link>
</robot>
拓展知识:
-
我们可以通过点击view->collisions来看它的碰撞体积。

-
转动惯量列表
参考: https://wenku.baidu.com/view/992a1973168884868762d63b.html.

可以算出转动惯量都为166。转动惯量也可以直接在gazebo里面看,view->inertias。
第六步:重新catkin_make
第七步:打开一个新的窗口,在catkin_ws中
roslaunch gazebo_ros empty_world.launch
第八步:打开一个新的窗口,在catkin_ws中
source devel/setup.bash
接下来就可以跑launch文件了。
首先我们需要跑一个盒子。
roslaunch box spawn_box_urdf.launch

我们就可以看到,这个世界里面多了个立方体。
3.2 学习 xacro
urdf缺点:
如果立方体很多或者需要统一改参数值的时候,使用urdf就很不方便,于是我们需要使用xacro。
box.xacro
<?xml version="1.0" ?>
<robot name="box" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="length" value="1"/>
<xacro:property name="width" value="1"/>
<xacro:property name="height" value="1"/>
<link name="base_link">
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<!--以变量的形式存在-->
<box size="${length} ${width} ${height}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="${length} ${width} ${height}"/>
</geometry>
</visual>
</link>
<joint name="inertial_joint" type="fixed">
<parent link="base_link"/>
<child link="main_mass"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
<link name="main_mass" type="fixed">
<parent link="inertial_joint"/>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1000"/>
<inertia
ixx="166.6666" ixy="0.000000" ixz="0.000000"
iyy="166.6666" iyz="0.000000"
izz="166.6666"/>
</inertial>
</link>
</robot>
在catkin_ws/src/box/launch中创建文件
spawn_box_xacro.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<include file="$(find box)/launch/spawn_xacro.launch">
<arg name="x" value="0.0"/>
<arg name="y" value="0.0"/>
<arg name="z" value="0.0"/>
<arg name="urdf_robot_file" value="$(find box)/urdf/box.xacro"/>
<arg name="robot_name" value="my_box"/>
</include>
</launch>
在catkin_ws中运行
roslaunch box spawn_box_xacro.launch
结果与上面相同。
注意:之所以在gazebo中看到的是在地平线以上的,是因为有碰撞体积,如果点击暂停的话,就会发现盒子的中心是与地平线持平的。
更多推荐
所有评论(0)