В предыдущей статье объяснялось, как скомпилировать каркас робота RobWork на основе исходного кода.Далее в этой статье будет рассказано, как использовать скомпилированный и установленный каркас робота RobWork.Здесь загружается файл сцены робота UR3 в формате XML (здесь вы можете думайте о файле сцены робота RobWork как о файле URDF в инфраструктуре робота ROS) в качестве примера, чтобы представить, как использовать инфраструктуру RobWork для разработки кода.
После того, как подготовка завершена, вы можете создать проект и написать простой файл hello_robwork.
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(hello_robwork LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(RobWork_DIR "/home/qiang/RobWork/RobWork/cmake")
find_package(RobWork)
include_directories(${ROBWORK_INCLUDE_DIRS})
add_executable(hello_robwork main.cpp)
target_link_libraries(hello_robwork ${ROBWORK_LIBRARIES})
main.cpp
#include <iostream>
#include <rw/loaders/WorkCellLoader.hpp>
#include <rw/models/WorkCell.hpp>
#include <rw/common/Ptr.hpp>
using namespace rw::common;
using namespace rw::loaders;
using namespace rw::models;
int main() {
WorkCell::Ptr workcell = WorkCellLoader::Factory::load("/home/qiang/UR3_2015/UR3.xml");
std::cout << workcell->getName() << "\n";
std::cout << workcell->getFilename() << "\n";
std::cout << workcell->getFilePath() << "\n";
return 0;
}
Результат:
/home/qiang/UR3_2015/UR3.xml
/home/qiang/UR3_2015/
Мы обнаружим, что вывод первой строки пуст, что является хорошим объяснением, потому что загруженный нами файл UR3.xml является файлом устройства SerialDevice, а не файлом рабочей единицы WorkCell, поэтому самый простой способ отличить — проверить xml.Есть ли тег WorkCell, если нет, то это не файл рабочей единицы WorkCell.Если нет тега WorkCell, но есть тег SerialDevice, значит это файл устройства SerialDevice.
UR3.xml
<SerialDevice name="UR3_2015">
<Frame name="Base" />
<!-- Include either DHParam.xml or PosRPYParam.xml -->
<Include file="DHParam.xml" />
<Frame name="Flange" refframe="Joint5">
<RPY>0 0 0</RPY>
<Pos>0 0 0.0799</Pos>
</Frame>
<PosLimit refjoint="Joint0" min="-360" max="360" />
<PosLimit refjoint="Joint1" min="-450" max="270" />
<PosLimit refjoint="Joint2" min="-360" max="360" />
<PosLimit refjoint="Joint3" min="-450" max="270" />
<PosLimit refjoint="Joint4" min="-360" max="360" />
<PosLimit refjoint="Joint5" min="-1080" max="1080" /> <!-- Unlimited! -->
<VelLimit refjoint="Joint0" max="180" />
<VelLimit refjoint="Joint1" max="180" />
<VelLimit refjoint="Joint2" max="180" />
<VelLimit refjoint="Joint3" max="360" />
<VelLimit refjoint="Joint4" max="360" />
<VelLimit refjoint="Joint5" max="360" />
<AccLimit refjoint="Joint0" max="120" />
<AccLimit refjoint="Joint1" max="120" />
<AccLimit refjoint="Joint2" max="120" />
<AccLimit refjoint="Joint3" max="120" />
<AccLimit refjoint="Joint4" max="120" />
<AccLimit refjoint="Joint5" max="120" />
<Drawable name="flangeGeo" refframe="Base">
<RPY>180 0 90</RPY>
<Pos> 0 0 0</Pos>
<Polytope file="Geometry/Base" />
</Drawable>
<Drawable name="Joint0Geo" refframe="Joint0">
<RPY>180 0 90</RPY>
<Pos>0 0 0</Pos>
<Polytope file="Geometry/Joint0" />
</Drawable>
<Drawable name="Joint1Geo" refframe="Joint1">
<RPY> 90 180 0 </RPY>
<Pos>0.1519 0 0</Pos>
<Polytope file="Geometry/Joint1" />
</Drawable>
<Drawable name="Joint2Geo" refframe="Joint2">
<RPY>90 180 0 </RPY>
<Pos>0.39555 0 0</Pos>
<Polytope file="Geometry/Joint2" />
</Drawable>
<Drawable name="Joint3Geo" refframe="Joint3">
<RPY> 0 0 180 </RPY>
<Pos> 0 0.60855 0</Pos>
<Polytope file="Geometry/Joint3" />
</Drawable>
<Drawable name="Joint4Geo" refframe="Joint4">
<RPY>0 0 90</RPY>
<Pos>0 -0.1104 -0.60855</Pos>
<Polytope file="Geometry/Joint4" />
</Drawable>
<Drawable name="Joint5Geo" refframe="Flange">
<RPY>180 -180 0</RPY>
<Pos>0 0.69195 -0.1903</Pos>
<Polytope file="Geometry/ToolFlange" />
</Drawable>
<ProximitySetup file="ProximitySetup.xml" />
<Q name="Home">1.57 -2.4 2.4 -1.57 -1.57 0</Q>
</SerialDevice>
DHParam.xml
<DHJoint name="Joint0" alpha="0" a="0" d="0" offset="0" type="schilling" />
<DHJoint name="Joint1" alpha="90" a="0" d="0.1519" offset="0" type="schilling" />
<DHJoint name="Joint2" alpha="0" a="-0.24365" d="0" offset="0" type="schilling" />
<DHJoint name="Joint3" alpha="0" a="-0.213" d="0" offset="0" type="schilling" />
<DHJoint name="Joint4" alpha="90" a="0" d="0.1104" offset="0" type="schilling" />
<DHJoint name="Joint5" alpha="-90" a="0" d="0.0834" offset="0" type="schilling" />
ProximitySetup.xml
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProximitySetup UseIncludeAll="true" UseExcludeStaticPairs="true">
<Exclude PatternA="Base" PatternB="Joint0"/>
<Exclude PatternA="Joint0" PatternB="Joint1"/>
<Exclude PatternA="Joint1" PatternB="Joint2"/>
<Exclude PatternA="Joint2" PatternB="Joint3"/>
<Exclude PatternA="Joint3" PatternB="Joint4"/>
<Exclude PatternA="Joint4" PatternB="Flange"/>
</ProximitySetup>