目录
- 前期准备
- 新建工程
- 添加头文件
- 添加源文件
- 添加节点源文件
- 修改package.xml和CMakeLists.txt
- 安装依赖
- 编译执行
- 打开虚拟串口
- 打开发布者
- 打开订阅者
- 打开监听,查看是否有数据接收
前期准备
登录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)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<TopicSuscribe01>("topic_subscribe_01");
sp.BaudRate(115200);
fp = sp.OpenPort(COM3);
if(fp>0){
RCLCPP_INFO(node->get_logger(), "serial success!.");
}
sp.WriteData(fp,"1024",10);
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);
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串口通信结束。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)