ros2串口通信

前期准备

登录github下载代码https://github.com/chouer19/eqProj

新建工程

cd ~/dev_ws/src/cpp_header/include/cpp_header

添加头文件

touch minimal_publisher.hpp

打开github上下载的文件夹,找到eq-hmi20191219/header/drive中的dri_serialport.hpp,将其中的内容复制到打开的文件中

添加源文件

cd ~/dev_ws/src/cpp_header/src
touch minimal_publisher.cpp

将eq-hmi20191219/sources/drive中的dri_serialport.cpp中的内容复制到打开的文件中

添加节点源文件

cd ~/dev_ws/src/cpp_header/src
touch minimal_publisher_node.cpp

将以下内容复制到打开的文件中

#include "cpp_header/minimal_publisher.hpp"
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"


int fp;
unsigned char Msg[128] = { 0 };
const char* constc = nullptr;
Serial sp;
class TopicSuscribe01 : public rclcpp::Node
{
public:
    TopicSuscribe01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(),"我是%s,订阅话题为:/order.",name.c_str());
        command_subscribe_ = this->create_subscription<std_msgs::msg::String>("order",10,std::bind(&TopicSuscribe01::command_callback,this,std::placeholders::_1));
    }
private:
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr command_subscribe_;
    void command_callback(const std_msgs::msg::String::SharedPtr msg)
    {
        double speed = 0.0f;
        if(msg->data == "6666")
        {
            speed = 0.2f;

        }
        RCLCPP_INFO(this->get_logger(),"收到的[%s]指令,发送速度%f",msg->data.c_str(),speed);
        
        constc = msg->data.c_str();
        
        sp.WriteData(fp,constc,10);
    }

};


int main(int argc, char **argv)
{
    /* code */
    rclcpp::init(argc, argv);
    /*产生一个Wang2的节点*/
    // auto node = std::make_shared<rclcpp::Node>("pub_serial");
    auto node = std::make_shared<TopicSuscribe01>("topic_subscribe_01");
    // 打印一句自我介绍
    // int fp;
    // Serial sp;
    sp.BaudRate(115200);
    fp = sp.OpenPort(COM3);
    if(fp>0){
      RCLCPP_INFO(node->get_logger(), "serial success!.");
    }
    sp.WriteData(fp,"1024",10);
    // cout<<fp<<endl;

    RCLCPP_INFO(node->get_logger(), "大家好,我是topic_subscribe_01.");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    sp.ClosePort(fp);
    return 0;
    
    return 0;
}

修改package.xml和CMakeLists.txt

先打开package.xml

cd dev_ws/src/cpp_header/src
gedit package.xml

将以下两行代码

<depend>rclcpp</depend>
<depend>std_msgs</depend>

添加到如图位置,添加后效果如下图

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

再修改CMakeLists.txt

gedit CMakeLists.txt

将下面两行代码添加进CMakeists.txt

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

添加效果如下

find_package(ament_cmake REQUIRED)

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

在刚刚添加的两行代码下方,添加以下两行可执行文件代码

include_directories(include)
add_executable(talker src/minimal_publisher_node.cpp src/minimal_publisher.cpp) 
ament_target_dependencies(talker rclcpp std_msgs)

效果如下

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

include_directories(include)
add_executable(talker src/minimal_publisher_node.cpp src/minimal_publisher.cpp) 
ament_target_dependencies(talker rclcpp std_msgs)

安装依赖

新建终端

cd ~/dev_ws/
rosdep install -i --from-path src --rosdistro galactic -y

编译执行

colcon build
source install/setup.bash
ros2 run cpp_header talker

(talker可以在CMakeists.txt修改可执行文件名)

打开虚拟串口

这里使用的是socat虚拟串口工具,没有安装的可以点击传送门 socat安装

socat -d -d pty,raw,echo=0 pty,raw,echo=0

在这里插入图片描述

根据提供的串口去minimal_publisher.cpp中设置对应串口号

 char *device;
    struct termios termios_old;
    int fd;
    switch(index)
    {
    case COM0:  device="/dev/ttyS0";  break;
    case COM1:  device="/dev/ttyS1";  break;
    case COM2:  device="/dev/ttyS2";  break;
    case COM3:  device="/dev/pts/3";  break;
    case ttyUSB0:  device="/dev/ttyUSB0";  break;
    case ttyUSB1:  device="/dev/ttyUSB1";  break;
    case ttyUSB2:  device="/dev/ttyUSB2";  break;
    default: device="/dev/ttyAMA2"; break;
    }

打开发布者

关于如何建立发布者,可以看我之前的文章ros2发布订阅
打开文件topic_publisher_01,修改话题名,和minimal_publisher_node.cpp一致

以下为topic_publisher_01.cpp内的修改,设置话题为order

public:
    // 构造函数,有一个参数为节点名称
    TopicPublisher01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
        // 创建发布者
        command_publisher_ = this->create_publisher<std_msgs::msg::String>("order", 17);
        // 创建定时器,500ms为周期,定时发布
        timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&TopicPublisher01::timer_callback, this));
    }

匹配minimal_publisher_node.cpp中的order

public:
    TopicSuscribe01(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(),"我是%s,订阅话题为:/order.",name.c_str());
        command_subscribe_ = this->create_subscription<std_msgs::msg::String>("order",10,std::bind(&TopicSuscribe01::command_callback,this,std::placeholders::_1));
    }

新建终端,启动发布者

cd ros2_ws
colcon build
source install/setup.bash
ros2 run example_topic_rclcpp topic_publisher_01

在这里插入图片描述

打开订阅者

新建终端

cd dev_ws
colcon build
source install/setup.bash
ros2 run cpp_header talker 

在这里插入图片描述

打开监听,查看是否有数据接收

新建终端
监听上文使用socat建立的另一个虚拟串口

cat < /dev/pts/4

在这里插入图片描述
可以看到,有数据传输。

ros2串口通信结束。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
串口通信ROS中是非常常见和重要的功能。下面是一些关于ROS串口通信的进阶知识: 1. 安装serial包:首先,你需要安装ROS的serial包。在终端中运行以下命令来安装:`sudo apt-get install ros-<your_ros_version>-serial` 2. 创建ROS节点:使用ROS中的串口通信,你需要创建一个ROS节点来处理串口数据。你可以使用C++或者Python编写节点。 3. 打开串口:在ROS节点中,你需要打开串口并进行配置。你可以使用serial包提供的函数来打开和配置串口。例如,在C++中,你可以使用`serial::Serial::open()`函数来打开串口,并使用`serial::Serial::setBaudrate()`函数来设置波特率。 4. 发送和接收数据:一旦打开了串口,你就可以通过串口发送和接收数据了。你可以使用serial包提供的函数来发送和接收字节流。例如,在C++中,你可以使用`serial::Serial::write()`函数来发送数据,并使用`serial::Serial::read()`函数来接收数据。 5. ROS消息和串口数据转换:通常,你可能还需要将串口数据转换为ROS消息,以便在ROS系统中进行处理。你可以根据你的需求创建自定义的ROS消息类型,并编写转换代码将串口数据转换为ROS消息。例如,在Python中,你可以使用`rospy.Publisher`来发布ROS消息。 6. ROS参数配置:为了方便地配置串口参数,你可以使用ROS参数服务器。你可以使用`rosparam`命令或者在launch文件中设置参数。这样,你就可以在运行节点时动态地配置串口参数。 这些是ROS串口通信的一些进阶知识。希望对你有帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值