ROS(ROS2) - QSerialPort


クラウディア 


1. 概要
2. CMakeLists.txt

1. 概要

 「ROS」のプログラムで、シリアル通信を行う機会がありまして。  当初、べたな「open」「ioctl」「pselect」「write」「read」等を使用して、通信しようとしていたのですが。  ポートのボーレートが、「115200」なのですが、当初の設定では、このポートの状態を設定する方法がわからない。

termios.h
 の設定では。

/* c_cflag bit meaning */
#define  B0     0000000         /* hang up */
#define  B50    0000001
#define  B75    0000002
#define  B110   0000003
#define  B134   0000004
#define  B150   0000005
#define  B200   0000006
#define  B300   0000007
#define  B600   0000010
#define  B1200  0000011
#define  B1800  0000012
#define  B2400  0000013
#define  B4800  0000014
#define  B9600  0000015
#define  B19200 0000016
#define  B38400 0000017
 という設定までしかないのです。  なので、「cutecom」で、ボーレート「115200」は何をもって実現しているのであろうかと、ソースを見てみたところ。  「Qt5::QSerialPort」を使用していることが分かったので、使ってみようと思った次第です。  結局。

bits/termios-baud.h
 というファイルに(「termios.h」が更にインクルードしている)。

/* Extra output baud rates (not in POSIX).  */
#define  B57600    0010001
#define  B115200   0010002
#define  B230400   0010003
#define  B460800   0010004
#define  B500000   0010005
#define  B576000   0010006
#define  B921600   0010007
#define  B1000000  0010010
#define  B1152000  0010011
#define  B1500000  0010012
#define  B2000000  0010013
#define  B2500000  0010014
#define  B3000000  0010015
#define  B3500000  0010016
#define  B4000000  0010017
#define __MAX_BAUD B4000000
 という定義があって、うまく動作しなかった、「Qt5::QSerialPort」はやめたのですが・・・。  「make」するのも大変だったので、現在までの、メモを残しておこうと思った次第です。  本ページは、下記のサイトを参考にさせていただきました。
ROS2 の共有ライブラリを使用したプログラムの作成 before Foxy Fitzroy #ROS2」
「how to include qt directories and library with cmake」
「ROS2 package.xmlとCMakeLists.txtのチートシート #Foxy」
「Qt - can't find linker symbol for virtual table for `QCoreApplication' value - error in hello world program

2. CMakeLists.txt

 とにかく、インクルードファイルが見つからないやら、リンクできないやら・・・。  正解ではないものの、とりあえず、「make」が通った状態です。  こんな、感じです。

cmake_minimum_required(VERSION 3.10)
project(my_service)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(my_interfaces REQUIRED)
find_package(Qt5 COMPONENTS Core SerialPort REQUIRED)

set(CMAKE_CXX_FLAGS "-fPIC -DQT_NO_VERSION_TAGGING")

add_executable(server
	src/my_server.cpp
	src/serial.cpp
	)
target_link_libraries(server Qt5::SerialPort)
target_include_directories(server
  PUBLIC
    /usr/include/x86_64-linux-gnu/qt5
	/usr/include/x86_64-linux-gnu/qt5/QtCore
)
ament_target_dependencies(server rclcpp my_interfaces)

add_executable(client src/my_client.cpp)
ament_target_dependencies(client rclcpp my_interfaces)

install(TARGETS
  server
  client
  DESTINATION lib/${PROJECT_NAME})

ament_package()
 ちょっと無茶な、箇所がたくさんありますが。  7行目が、「Qt5」のパッケージ確認です。  9行目は、コンパイル時のワーニングやらエラーをとるためのオプションの指定です。  15行目が、リンク時のライブラリ追加。  18、19行目が、インクルードパスが見つからなかったので、追加している箇所です。  この順番でないとエラーが発生します。  インクルードパスについては、もっとうまい定義があるはずなのですが、なんとか「make」が通るようになったのがこの状態です。

AbemaTV 無料体験