学习笔记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.xacro
和wayfinding_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)