安装flightmare
官方仓库
按照flightmare官方的安装教程Install with ROS · uzh-rpg/flightmare Wiki进行安装,虽然如果要进行强化学习的话,flightmare官方推荐使用pip安装,但是为了避免跨度太大,这里还是使用ros安装。
安装前置ROS依赖
创建工作空间
1 | mkdir -p catkin_ws/src |
下载flightmare
1 | cd catkin_ws/src |
运行编译
1 | catkin build |
此处可能会遇到两个问题
- 下载pybind11与yaml-cpp:如果无法连接GitHub,可能无法自动下载。需要手动下载pybind11,与yaml-cpp然后需要对
1
2
3
4
5cd catkin_ws/src/flightmare/flightmare/flightlib/externals
// 删除过去的编译结果
rm -f ./*
git clone https://github.com/pybind/pybind11 pybind11-src
git clone https://github.com/jbeder/yaml-cpp yaml-srccmake文件进行修改,优先使用本地文件。src/flightmare/flightmare/cmake/pybind11.cmake1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39# Download and unpack pybind11 at configure time
message(STATUS "Getting Pybind11...")
# set(PYBIND11_PYTHON_VERSION 3.6)
set(PYBIND11_PYTHON_VERSION ${PYTHON_VERSION_STRING})
set(PYBIND11_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/externals/pybind11-src/include)
set(PYBIND11_SOURCE_DIR ${PROJECT_SOURCE_DIR}/externals/pybind11-src)
if(EXISTS ${PYBIND11_SOURCE_DIR}/CMakeLists.txt)
message(STATUS "Using vendored Pybind11 from ${PYBIND11_SOURCE_DIR}")
else()
configure_file(
cmake/pybind11_download.cmake
${PROJECT_SOURCE_DIR}/externals/pybind11-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/externals/pybind11-download
OUTPUT_QUIET)
if(result)
message(FATAL_ERROR "Cmake Step for Pybind11 failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/externals/pybind11-download
OUTPUT_QUIET)
if(result)
message(FATAL_ERROR "Build step for Pybind11 failed: ${result}")
endif()
message(STATUS "Pybind11 downloaded!")
endif()
add_subdirectory(${PROJECT_SOURCE_DIR}/externals/pybind11-src
EXCLUDE_FROM_ALL)
include_directories(SYSTEM "${PROJECT_SOURCE_DIR}/externals/pybind11-src/include")
src/flightmare/flightmare/cmake/yaml.cmake
1 | # Download and unpack eigen at configure time |
- C与C++风格混用:flightmare中
rotors_hil_interface中可能存在语法混用导致编译失败。需要对以下文件进行修改1
2
3src/rotors_simulator/rotors_hil_interface/include/rotors_hil_interface/hil_interface.h
src/rotors_simulator/rotors_hil_interface/src/hil_sensor_level_interface.cpp
src/rotors_simulator/rotors_hil_interface/src/hil_state_level_interface.cpp
hil_interface.h
- 删除:
#include <mavros_msgs/mavlink_convert.h>- 手工
typedef mavlink::mavlink_message_t mavlink_message_t - 条件式
#include <mavlink/v2.0/common/mavlink.h>
- 改为直接包含:
#include <mavros_msgs/Mavlink.h>#include <mavlink/v2.0/common/mavlink.h>
hil_sensor_level_interface.cpp
- 新增本地辅助函数:
ConvertToRosMavlink(const mavlink_message_t&, mavros_msgs::Mavlink&) - 将原先的:替换为:
1
2mavros_msgs::mavlink::convert(mmsg, *rmsg_hil_gps);
mavros_msgs::mavlink::convert(mmsg, *rmsg_hil_sensor);hil_state_level_interface.cpp1
2ConvertToRosMavlink(mmsg, *rmsg_hil_gps);
ConvertToRosMavlink(mmsg, *rmsg_hil_sensor); - 同样新增本地 ConvertToRosMavlink(…)
- 将:
mavros_msgs::mavlink::convert(mmsg, *rmsg_hil_state_qtrn);
替换为:
ConvertToRosMavlink(mmsg, *rmsg_hil_state_qtrn);
添加路径
教程中为直接修改bashrc文件,此处选择不修改shell文件,而是设置一个脚本文件,每次在终端中source即可。以.zsh脚本为示例
1 |
|
下载并安装unity二进制文件
安装结果
在flightmare的工作空间中,使用官方示例代码启动roslaunch flightros rotors_gazebo.launch
注意到启动了三个窗口,分别是控制面板、flightmare渲染窗口和gazebo动力学仿真。其中gazebo其实并不必要,只是在这个示例脚本中用gazebo作为动力学仿真,以体现flightmare中画面与动力学的分离。
后续使用
后续建议将整个flightmare文件夹内容(下载依赖、手动加入包、cmake以及库文件修改、加入材质包)打包以便后续使用。每次创建一个基于flightmare的工作空间,都将其解压缩到catkin_ws/src/flightmare路径下,然后在src下创建其他功能包时,依赖项除了常见的roscpp外,还需要加入flightlib。此外,在cmake文件中,需要单独加入一行find_package(OpenCV REQUIRED),然后在in1clude_directories中加入一行${OpenCV_INCLUDE_DIRS},在target_link_libraries中加入以下几行内容${OpenCV_LIBRARIES}、yaml-cpp、zmq、zmqpp、stdc++fs。
参考内容
Install with ROS · uzh-rpg/flightmare Wiki
【Flightmare最全教程】基于ROS的Flightmare仿真环境的搭建-CSDN博客