Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别
Gazebo作為一個運動仿真環(huán)境,可以直接加載編寫好的機器人模型(如TIAGo和Yumi等),也可以自己構(gòu)建多個運動模型,不過稍有難度。在構(gòu)建復雜運動模型前,我們需要熟悉gazebo模型設(shè)置以及插件編寫、生成。Gazebo官網(wǎng)有介紹如何搭建小車運行模型以及加載傳感器,或者網(wǎng)上也有一些中文教程。
1. 編寫生成插件的源文件
Gazebo都是加載world文件,然后world文件中會加載各種模型,所以為了最后可以在world中設(shè)置模型的運動,一種方式就是在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類實例化一個對象,然后通過三個參數(shù)可設(shè)置運動模型名稱,運動持續(xù)時間以及是否循環(huán)執(zhí)行g(shù)azebo::common::PoseAnimationPtr anim(new gazebo::common::PoseAnimation("test", 46.0, false)); //聲明一個控制模型位姿的對象gazebo::common::PoseKeyFrame *key; //設(shè)置模型到達某位姿的時刻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;//通過事件響應來更新觸發(fā)程序private: event::ConnectionPtr updateConnection;};//在Gazebo仿真器中注冊該插件GZ_REGISTER_MODEL_PLUGIN(AnimatedBox) }2. 編寫CMakeLists.txt文檔
為了對上述源文件進行編譯,我們使用cmake編譯,也是在animal_box目錄,新建一個CMakeLists.txt文檔,內(nèi)容如下圖,具體參數(shù)代表什么意思,可以參考該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)中。由于權(quán)限問題,我們使用sudo命令復制,在animal_box目錄下打開終端,輸入如下指令,此時gazebo默認庫目錄下會出現(xiàn)libanimated_box.so文件。
sudo cp build/libanimated_box.so /usr/lib/x86_64-linux-gnu/gazebo-7/plugins/libanimated_box.so5. 運行效果?
?
附錄?
1. windows動態(tài)鏈接庫后綴名為.dll,靜態(tài)鏈接庫后綴名為.lib;Linux動態(tài)鏈接庫為.so文件,靜態(tài)鏈接庫為.a
靜態(tài)鏈接庫會在程序鏈接階段和其他.o目標文件(匯編階段生成)一起生成可執(zhí)行文件,因此在可執(zhí)行文件運行時,不再需要靜態(tài)庫文件。而動態(tài)鏈接庫文件只在程序運行時才被調(diào)用。因此可得靜態(tài)庫文件和動態(tài)庫文件的特點如下:
a. 因為所有相關(guān)靜態(tài)庫文件被鏈接合成一個可執(zhí)行文件,所以占用空間
b. 靜態(tài)庫文件更新,那么使用該文件的程序得重新編譯生成再發(fā)布給用戶,導致用戶需要整個應用重新下載,全量更新。
?
c. 動態(tài)庫文件更新,使用該文件的程序不用重新下載,只需要更換動態(tài)庫文件即可,增量更新。
d. 不同程序調(diào)用相同的庫,可以只有一份動態(tài)鏈接庫文件,資源共享(所以也叫共享庫),而且節(jié)省空間。
總結(jié)
以上是生活随笔為你收集整理的Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的主类概念以及public s
- 下一篇: Java引入import其它目录的自定义