MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯

2023-05-16

目录

  • MANIFOLD 2-G开发笔记
    • 1 项目描述
    • 2 遇到的问题
    • 3 解决方案
    • 4 示例代码
    • 5 注意事项
    • 6 资源附件
    • 6 运行与调试

MANIFOLD 2-G开发笔记

本博客内容将记录MANIFOLD 2-G 开发过程中遇到的问题及解决方案,用于与大家交流。

MANIFOLD 2-G(秒算2-G) 是大疆推出的高性能计算平台,其主要用于DJI行业无人机的开发,但因其小巧的体积,强大的计算力,也可对其他单片机进行开发。

1 项目描述

利用 MANIFOLD 2-G(秒算2-G) 中ROS通信编程,实现对 Arduino Mega 单片机的控制。(该方法应该也适用于其他类似单片机)

最近的一个项目需要利用 MANIFOLD 2-G(秒算2-G) 实现对 Arduino Mega 单片机的控制。具体来说就是:MANIFOLD 2-G(秒算2-G) 作为上位机发布指令, Arduino Mega 单片机作为下位机接收。Arduino 系列单片机最简单的通讯方式就是TTL串口通讯 ,可通过USB转串口或直接接入TX、RX引脚进行。而 MANIFOLD 2-G(秒算2-G) 带有USB接口,于是考虑通过USB转串口进行。

在进行 MANIFOLD 2-G(秒算2-G) 调试前, Arduino Mega 的程序已经调试完毕,通信协议如下:串口数据接受到字符 “1”,“2”,“3”,“4” ,“0”后,会作出相应响应,控制Hybrid_bot机器人chassis部分进行前、后、左、右( “1”,“2”,“3”,“4” )的运动,以及停止(“0”)。

本文将只讨论MANIFOLD 2-G(秒算2-G)Arduino Mega 的控制。

2 遇到的问题

Arduino Mega 利用USB线接入 MANIFOLD 2-G(秒算2-G),在终端输入:

  ls /dev | grep tty*

发现找不到对应的串口设备,又搜集了一些资料,发现MANIFOLD 2-G(秒算2-G) 不带USB转串口的驱动,搜索各类资源也无法成功安装,邮件联系了DJI技术支持,至今还没得到有价值的信息,问题也一直没有解决。

也请DJI技术人员看到这篇博文能给我提供一点技术支持。

3 解决方案

既然无法使用USB转串口,能不能直接使用串口呢?带着这个疑问,进行了新的尝试。

MANIFOLD 2-G(秒算2-G) 自带两个UART串口,理论上是可以进行通讯的,其官方提供的使用说明如下:
MANIFOLD 2 UART接口图 来源:DJI使用说明
这里,我们使用UART1接口,对应的设备名称是ttyTHS2,这个名称后边程序会用到。
(P.S. 我尝试过UART0接口,但不好用。可能UART0是默认调试接口,还得改设置。但UART1插上就可以用。)

接线也十分简单,使用MANIFOLD 2-G(秒算2-G) 自带UART转3P杜邦线,注意MANIFOLD 2-G(秒算2-G) 的TXD与 Arduino Mega的RX相接,RXD与TX相接,GND相接即可。

4 示例代码

这里写了两个带注释cpp文件:(1) chassis_cmd.cpp(2) chassis_driver.cpp,供参考。

代码实现功能如下:开启两个ROS节点,进行ROS话题编程。Publisher用于接收来自键盘的指令,发布给Subscriber。Subscriber判断消息内容,并根据对应内容向串口设备发出命令。

(1) chassis_cmd.cpp

/*
此程序作为Hybrid_bot机器人chassis命令的Publisher
用于发布名为chassis_cmd的topic
ROS节点名为:chassis_cmd
*/

#include <ros/ros.h>
#include <std_msgs/Int16.h>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "chassis_cmd");//创建ROS节点,名为:chassis_cmd
  ros::NodeHandle n;//创建节点句柄
  ros::Publisher chassis_cmd_pub = n.advertise<std_msgs::Int16>("chassis_cmd", 1000);//创建一个名为chassis_cmd_pub的Publisher,发布名为chassis_cmd的topic,消息类型为std_msgs::Int16,暂存队列长度为1000
  ros::Rate loop_rate(10);//设置循环频率为10Hz(100ms/次)
  while (ros::ok())
 {  
    std_msgs::Int16 cmd;//初始化std_msgs::Int16类型的消息变量cmd
    std::cout << "input cmd:" << std::endl;//打印一条提示性语句
    std::cin  >> cmd.data;//等待键盘输入为cmd.data赋值
    chassis_cmd_pub.publish(cmd);//发布消息cmd
    ros::spinOnce();//循环等待回调函数
    loop_rate.sleep();//按照循环频率延时
  }
 return 0;
 }
 

代码小结:
这段代码通用性较强,可作为用于接收来自键盘指令的Publisher的例程。

(2) chassis_driver.cpp

