1. 程式人生 > >rosserial_arduino學習筆記9《CMake with rosserial_arduino》

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

 新增幾張照片吧: