Gazebo新增模型並控制模型運動作為動態障礙物(Ubuntu16.04, Gazebo7.16),附錄動態連結庫和靜態連結庫區別
Gazebo作為一個運動模擬環境,可以直接載入編寫好的機器人模型(如TIAGo和Yumi等),也可以自己構建多個運動模型,不過稍有難度。在構建複雜運動模型前,我們需要熟悉gazebo模型設定以及外掛編寫、生成。Gazebo官網有介紹如何搭建小車執行模型以及載入感測器,或者網上也有一些中文教程。
1. 編寫生成外掛的原始檔
Gazebo都是載入world檔案,然後world檔案中會載入各種模型,所以為了最後可以在world中設定模型的運動,一種方式就是在world檔案中載入模型時匯入外掛,所以我們需要編寫一個源程式(命名為animated_box.cc),以此來得到外掛。先新建一個目錄animal_box,裡面存放該原始檔。
#include <boost/bind.hpp>
#include <gazebo/gazebo.hh>
#include <ignition/math.hh>
#include <gazebo/physics/physics.hh>
#include <gazebo/common/common.hh>
#include <stdio.h>
namespace gazebo
{
class AnimatedBox : public ModelPlugin
{
public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)
{
this->model = _parent;
//使用PoseAnimation類例項化一個物件,然後通過三個引數可設定運動模型名稱,運動持續時間以及是否迴圈執行
gazebo::common::PoseAnimationPtr anim(new gazebo::common::PoseAnimation("test", 46.0, false));
//宣告一個控制模型位姿的物件
gazebo::common::PoseKeyFrame *key;
//設定模型到達某位姿的時刻
key = anim->CreateKeyFrame(0);
key->Translation(ignition::math::Vector3d(2.5, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(21.0);
key->Translation(ignition::math::Vector3d(2.5, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(26.0);
key->Translation(ignition::math::Vector3d(2.0, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(31.0);
key->Translation(ignition::math::Vector3d(1.5, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(36.0);
key->Translation(ignition::math::Vector3d(1.0, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(41.0);
key->Translation(ignition::math::Vector3d(0.5, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
key = anim->CreateKeyFrame(46);
key->Translation(ignition::math::Vector3d(0, 0, 0));
key->Rotation(ignition::math::Quaterniond(0, 0, 0));
_parent->SetAnimation(anim);
}
private: physics::ModelPtr model;
//通過事件響應來更新觸發程式
private: event::ConnectionPtr updateConnection;
};
//在Gazebo模擬器中註冊該外掛
GZ_REGISTER_MODEL_PLUGIN(AnimatedBox)
}
2. 編寫CMakeLists.txt文件
為了對上述原始檔進行編譯,我們使用cmake編譯,也是在animal_box目錄,新建一個CMakeLists.txt文件,內容如下圖,具體引數代表什麼意思,可以參考該Cmake文件。
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
find_package(Boost REQUIRED COMPONENTS system)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
find_package(Protobuf REQUIRED)
find_package(gazebo REQUIRED)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}")
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
//使用animated_box.cc原始檔生成外掛,libanimated_box.so庫檔案
add_library(animated_box SHARED animated_box.cc)
//在生成外掛過程中需要使用到的gazebo庫檔案
target_link_libraries(animated_box ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
3. 編譯
此時我們還是在animal_box目錄下,新建一個build目錄,然後進入buid目錄右鍵開啟終端,輸入【cmake ..】命令,然後再輸入【make】命令就會在build目錄生成一個libanimated_box.so庫檔案,如下圖
4. 使用外掛
在得到外掛後,我們需要將該外掛在一個world檔案中使用,仍舊是在animal_box目錄下新建一個animated_box.world檔案,然後加入如下程式碼。
<?xml version="1.0"?>
<sdf version="1.4">
<world name="animated_box_world">
<!-- Ground Plane -->
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<model name="box">
<pose>2.5 0 0 0 0 0</pose>
<link name="link">
<collision name="collision">
<geometry>
<box>
<size>0.3 0.3 1.5</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.3 0.3 1.5</size>
</box>
</geometry>
</visual>
</link>
<plugin name="push_animate" filename="libanimated_box.so"/>
</model>
</world>
</sdf>
此時在animal_box目錄開啟終端,輸入命令【gazebo --verbose animated_box.world】,此時會報錯找不到libanimated_box.so檔案,當然了,因為我們的libanimated_box.so檔案不在gazebo預設查詢的庫目錄中,所以我們要將生成的庫檔案放入gazebo預設的庫目錄(/usr/lib/x86_64-linux-gnu/gazebo-7/plugins)中。由於許可權問題,我們使用sudo命令複製,在animal_box目錄下開啟終端,輸入如下指令,此時gazebo預設庫目錄下會出現libanimated_box.so檔案。
sudo cp build/libanimated_box.so /usr/lib/x86_64-linux-gnu/gazebo-7/plugins/libanimated_box.so
5. 執行效果
附錄
1. windows動態連結庫字尾名為.dll,靜態連結庫字尾名為.lib;Linux動態連結庫為.so檔案,靜態連結庫為.a
靜態連結庫會在程式連結階段和其他.o目標檔案(彙編階段生成)一起生成可執行檔案,因此在可執行檔案執行時,不再需要靜態庫檔案。而動態連結庫檔案只在程式執行時才被呼叫。因此可得靜態庫檔案和動態庫檔案的特點如下:
a. 因為所有相關靜態庫檔案被連結合成一個可執行檔案,所以佔用空間
b. 靜態庫檔案更新,那麼使用該檔案的程式得重新編譯生成再發布給使用者,導致使用者需要整個應用重新下載,全量更新。
c. 動態庫檔案更新,使用該檔案的程式不用重新下載,只需要更換動態庫檔案即可,增量更新。
d. 不同程式呼叫相同的庫,可以只有一份動態連結庫檔案,資源共享(所以也叫共享庫),而且節省空間。
相關文章
- 動態連結庫和靜態連結庫的區別
- 動態連結庫與靜態連結庫
- Win32動態連結庫與靜態連結庫的區別Win32
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- cmake 連結動態連結庫
- 動態庫和靜態庫的區別
- 動態連結庫(DLL)
- 動態連結庫(轉)
- 深入理解C語言----動態庫 & 靜態庫 & 連結C語言
- Linux下的靜態連結與動態連結Linux
- 靜態連結動態連結的連結順序問題和makefile示例
- ios靜態庫與動態庫的區別iOS
- 【連結 1】與靜態連結庫連結
- iOS動態庫和靜態庫的運用iOS
- 動態連結庫(DLL)的建立和使用
- 動態連結庫的生成和使用(二)
- Linux靜態庫和動態庫學習總結Linux
- ios靜態庫和動態庫iOS
- 使用js動態新增連結隨機連結JS隨機
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- linux下生成動態連結庫Linux
- 例程詳析動態連結庫 (轉)
- 類,介面與動態連結庫 (轉)
- 用動態連結動態洩露system地址並利用
- 偽靜態、靜態和動態的區別
- cmake:生成靜態庫和動態庫
- 靜態庫與動態庫
- Linux下的靜態庫、動態庫和動態載入庫Linux
- 載入動態連結庫——dlopen dlsym dlclose
- C#呼叫C++動態連結庫C#C++
- 完成Excel動態連結外部資料庫Excel資料庫
- 動態連結庫DLL_第1篇
- Xcode新增Shell指令碼打包靜態庫和動態庫XCode指令碼
- ios 開發中 動態庫 與靜態庫的區別iOS
- 動靜態庫
- 編譯 pyav 成 wheel 並使用 auditwheel 固化動態連結庫編譯
- 靜態模型一鍵動態化,教你如何整合動作捕捉能力模型
- 如何連結兩個名字一樣動態庫