/*
此程序作为Hybrid_bot机器人chassis命令的Subscriber
用于接收名为chassis_cmd的topic并利用回调函数sub_CB将对应命令发布到串口设备
ROS节点名为:chassis_driver
*/

#include <ros/ros.h>
#include <std_msgs/Int16.h>
#include <serial/serial.h>//MANIFOLD2不带这个库文件,需要自己下载安装一下

serial::Serial ser; //声明串口对象 

void sub_CB(const std_msgs::Int16 &flag_tmp)//消息回调函数,收到消息后会进入。这里的&flag_tmp与chassis_cmd.cpp中cmd变量的类型需一致,均需要为std_msgs::Int16
{

    if(flag_tmp.data == 1)
    {
        ser.write("1");     //前进
        ROS_INFO("chassis go forward");
    }
    else if(flag_tmp.data == 2)
    {
        ser.write("2");   //后退
        ROS_INFO("chassis go back");
    }
    else if(flag_tmp.data == 3)
    {
        ser.write("3");   //左转
        ROS_INFO("chassis turn left");
    }
    else if(flag_tmp.data == 4)
    {
        ser.write("4");   //右转
        ROS_INFO("chassis turn right");
    }
    else
    {
 	ser.write("0");   //停止
        ROS_INFO("chassis stop");
    }
}

int main (int argc, char **argv)
{
  ros::init(argc, argv, "chassis_driver");//创建名为chassis_driver的ROS节点
  ros::NodeHandle n;//创建节点句柄
  ros::Subscriber sub=n.subscribe("chassis_cmd",1,sub_CB);//创建一个名为sub的Subscriber,订阅名为chassis_cmd的topic,注册回调函数sub_CB

    try 
    { 
    //设置串口属性,并打开串口 
        ser.setPort("/dev/ttyTHS2"); //MANIFOLD2 UART1 串口名称
        ser.setBaudrate(9600); //设置波特率
        serial::Timeout to = serial::Timeout::simpleTimeout(1000); 
        ser.setTimeout(to); 
        ser.open(); 
    } 
    catch (serial::IOException& e) 
    { 
        ROS_ERROR("Unable to open the chassis port "); 
        return -1; 
    } 

    //检测串口是否已经打开,并给出提示信息 
    if(ser.isOpen()) 
    { 
        ROS_INFO("chassis serial port initialized"); 
    } 
    else 
    { 
        return -1; 
    } 
  ros::Rate loop_rate(10);//循环频率10ms
  ros::spin();//循环等待回调函数
  //exit
  return 0;
}

代码小结:
这段代码在本项目中作为Subscriber,接受来自Publisher的指令后控制Hybrid_bot机器人chassis部分的Arduino Mega 单片机,主函数可作为Subscriber和串口通讯的例程。 sub_CB函数中的内容可稍作修改应用在自己的串口设备上。

5 注意事项

1、别忘了 配置CMakeLists.txt 和 package.xml,这应该是ROS基础,就不加赘述了,如果和笔者使用同样的设备又不想自己配置,可以直接下载提供的资源。
2、 MANIFOLD2不带<serial/serial.h>库文件,需要自己下载安装一下,使用如下命令。

sudo apt-get install ros-kinetic-serial  #ros为Kinect版本,其他版本对应修改

P.S. 如果说使用此命令报404错误,可能是软件源的问题,可以上网查教程折腾,这里我直接找到404上不去的那个网站链接,直接下载deb文件,如serial库http://packages.ros.org/ros/ubuntu/pool/main/r/ros-kinetic-serial/
注意对应好自己设备的版本,比如MANIFOLD2-C就是amd64的,而MANIFOLD2-G就是arm64的。

如果不想自己下载,可以直接下载提供的资源。

6 资源附件

附件下载地址:
下载地址
https://download.csdn.net/download/weixin_44037313/12691728
附件清单:
1、Manifold_2_User_Guide_v1.0_CHS.pdf
2、下载好的<serial/serial.h>库文件安装包 ros-kinetic-serial_1.2.1-0xenial-20191214-125614+0000_arm64.deb,可在文件保存目录下启动终端,使用如下命令进行安装。(只适用于MANIFOLD2-G)

sudo dpkg -i xxx.deb //是安装包的准确名称

3、功能包hybrid_bot,包含chassis_cmd.cpp、chassis_driver.cpp及适用于Manifold2-G的CMakeLists.txt 和 package.xml配置文件。

6 运行与调试

将功能包hybrid_bot放置在工作空间中,在工作空间根目录下使用命令:

catkin_make

进行编译,可在工作空间的/devel/lib/hybrid_bot文件夹下生成两个可执行文件chassis_driver和chassis_cmd。
在桌面启动终端,启动ROS:

roscore

接入设备后,另起终端,启动Subscriber节点:

rosrun hybrid_bot chassis_driver

再另起终端,启动Publisher节点

rosrun hybrid_bot chassis_cmd

至此,可以实现键盘控制。

通过在Publisher节点终端键盘输入 1 2 3 4 等字符,即可在Subscriber节点终端收到反馈,同时Arduino Mega 将被控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯 的相关文章

