Ubuntu下Webots项目的迁移与RBDL动力学测试

目前我的机器人基于虚拟模型的控制框架已经逐渐完善,在典型复杂地形上的运动控制已经有了不错的效果,并且仿真与实物样机同步性也不错.

https://video.zhihu.com/video/1504472693869608960?player=%7B%22autoplay%22%3Afalse%2C%22shouldShowPageFullScreenButton%22%3Atrue%7D

由于采用的低成本ODroid-C4控制器没法满足之前仿真中MPC的运行需求,因此只能先尝试从头开始研究下机器人的动力学部分,并逐步实现WBC,实际上目前很多人也说到对于四足机器人全身动力学控制可能相比MPC更加重要,基于传统QP的足底力代替MPC后续仍然采用WBC来计算关节扭矩的方式仍然可以得到很好的控制效果。

通过不断尝试在Windows环境下最终还是没能正确地完成RBDL库编译,由于其需要类似Boost等库的依赖在Windows环境下安装和配置十分麻烦,通过多天的挣扎最终还是决定放弃Windows下的仿真环境转移到Ubuntu环境下,这样其库依赖安装非常方便,同时Webots也能与ROS进行联合仿真了,大大延长了我搭建好的仿真框架寿命,那最重要的第一步是将VS下的工程项目迁移到Ubuntu环境并采用QT作为IDE开发。

1 Ubuntu下的Webots安装

在ubuntu下安装Webots非常简单,我目前还是在虚拟机安装Webots其运行效率与在Windows下差距不大,首先去官网Webots: robot simulator下载对应的压缩文件,这里采用的还是2021a的版本因为后续版本对IMU的朝向等坐标系定义进行了修改,如果相同的项目可能还需要重新确认坐标系。

下载完毕后解压缩,通过控制台既可以直接运行,将程序其添加到桌面菜单则可以快速启动Webots:

2 QT下的Webots开发

在安装好Webots后可以先用之前的World测试是否可以打开,当然由于没有控制器机器人无法运动,后续我采用QT加Cmake的方式来构建Webots下的仿真项目,首先用Webots的向导新建项目目录与控制器:

之后将VS下的源码和头文件赋值到控制器目录中:

建立或复制一个Cmakelist文件将源码和头文件进行链接,同时参考官网Cmake的写法与Webots的库进行链接,这里需要注意的是我参考官网写法一直无法链上Webots的库,导致编译时很多仿真接口函数找不到,这里没办法只能直接设定了绝对路径so文件的地址:

cmake_minimum_required(VERSION 2.6)

SET(PROJECT_NAME my_controller12)
PROJECT(${PROJECT_NAME})
get_filename_component(PROJECT ${CMAKE_SOURCE_DIR} NAME)

find_package(Eigen3)

add_compile_definitions(__USE_SINGLE_PRECISION__)

INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR})
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3 -pthread" )
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../../build)

include_directories( 
     "./build"
     "./include_vmc"
     "./include_wb"
     "./vmc_inc"
     "./mpc"
     "./vision_location"
     "./mpc"
     "./common_utils"
     "./urdf"
     "./rbdl"
     "./model"
     "/home/pi/webots/webots/include/controller/c/"
     "/home/pi/webots/webots/include/controller/cpp/"
)

link_directories("/usr/local/lib")
include_directories("/usr/local/include")

LINK_LIBRARIES("/home/pi/webots/webots/lib/controller/libController.so")
LINK_LIBRARIES("/home/pi/webots/webots/lib/controller/libCppController.so")

AUX_SOURCE_DIRECTORY(gait_src DIR_SRCS)
AUX_SOURCE_DIRECTORY(locomotion_src DIR_SRCS1)
AUX_SOURCE_DIRECTORY(math_src DIR_SRCS2)
AUX_SOURCE_DIRECTORY(mpc DIR_SRCS3)
AUX_SOURCE_DIRECTORY(source DIR_SRCS4)
AUX_SOURCE_DIRECTORY(source_vmc DIR_SRCS5)
AUX_SOURCE_DIRECTORY(vision_location DIR_SRCS6)
AUX_SOURCE_DIRECTORY(rbdl DIR_SRCS7)
AUX_SOURCE_DIRECTORY(urdf DIR_SRCS8)
AUX_SOURCE_DIRECTORY(common_utils DIR_SRCS9)
AUX_SOURCE_DIRECTORY(model DIR_SRCS10)

ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS} ${DIR_SRCS1}  ${DIR_SRCS2} ${DIR_SRCS3}  ${DIR_SRCS4} ${DIR_SRCS5} ${DIR_SRCS6} ${DIR_SRCS7} ${DIR_SRCS8} ${DIR_SRCS9} ${DIR_SRCS10})

set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)

add_subdirectory(qpOASES lib/ EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} qpOASES)

add_subdirectory(yaml-cpp lib/ EXCLUDE_FROM_ALL)
target_link_libraries(${PROJECT_NAME} yaml-cpp)


