参考官方教程,笔者的开发环境为wsl2内安装的Ubuntu-20.04
机器人操纵器的正向运动学计算
在以下步骤中,我们将使用 Robotics Library 开发一个非常简单的运动学应用程序。
在您的主目录中为示例创建一个目录,并在此目录中,创建两个文件 myMdlDemo.cpp 和 CMakeLists.txt。
将以下内容添加到您的文件中。CMakeLists.txt
cmake_minimum_required(VERSION 2.8.11)
project(myMdlDemo)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(RL COMPONENTS MDL REQUIRED)
add_executable(myMdlDemo myMdlDemo.cpp)
target_link_libraries(myMdlDemo ${RL_LIBRARIES})
此文件控制构建过程,并将由 CMake 处理。RL 需要 C++11 标准和启用的数学常量。find_package 查找 RL 安装中包含的 CMake 配置文件。add_executable 将创建一个包含相应源文件的新程序。target_link_libraries 定义程序要链接到的库。
将以下内容添加到myMdlDemo.cpp。
#include <iostream>
#include <rl/math/Transform.h>
#include <rl/math/Unit.h>
#include <rl/mdl/Kinematic.h>
#include <rl/mdl/Model.h>
#include <rl/mdl/XmlFactory.h>
int main(int argc, char** argv)
{
rl::mdl::XmlFactory factory;
std::shared_ptr<rl::mdl::Model> model(factory.create("/usr/share/rl-0.7.0/examples/rlmdl/unimation-puma560.xml"));
rl::mdl::Kinematic* kinematics = dynamic_cast<rl::mdl::Kinematic*>(model.get());
rl::math::Vector q(6);
q << 10, 10, -20, 30, 50, -10;
q *= rl::math::DEG2RAD;
kinematics->setPosition(q);
kinematics->forwardPosition();
rl::math::Transform t = kinematics->getOperationalPosition(0);
rl::math::Vector3 position = t.translation();
rl::math::Vector3 orientation = t.rotation().eulerAngles(2, 1, 0).reverse();
std::cout << "Joint configuration in degrees: " << q.transpose() * rl::math::RAD2DEG << std::endl;
std::cout << "End-effector position: [m] " << position.transpose() << " orientation [deg] " << orientation.transpose() * rl::math::RAD2DEG << std::endl;
return 0;
}
接下来在根目录下创建build目录,开启终端并导航到build目录内执行
cmake ..
便会在build目录内生成makefile文件,接着输入
make
编译生成可执行文件myMdlDemo,在终端输入
./myMdlDemo
即可运行,效果如下
机器人机械手的可视化
在工程根目录下建立另一个目录myViewDemo,在该目录下建立 CMakeLists.txt 和 myViewDemo.cpp ,分别编写以下程序
cmake_minimum_required(VERSION 2.8.11)
project(myViewDemo)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt4 COMPONENTS QtCore QtGui QtOpenGL REQUIRED)
include(${QT_USE_FILE})
find_package(RL COMPONENTS SG REQUIRED)
add_executable(myViewDemo myViewDemo.cpp)
target_link_libraries(
myViewDemo
${QT_QTCORE_LIBRARY}
${QT_QTGUI_LIBRARY}
${QT_QTOPENGL_LIBRARY}
${RL_LIBRARIES}
/usr/lib/x86_64-linux-gnu/libSoQt.so
)
#include <iostream>
#include <QWidget>
#include <Inventor/SoDB.h>
#include <Inventor/Qt/SoQt.h>
#include <Inventor/Qt/viewers/SoQtExaminerViewer.h>
#include <rl/sg/so/Scene.h>
int
main(int argc, char** argv)
{
SoDB::init();
QWidget* widget = SoQt::init(argc, argv, argv[0]);
widget->resize(800, 600); //若出现内存报错,注释掉这段
rl::sg::so::Scene scene;
scene.load("/usr/share/rl-0.7.0/examples/rlsg/unimation-puma560_boxes.xml");
SoQtExaminerViewer viewer(widget, NULL, true, SoQtFullViewer::BUILD_POPUP);
viewer.setSceneGraph(scene.root);
viewer.setTransparencyType(SoGLRenderAction::SORTED_OBJECT_BLEND);
viewer.show();
SoQt::show(widget);
SoQt::mainLoop();
return 0;
}
运行效果如下
注意:该例程使用的是qt4,若cmake报错,请安装qt4或更改qt4为默认选择
配置VScode在wsl2下工作环境
现在已经成功编译运行了应用程序,但为了方便后续开发,还要配置一下vscode在wsl2下工作环境
开始之前在vscode本地安装wsl拓展
安装完成后连接wsl2下的Ubuntu
连接到wsl2后打开工程目录,作为工作空间
确保在wsl2下安装好c/c++拓展插件(注意不是本地)后按下Ctrl+Shift+P进行C/C++配置
修改C++标准为C++11,根据源码添加相关头文件路径
或者根据程序报错提示添加
若遇到实在不知道咋解决的问题就关掉错误波形也可,反正能编译就行
完成配置后的json文件:
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/qt4/QtGui",
"/usr/include/qt4",
"/usr/include/rl-0.7.0"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "c++11",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
可以看到配置完成后源代码头文件没有报错波浪线,而且可以从头文件转到定义
编译也正常,可以愉快地开发了