随机推荐

  • 【HAL库】HAL库STM32cubemx快速使用

    文章目录 整体框图一 基础工程1 新建工程2 配置RCC3 配置SYS4 工程设置5 生成代码6 keil设置下载 amp 复位 二 必备外设1 目录规范2 LED2 RTC3 USART4 KEY 三 其他外设1 OLED xff08 模
  • 【HAL库】STM32+ESP8266+Onenet+MQTT,极简工程,hal库移植。

    ESP8266 43 Onenet 43 MQTT 1 导入 c h文件 xff08 不再赘述 xff0c 详细见LED部分 xff09 2 Cubemx配置3 修改 c h 文件4 测试 ESP8266通过MQTT协议连接Onenet 从
  • 【HAL库】BMP180气压传感器+STM32,hal库移植

    BMP180气压传感器 43 STM32 1 导入 c h文件 xff08 不再赘述 xff0c 详细见LED部分 xff09 2 Cubemx配置3 修改 h 文件4 测试 将BMP180从标准库移植到HAL库 模拟IIC 极简工程代码如
  • 【硬件】嵌入式板卡硬件电路设计、焊接

    文章目录 嵌入式板卡电路 框图常用焊接工具和焊接操作 框图一 元器件 有极性 1 肖特基二极管2 钽电容3 三极管4 MOS5 LED6 SMAJ5 0CA xff08 TVS管 xff09 8 SRV05 4 xff08 ESD管 xff
  • C语言中的输入输出函数

    一 字符数据输入输出函数 1 putchar xff0c 输出一个字符 include lt stdio h gt int main char cChar1 cChar2 cChar3 cChar4 cChar1 61 39 H 39 cC
  • printf的执行顺序&++i与i++的区别

    问题的由来 xff1a 在学习C语言预处理命令时看到这样一段 https www cnblogs com clover toeic p 3851102 html span class token macro property span cl
  • Traceback (most recent call last): File “/home/myp4/.local/bin/pip“, line 5, in <module> from

    https blog csdn net weixin 41135864 article details 89817343 Traceback most recent call last File home myp4 local bin pi
  • sys.stderr.write(f“ERROR: {exc}”)

    https www cjavapy com article 1701
  • 为什么PBFT需要三阶段

    首先 xff0c 第一阶段是预提议 xff08 pre prepare xff09 xff0c 这一阶段的主要原因是使用领导可以降低通信复杂度 xff0c 但是我对其没了解 xff0c 就不瞎说了 接着是提议 xff08 prepare x
  • 文件的自定义包发送接收

    需求 对一个特定的文件进行分片发送 xff0c 构造数据包 xff0c 发送数据包 xff0c 接收数据包并提取有效数据 xff0c 对数据组合还原为原文件 设计 当前 xff0c 基于socket的网络编程已成为当今不可替代的编程方法 x
  • 阿里云服务器图形化界面

    https blog csdn net qq 43264202 article details 119578968
  • 安卓开放端口

    https blog csdn net weixin 39737831 article details 109965587
  • Ubuntu14.04 支持ESM

    https discourse ubuntu com t ubuntu advantage client 21788
  • 开启关闭ICMP

    echo request http www xoxxoo com index index article id 780 html redirect https blog csdn net weixin 39684454 article de
  • AD使用技巧

    AD快捷键 快捷键要处在英文模式的情况下才可以使用 xff1a AD测量快捷键 xff1a R AD对齐快捷键 xff1a A AD切换单位快捷键 xff1a Q AD改变栅格快捷键 xff1a G AD视图配置快捷键 xff1a L AD
  • 多传感器融合框架搭建

    架构 src include apps xff1a 节点文件 front end node cpp 前端节点data pretreat node cpp 数据预处理节点back end node cpp 后端节点loop closing n
  • 多传感器融合框架-ESKF

    架构 基本同图优化框架差不多 内容简述 数据预处理节点 订阅imu原始数据 xff0c gnss原始数据 xff0c 完成数据时间戳同步 点云畸变补偿发布如下消息 畸变补偿后的点云 synced cloudgnss里程计 synced gn
  • OpenCV笔记4.3

    C 43 43 读取目录下所有文件名称 1 包含头文件 96 span class token macro property span class token directive hash span span class token dir
  • 半小时内实现Esp32-Cam模型训练和图像识别

    Esp32 Cam图像识别 一 网页显示视频流1 Linux式例程2 MicroPython式例程步骤1 下载Thonny步骤2 烧录Esp32 Cam固件步骤3 运行相应代码 3 Arduino式例程步骤1 下载Arduino步骤2 安装
  • MANIFOLD 2-G开发 之 利用ROS话题编程实现UART1串口通讯

    目录 MANIFOLD 2 G开发笔记1 项目描述2 遇到的问题3 解决方案4 示例代码5 注意事项6 资源附件6 运行与调试 MANIFOLD 2 G开发笔记 本博客内容将记录MANIFOLD 2 G 开发过程中遇到的问题及解决方案 xf