ros2中创建工程,访问serial串口

2024-04-19 04:20

本文主要是介绍ros2中创建工程,访问serial串口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、创建一个ros2工程包

ros2 pkg create --build-type ament_cmake ros2_demo --dependencies rclcpp std_msgs

2、在工程ros2_demo中创建include文件夹,在该文件内创建serial_test.h头文件

#include <serial/serial.h>
#include "rclcpp/rclcpp.hpp"// originbot protocol data format
typedef struct {uint8_t header;uint8_t id;uint8_t length;uint8_t data[6];uint8_t check;uint8_t tail;
} DataFrame;class SerialTest: public rclcpp::Node
{
private:serial::Serial serial_;
public:SerialTest(std::string nodeName);~SerialTest();bool buzzer_control(bool on);
};

3、在工程包中的src目录下创建serial_test.cpp文件(node节点)

#include "ros2_demo/serial_test.h"SerialTest::SerialTest(std::string nodeName):Node(nodeName)
{   std::string port_name="ttyUSB0";    // 控制器与扩展驱动板卡的串口配置与通信try{serial_.setPort("/dev/" + port_name);                            //选择要开启的串口号serial_.setBaudrate(115200);                                     //设置波特率serial::Timeout timeOut = serial::Timeout::simpleTimeout(2000);  //超时等待serial_.setTimeout(timeOut);                                     serial_.open();                                                  //开启串口}catch (serial::IOException &e){RCLCPP_ERROR(this->get_logger(), "originbot can not open serial port,Please check the serial port cable! "); //如果开启串口失败,打印错误信息}// 初始化完成,蜂鸣器响5s,并输出日志buzzer_control(true);sleep(5);buzzer_control(false);RCLCPP_INFO(this->get_logger(), "OriginBot Start, enjoy it.");
}
SerialTest::~SerialTest()
{serial_.close();                                                  //关闭串口
}bool SerialTest::buzzer_control(bool on)
{   RCLCPP_INFO(this->get_logger(), "in buzzer_control methos,buzzer is on");DataFrame configFrame;// 封装蜂鸣器指令的数据帧configFrame.header = 0x55;configFrame.id     = 0x07;configFrame.length = 0x06;configFrame.data[0]= 0x00;configFrame.data[1]= 0x00;configFrame.data[2]= 0xFF;if(on)configFrame.data[3]= 0xFF;elseconfigFrame.data[3]= 0x00;configFrame.data[4]= 0x00;configFrame.data[5]= 0x00;configFrame.check = (configFrame.data[0] + configFrame.data[1] + configFrame.data[2] + configFrame.data[3] + configFrame.data[4] + configFrame.data[5]) & 0xff;configFrame.tail   = 0xbb; try{serial_.write(&configFrame.header, sizeof(configFrame)); //向串口发数据}  catch (serial::IOException &e){RCLCPP_ERROR(this->get_logger(), "Unable to send data through serial port"); //如果发送数据失败,打印错误信息}return true;
}int main(int argc, char const *argv[])
{/* code */rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<SerialTest>("first_test_serial"));rclcpp::shutdown();return 0;
}

4、修改CMakeLists.txt,添加serial依赖。完整的CMakeLists.txt文件如下

cmake_minimum_required(VERSION 3.8)
project(ros2_demo)# Default to C99
if(NOT CMAKE_C_STANDARD)set(CMAKE_C_STANDARD 99)
endif()# Default to C++14
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 14)
endif()if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(serial REQUIRED)include_directories(include)add_executable(serialtest src/serial_test.cpp)
target_link_libraries(serialtest serial)
ament_target_dependencies(serialtest rclcpp std_msgs serial)#DIRECTORY:将指定目录中的文件和子目录复制到安装目录。
install(DIRECTORY include/ DESTINATION include )install(DIRECTORY launchDESTINATION share/${PROJECT_NAME} 
)#TARGETS:安装指定的目标(可执行文件、库文件等)
install(TARGETS serialtest DESTINATION lib/${PROJECT_NAME}) if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_export_include_directories(include)
ament_package()

5、编译ros源码

colcon build --packages-select ros2_demo
source install/setup.bash   

6、运行

ros2 run ros2_demo serialtest

注意:直接运行该serialtest可执行文件,会报找不到libserial.so动态库。需要把build目录下的serialtest可执行文件复制到install/ros2_demo/lib/ros2_demo/目录下的替换该可执行文件。(因为发现build目录下的可执行文件可以正常链接到动态库。而intall下可执行文件没能正常链接,暂时不知道什么原因,待解决。)

这篇关于ros2中创建工程,访问serial串口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/916618

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

MyBatisX逆向工程的实现示例

《MyBatisX逆向工程的实现示例》本文主要介绍了MyBatisX逆向工程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录逆向工程准备好数据库、表安装MyBATisX插件项目连接数据库引入依赖pom.XML生成实体类、