学习笔记1.1.1——vrx仿真环境的使用

2 篇文章 0 订阅
2 篇文章 0 订阅

学习笔记1.1.1——vrx仿真环境的使用

转载网站:https://github.com/osrf/vrx/wiki/tutorials

2021秋

准备过程(source环境)

source /opt/ros/melodic/setup.bash
cd vrx_ws/
source ./devel/setup.bash

打开基本仿真环境界面

roslaunch vrx_gazebo sandisland.launch

鼠标滚轮缩放;摁住滚轮调整角度。


2021春

一、示例环境

通过SDF配置文件来更改相关参数。
基本参数文件存储位置:
在这里插入图片描述

1.基本参数

1.1 改变风的参数

关于风的参数写在vrx_gazebo / worlds / xacros / usv_wind_plugin.xacro中;与风有关的模型以其与风参数之间的关系写在vrx_gazebo / worlds / sandisland.world.xacro中。
(1)修改步骤:
在vrx_gazebo / worlds / xacros / usv_wind_plugin.xacro中更改默认参数;
调用vrx_gazebo / worlds / sandisland.world.xacro文件中的宏时,覆盖默认参数;
在vrx_gazebo / worlds / sandisland.world.xacro中更改受风影响的模型或其系数;
在修改完之后进行编译。
(2)vrx_gazebo / worlds / xacros / usv_wind_plugin.xacro文件

<?xml version="1.0"?> 版本号;
xmlns:xacro="http://ros.org/wiki/xacro"  为xacro使用声明;

关于=和:= (网上有的说)=是相等,:=是赋值;
定义了一个宏,名称为usv_wind_gazebo,参数如下,根据以下参数生成一个标签块;其中有**的表示可以插入任意多个元素,*表示可以插入一个元素,啥也没有的为一简单的文本参数。

               params="**wind_objs
                         direction:=270
                         mean_vel:=0
                         var_gain:=0
                         var_time:=1
                         seed:=''
                         ros_update_rate:=10
                         topic_wind_speed:=/vrx/debug/wind/speed
                         topic_wind_direction:=/vrx/debug/wind/direction
                         " >

该语句表示引用代码块,将wind_objs代码块直接放到该位置。

  <xacro:insert_block name="wind_objs"/>

(3)vrx_gazebo / worlds / sandisland.world.xacro文件调用usv_wind_plugin.xacro

    <xacro:include filename="$(find vrx_gazebo)/worlds/xacros/usv_wind_plugin.xacro"/>
    <xacro:usv_wind_gazebo>
      <wind_objs>
        <wind_obj>
          <name>wamv</name>
          <link_name>base_link</link_name>
          <coeff_vector>0.5 0.5 0.33</coeff_vector>
        </wind_obj>
      </wind_objs>
    </xacro:usv_wind_gazebo>

用<xacro:include filename=“路径”/> <xacro:usv_wind_gazebo />调用宏,中间<wind_objs>为宏的参数。
(4)发布瞬时风速
使用插件发布风速

rqt_plot / vrx / debug / wind / speed / data
1.2波场(wave feild)

波浪宏定义在wave_gazebo/world_models/ocean_waves/model.xacro文件中。

1.3雾和环境照明

雾和其他照明条件没有直接写在文件中,如果需要要自己根据标准格式写该部分的标签块,写到vrx_gazebo/worlds/sandisland.xacro文件中。

2.参数调节

2.1更改全局默认参数

直接修改宏定义文件中的默认参数。

2.2更改本地参数

在调用宏的时候显式设置参数,如下在调用的时候设置gain参数。

<xacro:ocean_waves gain="0.0"/>

二、模拟接口

1.驾驶

1.1操作模拟船

(1)命令行直接发布
将速度指令发布给左右推进器。

rostopic pub /wamv/rusters/left_thrust_cmd std_msgs/Float32 "data: 0.5"
rostopic pub /wamv/rusters/right_thrust_cmd std_msgs/Float32 "data: 0.5"

(2)启动键盘控制文件

//启动仿真环境
roslaunch vrx_gazebo sandisland.launch
//启动键盘控制文件
roslaunch vrx_gazebo usv_keydrive.launch
1.2键盘遥控操作详细信息

(1)ROS图
在这里插入图片描述
(2)速度配置twist2thrust节点
将得到的Twist信息转换为两个推进器的速度信息。

right_thrust_cmd = Twist.linear.x + Twist.angular.z
left_thrust_cmd  = Twist.linear.x - Twist.angular.z

(3)推进器方向key2thrust_angle节点
通过“h” “;”同步调节两个推进器方向。

1.3推进器铰接

推进器铰接就是改变推进器的角度,使推进器不总是朝向船体的后方。
(1)宏定义
关于推进器角度调节的宏定义在wamv_gazebo/urdf/thruster_layouts/wamv_gazebo_thruster_config.xacro文件中。
其中三个有关角度的重要参数:

<enableAngle> 值为true时可以对推进器角度进行调节;
<angleTopic> 规定了 推进器角度调节控制器 将要订阅的角度信息话题;
<maxAngle> 角度调节的最大范围。

(2)角度调节
通过rqt插件向推进器角度话题发布角度信息。

rosrun rqt_publisher rqt_publisher

在这里插入图片描述
在顶上选择所需要的节点和发布频率,点击加号添加节点,在expression设置消息内容,勾选开始发布。

此外,用打开键盘控制程序,摁‘'h‘ ’;’ 可对推进器方向进行同步调节(h顺时针,;逆时针)。

1.4推进配置

在启动文件时添加thrust_config参数可进行推进配置,可选择参数有H,T,X.(配置内容

roslaunch vrx_gazebo sandisland.launch thrust_config:=T

2.声响

2.1

三、定制WAM-V和环境

1.在世界中添加障碍等元素

1.1创建自定义世界文件

新建一个功能包,并将示例文件复制到此功能包中

$  mkdir example_vrx_package
$  cd example_vrx_package
$  roscp vrx_gazebo example_course.world.xacro .

example_course.world.xacro文件中有以下内容

<?xml version="1.0" ?>
<!-- World containing sandisland model and some course challenges -->
<sdf version="1.6" xmlns:xacro="http://ros.org/wiki/xacro">
  <world name="robotx_example_course">
    <xacro:include filename="$(find vrx_gazebo)/worlds/sandisland.xacro" />
    <xacro:sandisland />

    <include>
      <uri>model://robotx_navigation_challenge</uri>
      <pose>15 0 2 0 0 0</pose>
    </include>
    <include>
      <uri>model://robotx_light_buoy</uri>
      <pose>60 0 0.25 0 0 0</pose>
    </include>
    <include>
      <uri>model://robotx_2016_qualifying_pinger_transit</uri>
      <pose>55 -50 0 0 0 -1.3</pose>
    </include>

    <!-- The 2016 dock with the three placards -->
    <include>
      <uri>model://dock_2016</uri>
      <pose>80 -8.75 0 0 0 0</pose>
    </include>

    <!-- The 2018 dock with the two placards -->
    <include>
      <uri>model://dock_2018</uri>
      <pose>120 -2.75 0 0 0 0</pose>
    </include>

  </world>
</sdf>

可在终端用cat example_course.world.xacro来查看文件内容,
可通过在example_course.world.xacro文件中添加新的<include/>标签来添加需要避开的障碍等模型,
例如添加大号障碍物,其中<uri/>为模型标签,可在model://后添加自带的模型名称来设值,<pose/>为位置标签,六个值分别为x,y,z,roll,pitch.yaw.

    <include>
      <uri>model://polyform_a7</uri>
      <pose>-15 8 0 0 0 0</pose>
    </include>

vrx环境自带的模型可在此处查看。

1.2运行创建的世界文件

在example_vrx_package文件夹中打开终端输入以下命令从xacro文件生成已编译的xml文件

rosrun xacro xacro --inorder example_course.world.xacro > my_world.world

再输入以下命令运行自定义的世界文件

roslaunch vrx_gazebo sandisland.launch world:=`pwd`/my_world.world

注意pwd两边不是单引号,是esc下边那个摁键打出来的英文符号。

2.创建自定义WAM-V推进器和传感器

2.1创建和使用自定义urdf文件步骤

首先创建一个文件夹,创建并写好推进器和传感器的yaml配置文件(后面给出示例),然后利用vrx提供的脚本启动文件直接从两个yaml配置文件生成WAM-V的urdf文件,该过程首先从两个yaml文件分别生成传感器和推进器的同名xacro文件,然后通过两个xacro文件生成WAM-V的urdf文件,该脚本还会检测输入的两个yaml文件是否符合compliance.py文件标准,该文件是一个vrx比赛所用船的推进器和传感器标准文件,对于自己定义的船不需要完全按照该标准定义,可以作为参考,但要保证船只物理可实现,要如果未通过标准检测会出现红色的报错信息,但在gazebo中依旧可用。

$ mkdir ~/my_wamv
$ gedit ~/my_wamv/thruster_config.yaml
$ gedit ~/my_wamv/sensor_config.yaml

写好配置文件之后,用下面的命令利用generate_wamv.launch启动脚本生成WAM-V的urdf文件,其中$HOME表示/home/<username>.

$ roslaunch vrx_gazebo generate_wamv.launch thruster_yaml:=$HOME/my_wamv/thruster_config.yaml  sensor_yaml:=$HOME/my_wamv/sensor_config.yaml wamv_target:=$HOME/my_wamv/my_wamv.urdf

参数说明

thruster_yaml			推进器yaml配置文件的完整路径
sensor_yaml  			传感器yaml配置文件的完整路径
wamv_target  			生成WAM-V的urdf文件所在位置的完整路径

编译成功(无论是否通过检测)会输出:

[INFO] [1566845959.198003]:
Using /home/jyh/my_wamv/thruster_config.yaml as the thruster configuration yaml file

[INFO] [1566845959.208003]: 
Using /home/jyh/my_wamv/sensor_config.yaml as the sensor configuration yaml file

xacro: in-order processing became default in ROS Melodic. You can drop the option.(该句不一定会输出,没输出也不要紧)

WAM-V urdf file sucessfully generated. File location: /home/tylerlum/my_wamv/my_wamv.urdf
================================================================================
REQUIRED process [wamv_config/wamv_generator-2] has died!
process has finished cleanly
log file: /home/jyh/.ros/log/58174356-65c7-11eb-9f1c-181deaf58039/wamv_config-wamv_generator-2*.log
Initiating shutdown!
================================================================================

通过以下配置urdf参数来调用自定义的WAM-V的urdf文件,参数值为所生成的urdf文件的完整路径,若没有给定urdf参数会使用启动文件中的默认配置。

roslaunch vrx_gazebo sandisland.launch urdf:=$HOME/my_wamv/my_wamv_2.urdf
2.2自定义可配置内容及配置文件格式

推进器可配置的内容
传感器可配置的内容
打开任意 可配置内容 文件夹中的xacro文件,查看其中宏定义的参数,例如打开engine.xacro,可以看到其宏定义中参数如下;
可以看出prefix为无默认值的必须参数,position、orientation为有默认值的可选参数。

<xacro:macro name="engine" params="prefix position:='0 0 0' orientation:='0 0 0'">

yaml文件格式:yaml对大小写敏感;使用缩进来表达层次逻辑,yaml的缩进不能用tab,只能用空格,只需保证同层次的代码左对齐即可;用#来表示注释。
yaml数据结构:类比Python,以键值对为基础,如position: "-2.373776 1.027135 0.318237"为一键值对;同层次的键值对构成一个字典,前边有-的同层级内容视为一个整体构成一个字典,多个前边有-的同层级内容整体构成一个列表,以此为基础存储参数信息。
yaml配置文件的一般格式如下,以传感器的配置文件为例,文件相当于一个字典,最外层字典的键名和配置内容文件夹中xacro文件同名,该键的值为一个字典,字典中存储的键名为参数名,值为参数值。

wamv_camera:
    - name: front_left_camera
      x: 0.75
      y: 0.1
      P: ${radians(15)}
    - name: front_right_camera
      x: 0.75
      y: -0.1
      P: ${radians(15)}
    - name: middle_right_camera
      x: 0.75
      y: 0.3
      P: ${radians(15)}
wamv_gps:
    - name: gps_wamv
      x: -0.85
wamv_imu:
    - name: imu_wamv
      y: -0.2
wamv_p3d:
    - name: p3d_wamv
lidar:
    - name: lidar_wamv
      type: 16_beam
      P: ${radians(8)}
2.3创建和使用自定义urdf文件的其他方法(并未成功,有些位置添加标签可以但有些位置不行)

类似自定义世界环境的方法,创建一个文件夹,并把原本的基本xacro文件赋值过来。

$ mkdir example_vrx_package
$ cd example_vrx_package/
$ roscp wamv_gazebo wamv_gazebo.urdf.xacro my_wamv.urdf.xacro

然后在复制过来的xacro文件中调用xacro宏来添加新的传感器,例如添加摄像头(不用包含所需的xacro宏描述文件吗?)

  <xacro:property name="stereo_x" value="1.0" />
  <xacro:wamv_camera name="stereo_left" x="${stereo_x}" y="0.3" z="1.5" P="${radians(15)}" />
  <xacro:wamv_camera name="stereo_right" x="${stereo_x}" y="-0.3" z="1.5" P="${radians(15)}" />

然后在包含该文件的文件夹下进行编译,并用urdf参数赋值运行

$ rosrun xacro xacro --inorder my_wamv.urdf.xacro > my_wamv.urdf
$ roslaunch vrx_gazebo sandisland.launch urdf:=`pwd`/my_wamv.urdf

3.使用Rviz进行可视化

该过程依靠robot_state_publisher程序,该程序将urdf中固定的joint信息发布到//JointStates中的非固定的joint信息一起发布给TF树,从而使rviz显示这些信息之间的关系。
应用步骤:
(1)启用前置摄像头、gps和imu启动仿真

roslaunch vrx_gazebo vrx.launch camera_enabled:=true gps_enabled:=true imu_enabled:=true

(2)启动robot_state_publisher程序

使用默认的urdf,使用此命令运行
$ roslaunch wamv_gazebo localization_example.launch
使用自定义的urdf,使用此命令运行
$ rosrun robot_state_publisher robot_state_publisher

自定义的urdf中没有标准的imu和gps信息,所以第二中方法单独启动robot_state_publisher程序;第一种方法还启动了一个本地节点,会将imu和gps的信息融合成船的全局位置信息并发布给odom frame.
(3)启动rviz

roslaunch wamv_gazebo rviz_vrx.launch

如果是示例程序,使用上边第一种方法启动robot_state_publisher,则参考坐标系选择odom,如果是第二种单独启动robot_state_publisher,则 参考坐标系选择base_link

4.创建自定义码头

创建一个名为my_dock_base的自定义码头:
(1)首先在vrx的/gazebo/models文件夹下创建my_dock_base文件夹,用来保存模型信息,进入该文件夹(-p表示如果没有路径中的文件夹也一并创建,可同时创建多个不同层次的文件夹)

$ mkdir -p ~/vrx_ws/src/vrx/vrx_gazebo/models/my_dock_base
$ cd ~/vrx_ws/src/vrx/vrx_gazebo/models/my_dock_base

(2)在my_dock_base文件夹中创建model.config文件,并将以下内容复制进去

创建文件
gedit model.config

内容如下,其中model标签下的name标签为所创建的自定义模型的名字

    <?xml version="1.0"?>
    <model>
      <name>my_dock_base</name>
      <version>1.0</version>
      <sdf version="1.6">model.sdf</sdf>

      <author>
        <name>Carlos Agüero</name>
        <email>caguero@openrobotics.org</email>
      </author>

      <description>
        My custom dock base.
      </description>
    </model>

(3)在my_dock_base文件夹中创建model.sdf.erb文件,并将以下内容复制进去

创建文件
gedit model.sdf.erb

内容如下,修改模型只需要修改layout中的内容,包括在一堆单引号中的为一行,每一行用逗号隔开,一个X代表一个4x4的码头块,一个空格代表一个4x4的空白块

    <?xml version="1.0" ?>
    <sdf version="1.6">

      <!-- Important: This file is generated. DO NOT EDIT! -->

      <model name="robotx_dock_2016_base">
    <%
    layout = [
    'X  X',
    'X  X',
    'X  X',
    'XXXXXXX',
    'XXXX',
    'XXXXXXX',
    'X  X',
    'X  X',
    'X  X',
    ]
    %>
    <%= ERB.new(File.read('dock_generator.erb'),
                      nil, '-', 'dock').result(binding) %>
      </model>
    </sdf>

效果如下
在这里插入图片描述
(4)在vrx_gazebo的CMakeList.txt中添加编译信息
set(dock_base_erb_files )(若文件未被修改过则位于第233行)中添加models/my_dock_base/model.sdf.erb,其中my_dock_base为新建模型的名字。
(5)回到vrx_ws下编译工作空间

    $ cd ~/vrx_ws/
    $ catkin_make

(6)打开gazebo,通过insert添加自定义模型

roslaunch vrx_gazebo sandisland.launch

在左上方有insert选项,找到my_dock_base单击即可在世界中添加。
(7)报错
报错信息

[gazebo-2] process has died [pid 21545, exit code 255, cmd /opt/ros/melodic/lib/gazebo_ros/gzserver -e ode /home/jyh/vrx_ws/devel/share/vrx_gazebo/worlds/example_course.world __name:=gazebo __log:=/home/jyh/.ros/log/95d77786-66b9-11eb-a0d3-181deaf58039/gazebo-2.log].

解决方法

$ killall gzserver

5.航路点waypoint可视化

5.1修改参数

修改vrx_gazebo/worlds文件夹中的stationkeeping_task.world.xacrowayfinding_task.world.xacro文件中的<markers/>即可,若不需要marker只需删除该标签即可。

<markers>
   <material>Gazebo/Green</material>
   <scaling>0.2 0.2 2.0</scaling>
   <height>0.5</height>
</markers>

参数含义

<material />-指定用于标记的凉亭材料。(默认值:凉亭/红色)
<scaling />-指定标记的缩放比例。(预设值:0.2 0.2 1.5)
<height /> -标记在水上的高度(默认值:0)
  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值