rosserial_arduino學習筆記9《CMake with rosserial_arduino》
當從事大型軟體專案時,Arduino IDE變得很笨拙。您經常希望能夠從命令列編譯專案,或者使用Eclipse之類的其他IDE、等這些可以自動編譯的工具。最後,通過使用rosserial_client CMake基礎結構,您可以使用ROS buildfarm構建和分發韌體。
在本教程中,我們將建立一個簡單的hello world韌體。
在Indigo新增的功能:
您可以在常規ROS包中再次構建rosserial韌體和其他客戶端。
此功能可從Indigo開始使用。rosserial_arduino軟體包的安裝已經也安裝了arduino-core,因此沒有必要再增加額外的工作。
1 製作你的專案
啟動rosserial_arduino專案就像建立任何其他包一樣。在catkin工作區的src資料夾中:
catkin_create_pkg helloworld rosserial_arduino rosserial_client std_msgs
像往常一樣,使用catkin_create_pkg建立一個名為helloworld的包。您必須依賴rosserial_arduino作為Arduino工具鏈,並使用rosserial_client作為客戶端庫生成巨集。最後,由於我們將使用std_msgs / String訊息,因此您必須依賴std_msgs。
2 源程式
複製下面的原始碼,並在helloworld包中建立一個名為firmware / chatter.cpp的檔案。
#include <ros.h> #include <std_msgs/String.h> #include <Arduino.h> ros::NodeHandle nh; std_msgs::String str_msg; ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { nh.initNode(); nh.advertise(chatter); } void loop() { str_msg.data = hello; chatter.publish( &str_msg ); nh.spinOnce(); delay(1000); }
該程式幾乎與Publisher Tutorial中介紹的hello world完全相同。當您在Arduino IDE之外編譯cpp檔案時,您需要明確包含一個包含所有Arduino函式的標頭檔案(digitalRead,analogRead,delay等)。如果您不確定是否要使用Arduino IDE與CMake的檔案,只需在檔案頂部新增此行即可。反正不會有壞處,它確保您的檔案始終與非Arduino IDE構建系統相容。
3 CMakeLists.txt
開啟包目錄中的CMakeLists.txt並用以下內容替換內容:
cmake_minimum_required(VERSION 2.8.3)
project(helloworld)
find_package(catkin REQUIRED COMPONENTS
rosserial_arduino
rosserial_client
)
catkin_package()
rosserial_generate_ros_lib(
PACKAGE rosserial_arduino
SCRIPT make_libraries.py
)
rosserial_configure_client(
DIRECTORY firmware
TOOLCHAIN_FILE ${ROSSERIAL_ARDUINO_TOOLCHAIN}
)
rosserial_add_client_target(firmware hello ALL)
rosserial_add_client_target(firmware hello-upload)
使用rosserial_client的CMake指令碼,實際上並沒有直接構建韌體,而是配置一個單獨的CMake專案,並將目標從catkin包傳遞到子專案。
rosserial_generate_ros_lib函式建立一個名為helloworld_ros_lib目標,這將產生rosserial客戶端庫,包括訊息的標頭檔案。
rosserial_configure_client函式建立一個目標,它會在特定的子目錄配置CMake專案,可以使用提供的工具鏈,在這種情況下。rosserial_arduino提供的Arduino工具鏈。
最後,rosserial_add_client_target呼叫每一個傳遞過來的目標,這樣當你執行make命令編譯helloworld_firmware_hello的catkin目標時,它將配置fireware目錄並在其中構建hello目標。
現在,我們實際上需要第二個CMakeLists.txt,這是韌體子專案的一個。在包中建立檔案firmware / CMakeLists.txt,其中包含以下內容:
cmake_minimum_required(VERSION 2.8.3)
include_directories(${ROS_LIB_DIR})
# Remove this if using an Arduino without native USB (eg, other than Leonardo)
add_definitions(-DUSB_CON)
generate_arduino_firmware(hello
SRCS chatter.cpp ${ROS_LIB_DIR}/time.cpp
BOARD leonardo
PORT /dev/ttyACM0
)
該generate_arduino_firmware功能由提供Arduino的cmake的工具鏈,此用途。它處理定位Arduino的複雜性,連結您使用的任何庫,等等。
你應該完成!
4 構建和測試
4.1 使用catkin_make
執行catkin_make時,預設情況下應該構建韌體,但您也可以明確指定它:
catkin_make helloworld_firmware_hello
現在連線一個Arduino Leonardo,確認它出現為/ dev/ ttyACM0(或相應更改韌體的CMakeLists.txt):
catkin_make helloworld_firmware_hello-upload
您可能需要按重置按鈕重新啟動Leonardo以允許上載程式碼,並且埠可能會在重置後更改。
4.2 使用catkin工具
執行catkin build時,預設情況下應該構建韌體,但您也可以明確指定它:
catkin build helloworld
現在連線一個Arduino Leonardo,確認它出現為/dev/ ttyACM0(或相應更改韌體的CMakeLists.txt),並對其進行程式設計:
catkin build --no-deps helloworld --make-args helloworld_firmware_hello-upload
您可能需要按重置按鈕重新啟動Leonardo以允許上載程式碼,並且埠可能會在重置後更改。
測試
現在你可以使用Arduino了!在單獨的終端中啟動以下內容以檢視其執行情況:
roscore
rosrun rosserial_python serial_node.py / dev / ttyACM0
rostopic echo chatter
附加資訊
提供這些功能的CMake指令碼存在於此處,如果您想檢查它以更好地瞭解正在發生的事情。
如果您不理解,那麼第一步是清理工作區(刪除構建和開發樹),然後以詳細模式重新執行:
catkin_make VERBOSE = 1
新增幾張照片吧: