ROS知识:分析和改写小乌龟代码【01】
ROS之游戲手柄控制烏龜和機(jī)器人_u014587147的專欄-CSDN博客
本篇對(duì)小烏龜?shù)捻?xiàng)目進(jìn)行分析,看看一個(gè)普通的ROS項(xiàng)目到底如何構(gòu)建,才能算完整合法工程;學(xué)完后,期望可以開(kāi)發(fā)我們自己的項(xiàng)目。
第一章 項(xiàng)目導(dǎo)入
1.1建立工作空間myMake、導(dǎo)入功能包ros_tutorials
mkdir -p ~/myCmake/src cd ~/myCmake/src git clone https://github.com/ros/ros_tutorials.git將myCmake工作空間-ros_tutorials包內(nèi)的烏龜節(jié)點(diǎn)保留,其他刪除;
cd ~/myCmake/src/ros_tutorials rm -rf ros*因?yàn)閷?dǎo)入的ros_tutorials目錄內(nèi)存在四個(gè)應(yīng)用包:
因此,刪除前三個(gè),保留turtlesim一個(gè)功能包。
進(jìn)入烏龜功能包目錄,用tree -L 2 語(yǔ)句顯示內(nèi)涵路徑,全部?jī)?nèi)容如下:
. ├── CHANGELOG.rst ├── CMakeLists.txt ├── images # 相關(guān)的圖片文件 ├── include # 相關(guān)的頭文件 ├── launch # 運(yùn)行時(shí)文件 用roslaunch調(diào)用 ├── msg # 消息數(shù)據(jù)結(jié)構(gòu)定義(傳遞用) ├── package.xml # 包結(jié)構(gòu)定義 ├── src # cpp程序代碼 ├── srv # 服務(wù)消息數(shù)據(jù)結(jié)構(gòu)定義(傳遞用) └── tutorials # 共有的程序函數(shù)更詳細(xì)的包內(nèi)信息是:
├── CHANGELOG.rst ├── CMakeLists.txt ├── images │ ├── box-turtle.png │ ├── diamondback.png... ... ... │ └── turtle.xar ├── include │ └── turtlesim │ ├── turtle_frame.h │ └── turtle.h ├── launch │ └── multisim.launch ├── msg │ ├── Color.msg │ └── Pose.msg ├── package.xml ├── src │ ├── turtle.cpp │ ├── turtle_frame.cpp │ ├── turtlesim │ │ └── __init__.py │ └── turtlesim.cpp ├── srv │ ├── Kill.srv │ ├── SetPen.srv │ ├── Spawn.srv │ ├── TeleportAbsolute.srv │ └── TeleportRelative.srv └── tutorials├── draw_square.cpp├── mimic.cpp└── teleop_turtle_key.cpp1.2 打開(kāi)CMakeLists.txt查看對(duì)應(yīng)的代碼
cmake_minimum_required(VERSION 3.0.2)?? -----指定cmake最低版本3。02
project(turtlesim) --------指定工程名稱“turtlesim”
find_package(catkin REQUIRED COMPONENTS geometry_msgs message_generation rosconsole roscpp roscpp_serialization roslib rostime std_msgs std_srvs)
-----告訴catkin所依賴的組件清單
find_package(Qt5Widgets REQUIRED)
----------指定依賴于QT5Widgets【主要從環(huán)境的PATH變量查找,較為智能,比如遇到bin結(jié)尾的路徑,將自動(dòng)回到上一級(jí)路徑查找。】
find_package(Boost REQUIRED COMPONENTS thread)
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
---------------指定include路徑的列表
link_directories(${catkin_LIBRARY_DIRS})
---------------------指定靜態(tài)庫(kù)的列表
add_message_files(DIRECTORY msg FILES? Color.msg Pose.msg)
---------------將自己定義的message表加入
add_service_files(DIRECTORY srv FILES
????????????????? Kill.srv
????????????????? SetPen.srv
????????????????? Spawn.srv
????????????????? TeleportAbsolute.srv
????????????????? TeleportRelative.srv)
generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs)
---------------------將自己規(guī)定的service加入列表
catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs)
--------------- 自己定義的應(yīng)用包中加入支持
set(turtlesim_node_SRCS
? src/turtlesim.cpp
? src/turtle.cpp
? src/turtle_frame.cpp
)
---------------------將自己節(jié)點(diǎn)的cpp源文件集中加入列表
set(turtlesim_node_HDRS
? include/turtlesim/turtle_frame.h
)
--------------- 自己定義的頭文件加入
qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS})
---------------------將qt5加入
add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS})
---------------------指出一個(gè)編譯節(jié)點(diǎn)內(nèi)目標(biāo)文件turtlesim_node【注意:節(jié)點(diǎn)內(nèi)可有多個(gè)】
target_link_libraries(turtlesim_node Qt5::Widgets ${catkin_LIBRARIES} ${Boost_LIBRARIES})
---------------------以上目標(biāo)文件的鏈接庫(kù)
add_dependencies(turtlesim_node turtlesim_gencpp)
---------------------指出 目標(biāo)文件turtlesim_node其它依賴
add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp)
---------------------指出一個(gè)編譯節(jié)點(diǎn)內(nèi)目標(biāo)文件turtle_teleop_key
target_link_libraries(turtle_teleop_key ${catkin_LIBRARIES})
---------------------以上目標(biāo)文件的鏈接庫(kù)
add_dependencies(turtle_teleop_key turtlesim_gencpp)
add_executable(draw_square tutorials/draw_square.cpp)
target_link_libraries(draw_square ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_dependencies(draw_square turtlesim_gencpp)
add_executable(mimic tutorials/mimic.cpp)
target_link_libraries(mimic ${catkin_LIBRARIES})
add_dependencies(mimic turtlesim_gencpp)
install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic
? RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
install(DIRECTORY images
? DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
? FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")
第二章 烏龜項(xiàng)目設(shè)計(jì)分解
2.1 teleop_turtle_key.cpp文件
該文件有兩個(gè)內(nèi)容:
- 保存和恢復(fù)終端數(shù)據(jù),
? 在進(jìn)入程序后,將本終端數(shù)據(jù)保存;在退出程序后,恢復(fù)終端數(shù)據(jù)。
-
TeleopTurtle類(和鍵盤輸入相關(guān))
????????這個(gè)類是遙控烏龜?shù)墓?jié)點(diǎn),有以下幾個(gè)功能:
? ? ? ? ? ?1)接受鍵盤的輸入
? ? ? ? ? ?2)按照按鍵值,寫(xiě)好數(shù)據(jù)Twist
? ? ? ? ? ?3)發(fā)出Topic=【turtle1/cmd_vel】?jī)?nèi)含:前進(jìn)幾個(gè)格、方向幾度,存Twist數(shù)據(jù);
2.2 draw_square.cpp文件
????????該文為全局函數(shù),是對(duì)環(huán)境進(jìn)行設(shè)定,就是在接到TeleopTurtle類的【turtle1/cmd_vel】消息后,小烏龜所在位置,注意,這是一個(gè)抽象的方框,在環(huán)境內(nèi)部。當(dāng)該框確定后,在該框中開(kāi)始畫(huà)烏龜。
? ? ? ? 主要功能:
- ? ? ? ? ?對(duì)烏龜?shù)男羞M(jìn)、選轉(zhuǎn)、停止用狀態(tài)機(jī)表示;
- ? ? ? ? ?發(fā)出Topic=< turtle1/cmd_vel>? 通知烏龜類,如何擺放當(dāng)前圖片;
- ? ? ? ? ?接受Topic=<turtle1/pose>;獲取烏龜框圖片位置的信息;
- ? ? ? ? ?接收復(fù)位信號(hào)
- ? ? ? ? ?延時(shí)發(fā)送
? ? ? ? ?
2.3 話題【turtle1/cmd_vel】
? ? ? ? ??
?????
總結(jié)
以上是生活随笔為你收集整理的ROS知识:分析和改写小乌龟代码【01】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言编译:CMakeLists.txt
- 下一篇: Win10不能使用Genymotion模