- 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」が通るようになったのがこの状態です。
|
|