実習記録(三):レーダー同期板の学習テスト&外部ハードウェアトリガ装置の完成
42095 ワード
レーダー同期板の学習テスト&外部ハードウェアトリガの完了
2020.07.27~2020.07.31、2020.08.03
1.タスク
1)従来のレーダー同期板を学習し、従来のレーダー同期板精度をテストする2)STM 32はシリアルポートで4桁の受信を実現し、瞬時にハイレベルの受信を行い、デジタルサイズに応じてハイレベルの持続時間を設定する3)boost::asioライブラリを用いてubuntuシステム上に周期的にシリアルポートに情報を送信するクラスを書く
2.環境&ツール
STM 32 F 103 RCT 6シリアルUSBアダプタの上の2つのものは原理図を見て、ハードウェアの接続とコードのピンの選択はそれらを必要とします
1)同期板STM 32 F 103 RCT 6と拡張板オシロスコープRIGOL-DS 2072 A
2)windows STM32CubeMX Keil5 XCOM FlyMCU
3)ubuntu16.04 ROS kinetic cutecom
3.準備
3.1シンクロ板部分
既存のコードを読み、大まかな機能が提供する説明がテストと一致しないことを理解するため、まず万用表で各ピンの定義をはっきり区別する.
3.2 STM 32部
STM 32 C ubeMX新規プロジェクト、構成:
3.3 ubuntu部分
ワークスペースの作成、パッケージvscode構成以上の実習記録の作成(一)に記録がある
4.コード
4.1同期ボード部分
なし
4.2 STM 32部
//
/* USER CODE BEGIN 2 */
//
//HAL_UART_Transmit(&huart1, (uint8_t *)" ", 12, 0xFFFF);
/* USER CODE END 2 */
//
/* USER CODE END WHILE */
char rx_message[RXSIZE] = {0};
uint16_t rx_int = 0;
/* USER CODE END 2 */
HAL_UART_Receive(&huart1, (uint8_t *)&rx_message, RXSIZE, 0xffff);
//HAL_UART_Transmit(&huart1, (uint8_t *)&rx_message, RXSIZE, 0xffff);
while (HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);
for (int i = 0; i < RXSIZE; i++) {
rx_int = rx_int + ((int)rx_message[i] - 48) * pow(10, RXSIZE - i - 1);
}
//HAL_UART_Transmit(&huart1, (uint8_t *)&rx_int, RXSIZE, 0xffff);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
HAL_Delay(rx_int);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
/* USER CODE BEGIN 3 */
4.3 ubuntu部分
//main.cpp
#include "writer_handler.h"
#include
int main(int argc, char* argv[])
{
std::cout << "Program Start ..." << std::endl;
while (1)
{
try
{
xxxx::SerialPortWriter my_sp("/dev/ttyUSB0", "0300");
// my_sp.serialRead();
my_sp.handleCall();
}
catch (std::exception& err)
{
std::cout << err.what() << std::endl;
}
boost::this_thread::sleep(boost::posix_time::milliseconds(500));
}
return 0;
}
//.h
#ifndef WRITER_HANDLER_H
#define WRITER_HANDLER_H
#include
#include
#include
typedef std::string any_type;
namespace xxxx
{
class SerialPortWriter
{
public:
SerialPortWriter(const any_type& port_name, const any_type data);
~SerialPortWriter();
void serialWrite(const any_type data);
void serialRead();
void handleCall();
private:
boost::asio::io_service my_ios_;
boost::asio::serial_port* p_serial_port_;
boost::system::error_code ec_;
};
} // namespace xxxx
#endif
//.cpp
#include "writer_handler.h"
#define MSGSIZE 4
namespace xxxx
{
SerialPortWriter::SerialPortWriter(const any_type& port_name, const any_type data) : p_serial_port_(NULL)
{
p_serial_port_ = new boost::asio::serial_port(my_ios_);
p_serial_port_->open(port_name, ec_);
p_serial_port_->set_option(boost::asio::serial_port::baud_rate(115200), ec_);
p_serial_port_->set_option(boost::asio::serial_port::flow_control(boost::asio::serial_port::flow_control::none), ec_);
p_serial_port_->set_option(boost::asio::serial_port::parity(boost::asio::serial_port::parity::none), ec_);
p_serial_port_->set_option(boost::asio::serial_port::stop_bits(boost::asio::serial_port::stop_bits::one), ec_);
p_serial_port_->set_option(boost::asio::serial_port::character_size(8), ec_);
serialWrite(data);
}
SerialPortWriter::~SerialPortWriter()
{
if (p_serial_port_)
{
delete p_serial_port_;
}
}
void SerialPortWriter::serialWrite(const any_type data)
{
p_serial_port_->write_some(boost::asio::buffer(data), ec_);
std::cout << "
write: " << data << std::endl;
}
void SerialPortWriter::serialRead()
{
char v[MSGSIZE];
p_serial_port_->read_some(boost::asio::buffer(v, MSGSIZE), ec_);
std::cout << "
read: " << v << std::endl;
}
void SerialPortWriter::handleCall()
{
my_ios_.run();
}
} // namespace xxxx
//cmakelist
// , #
cmake_minimum_required(VERSION 3.0.2)
project(serial_writer)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES serial_writer
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
add_library(writer_handler
src/writer_handler.cpp
include/writer_handler.h
)
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(
writer_handler
${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(
serial_writer_main
src/serial_writer_main.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Specify libraries to link a library or executable target against
target_link_libraries(
serial_writer_main
writer_handler
${catkin_LIBRARIES}
)
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# catkin_install_python(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS ${PROJECT_NAME}_node
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS ${PROJECT_NAME}
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_serial_writer.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
5.テストの実行
5.1同期ボード部分
サイクル数
start
end
へいきんサイクル
へいきんごさ
第1グループ
50
-42.87s
7.123s
999.86111ms
-0.13889ms
第2グループ
50
-47.88s
2.110s
999.84615ms
-0.15385ms
第3グループ
50
-38.07s
11.92s
999.80000ms
-0.20000ms
第4グループ
50
-49.87s
124.1ms
999.88200ms
-0.11800ms
第5グループ
50
-41.09s
8.898s
999.76000ms
-0.24000ms
以上の5組の平均誤差は-0.170418 msである.
5.2 STM 32部
STM 32とパソコンをシリアルUSBアダプタで接続する
FlyMcuでhexファイルでプロジェクトをSTM 32にコンパイル
XCOMでシリアルポートにメッセージを送信し、返信メッセージが正しいかどうかを確認し、出力ピンの波形をオシロスコープで確認する
5.3 ubuntu部分
命令でUSBに権限を开ける(ここで长い间カードをかけて、ずっとコードに问题があると思って、きっとハードウェアを検査して、泣きます~
# USB
ls -l /dev/ttyUSB*
#usb
sudo chmod 777 /dev/ttyUSB0
シリアルUSBアダプタでパソコンに差し込み、自分のRXとTXを接続する
コンパイルシリアルポート送信プログラムを実行し、戻り値が正しいかどうかを確認します.
あるいは2本の転送線で2台のパソコンを接続し、もう1台はcutecomで戻り値を観察します.
5.3総合テスト
STM 32とパソコンをシリアルUSBアダプタで接続する
シリアルポート送信プログラムをコンパイルして実行し、数値マルチテストのいくつかのグループを修正します
オシロスコープで出力ピン波形を検出する
结语:仕事を始める前に必ず需要を确定して、方案の交流ははっきりしていて、半日かけてどのようにシリアルポートで中断して不定长の情报を受信するかを研究して、先辈は直接表示して、外部は実际に使う中で情报はきっと定长のタイプで、このようにする必要はありません.はい、また迂回しました.方向は確かにとても重要です.そうしないと、無駄に勉強しやすいです.ハードウェアはソフトウェアと同様にチェックが必要で、実行に問題がある理由は両方あります.以前は寡聞だったが、boostライブラリは初めて使用され、臨時学習にも時間がかかった.
注:本文は自用実習記録