准备工作:具备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.

  1. 用来表述你的机器人有哪些零部件,以及你的机器人是由哪些连接的。比如:转动的关节;
  2. 可描述机器人外观,如有一些三维立体的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>

拓展知识:

  1. 我们可以通过点击view->collisions来看它的碰撞体积。

  2. 转动惯量列表
    参考: 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中看到的是在地平线以上的,是因为有碰撞体积,如果点击暂停的话,就会发现盒子的中心是与地平线持平的。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