link_directories($ENV{WEBOTS_HOME}/lib/controller)
link_directories($ENV{WEBOTS_HOME}/lib/webots)
file(GLOB C_SOURCES *.c)
file(GLOB CPP_SOURCES *.cpp)
set(SOURCES ${C_SOURCES} ${CPP_SOURCES})

if (NOT CPP_SOURCES STREQUAL "")  # Sources contain C++ files
  set (LIBRARIES ${CMAKE_SHARED_LIBRARY_PREFIX}Controller${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_SHARED_LIBRARY_PREFIX}CppController${CMAKE_SHARED_LIBRARY_SUFFIX})
  include_directories($ENV{WEBOTS_HOME}/include/controller/c $ENV{WEBOTS_HOME}/include/controller/cpp)
else()  # C
  set (LIBRARIES ${CMAKE_SHARED_LIBRARY_PREFIX}Controller${CMAKE_SHARED_LIBRARY_SUFFIX})
  include_directories($ENV{WEBOTS_HOME}/include/controller/c)
endif()

add_custom_command(TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E
  copy ${CMAKE_BINARY_DIR}/${PROJECT} ${CMAKE_SOURCE_DIR}
)

注:注意这里的项目工程名称应当与Webots建立的一样,这样后续仿真选择控制器才能找到

之后采用QT对项目进行编译,如不报错则应该就没有问题,为机器人选择编译好的控制器,运行测试确认与Windows下是否一致:

3 RBDL动力学库的编译

说实话网上动力学库相关的资料还是比较上,比较推荐的是Wenboxing提供的资料和说明,在此只是记录一下两个示例的安装过程,供大家参考。具体的可以看他的帖子,另外CSDN上也有比较好的教学资料:

这里补充下动力学库目前有很多可以尝试的选择但总体似乎RBDL比较轻量化,可惜的是相关的Demo都比较简单,如果要学习可能需要查看国外团队类似Atlas或cassie完整的机器人例子,MIT采用的动力学库实际是自己写的但与RBDL一样对使用者来说,目的还是得到浮动基座动力学模型。

通过将RBDL库相关源码添加到QT项目中,当然其中需要安装boost或Eigen的依赖,但在Linux系统下就方便很多了,另外Wenboxing的版本对接口进行了裁剪已经包含RBDL需要而外的插件,例如URDF等所以相比官方的源码会更轻量化和方便,当然其仍然使用的是RBDL的核心接口,因此同样可以运行RBDL附带的几个简单Demo。

这里需要注意的是如果你项目中具有MIT的源码,例如我移植了MIT的KF滤波器,其中已经对Vect型变量进行定义,这与RBDL中会冲突,我这简单重命名自己项目中的变量定义来解决:

最终编译成功后,修改URDF读取地址,则可以在Webots下正确运行正向动力学的例子,这样在Webots环境下后续就可以进一步开展对RBDL库的学习和使用:

4 我对动力学库和机器人运动控制的理解

动力学一直都是机器人运动控制中最难也是最核心的部分,要实现高性能的控制没有动力学辅助是无法实现的,特别是实物中腿部质量、摩擦等未建模的部分对机器人稳定控制精度会带来很大的影响,MIT的WBC就是通过引入动力学控制提高摆动跟踪精度和支撑时全身的力矩控制克服扰动,从而实现更快更稳定的目的,相比传统VMC控制方法其在高速奔跑,侧向控制上都有着更优异的效果。

另外强化学习技术已经逐步成熟,很多人都转去研究强化学习方法,对于传统控制来说强化学习确实会更加快速和简单,但我认为二者的工程模式实际是非常类似的,只不过传统控制由于我上学的时候做的不够深入而造成了无从下手。

对于强化学习来说工程上的方式是:

(1)在机械设计软件里设计结构,然后转出URDF文件;

(2)加载到Raisim等仿真环境;

(3)构建强化学习策略,设定奖励函数;

(4)并行强化训练优化;

(5)迁移训练;

(6)样机部署;

而传统控制我认为完整的流程同样是:

(1)在机械设计软件里设计结构,然后转出URDF文件;

(2)采用RBDL库得到浮动基座动力学;

(3)基于动力学模型进行轨迹优化;

(4)采用VMC或MPC完成单刚体控制;

(5)采用动力学模型和WBC算法完成控制;

(6)样机部署与参数调节;

综上,我上学的时候仅完成了传统控制(4)-(6)部因此大部分时候都采用无模型或单刚体控制的方法,而忽略了(1)-(3)动力学建模与轨迹优化部分,而MIT的开源代码让我们看到了完整的机器人控制工程应该如何构建,而与强化学习方式对比可以看到二者实际上是非常类似的,只不过强化学习动力学建模部分直接由现成的仿真环境代替了,而MPC和强化学习本质上都是基于目标和优化来设计控制器。