Linux中ROS风格的物理PWM引脚控制,C++代码

2023-05-16

背景:拿到一个舵机,一个安装了linux和ROS的“小黑盒子”以及一个干干净净啥也不会的脑子,然后我从零开始学的,总算找到了个能操作舵机的程序。现在只是能跑的状态,提供一种思路,之后我还得大改代码。
注意:文件的读写需要权限,在运行节点之前,需要

su root

需要知道哪些:
舵机控制原理
ROS话题通信
对应开发板的引脚定义
(什么行业规范,我不知道,能跑就行)

因为Linux里面一切都是文件,所以驱动爪子只需要改对应文件的值就可以了。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include "ros/ros.h"
#include "std_msgs/Int32.h"

static char pwm_path[100];
static int pwm_config(const char *attr, const char *val)    //配置PWM
{
    char file_path[200];
    int len;
    int fd;
    sprintf(file_path, "%s/%s", pwm_path, attr);
    if (0 > (fd = open(file_path, O_WRONLY, S_IWUSR))) {
        perror("open error");
        return fd;
    }
    len = strlen(val);
    if (len != write(fd, val, len)) {
        ROS_INFO("erro in %s", attr);
        perror("write error");
        close(fd);
    return -1;
    }
    close(fd); //关闭文件
    return 0;
}
 
bool drive(const std_msgs::Int32::ConstPtr &duty){
    char duty_s[16];//将输入转换为字符串
    int legal_duty = 1000000;
    duty->data < 1000000 ? legal_duty = 1000000 : duty->data > 1800000? legal_duty = 1800000 : legal_duty = duty->data;
    sprintf(duty_s, "%d", legal_duty);
    if (pwm_config("duty_cycle", duty_s)){
        ROS_INFO("Change duty cycle failed.");
        return false;
    }
    ROS_INFO("duty:<%s>",duty_s);
    return true;
}
 
int main(int argc, char *argv[])
{
    /*启动pwm节点,需要传入三个参数*/
    /* 校验传参 */
    if (4 != argc) {//4 20,000,000 20000000 单位:纳秒 //1ms = 1,000,000 ns
    // duty 500,000 - 2,500,000 但是咱们的爪子转角并不能让舵机转满,所以最好是1,000,000 - 1,800,000
        ROS_INFO("rosrun gripper gripper_driver <id> <period> <duty>\nlegal_duty:1000000 - 1800000");
        exit(-1);
    }
    /* 打印配置信息 */
    ROS_INFO("PWM config: id:<%s>, period:<%s>, duty:<%s>\n",
    argv[1], argv[2],
    argv[3]);
    /* 导出 pwm */
    sprintf(pwm_path, "/sys/class/pwm/pwmchip%s/pwm1", argv[1]);
    if (access(pwm_path, F_OK)) {//如果 pwm1 目录不存在, 则导出
        char temp[100];
        int fd;
        sprintf(temp, "/sys/class/pwm/pwmchip%s/export", argv[1]);
        if (0 > (fd = open(temp, O_WRONLY, S_IWUSR))) {
            perror("open export error");
            exit(-1);
        }
        if (1 != write(fd, "1", 1)) {//导出 pwm
            perror("write export error");
            close(fd);
            exit(-1);
        }
        close(fd); //关闭文件
    }
    /* 配置 PWM 周期 */
    if (pwm_config("period", argv[2]))
        exit(-1);
    /* 配置占空比 */
    if (pwm_config("duty_cycle", argv[3]))
        exit(-1);
    /* 使能 pwm */
    pwm_config("enable", "1");
    /*配置完成*/
    ROS_INFO("PWM OK");

    /*订阅*/
    setlocale(LC_ALL,"");//解决中文乱码问题
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"gripper_driver");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::Int32>("gripper_duty",2,drive);
    //5.处理订阅的消息(回调函数)
    ros::spin();//循环读取接收的数据,并调用回调函数处理
    /* 退出程序 */
    exit(0);

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

Linux中ROS风格的物理PWM引脚控制,C++代码 的相关文章

随机推荐

  • Linux usb 3. Host 详解

    文章目录 1 简介2 Usb Core 驱动设备模型2 1 Usb Device Layer2 1 1 device struct usb device 2 1 2 driver struct usb device driver 2 1 3
  • Linux usb 4. Device 详解

    文章目录 1 简介2 Platform Layer2 1 Platform Device2 2 Platform Driver 3 UDC Gadget Layer3 1 Gadget Bus3 2 Gadget Device3 2 1 E
  • Linux USB (目录)

    1 USB 总线简介 2 USB 协议分析 3 USB Host 详解 4 USB Device 详解 5 usbip USB Over IP 使用实例 6 USB HC UDC 测试 7 Linux 配置 ADBD
  • Linux usb 5. usbip (USB Over IP) 使用实例

    文章目录 0 简介1 Server 配置2 Client 配置参考资料 0 简介 USB Over IP 是一种应用很多的场景 xff0c 目前已经有现成的解决方案 usbip linux 和 windows 环境下都有配套软件 xff0c
  • 最全随机抽样算法(从N个数中抽取M个等)集合

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 从N个数中等概率抽取M个数 从N个样本
  • Linux usb 6. HC/UDC 测试

    文章目录 1 背景介绍2 Device gadget zero 2 1 96 gadget zero 96 创建2 2 SourceSink Function2 3 Loopback Function 3 Host usbtest ko 3
  • Linux usb 7. Linux 配置 ADBD

    文章目录 1 简介2 ADBD 源码3 Gadget Device 配置3 1 functionfs3 2 legacy 方式配置 functionfs3 3 configfs 方式配置 functionfs3 4 adb 使用配置 参考资
  • HW-RTOS 概述

    文章目录 1 背景介绍1 1 OS 实时难题1 2 Linux 实时补丁1 3 Xenomai 43 Linux 双内核1 4 HW RTOS1 5 More 2 优化点1 xff1a API2 1 原理介绍2 1 1 Software A
  • RISCV MMU 概述

    1 背景简介 Linux 内存管理包含很多内容 xff0c 主要知识点可以参考 Linux Mem 本文只描述其中的一个知识点 Paging and MMU 本文以全志 D1 为例 xff0c 包含了平头哥出品的一颗 Riscv64 的 C
  • 主流 RTOS 评估

    1 RT Thread RT Thread 是国内出产的一款非常优秀的 RTOS 它和 FreeRTOS uCos 等经典 RTOS 最大的不同是 xff1a 它不仅仅是一个实时内核 xff0c 还具备丰富的中间层组件 它提供了一个完整的软
  • Linux mem 2.8 Kfence 详解

    1 原理介绍 Kfence Kernel Electric Fence 是 Linux 内核引入的一种低开销的内存错误检测机制 xff0c 因为是低开销的所以它可以在运行的生产环境中开启 xff0c 同样由于是低开销所以它的功能相比较 KA
  • Linux Phy 驱动解析

    文章目录 1 简介2 phy device2 1 mdio bus2 2 mdio device2 3 mdio driver2 4 poll task2 4 1 自协商配置2 4 2 link 状态读取2 4 3 link 状态通知 3
  • 程序媛工作几年后的感受!体验?

    黑客技术 点击右侧关注 xff0c 了解黑客的世界 xff01 Java开发进阶 点击右侧关注 xff0c 掌握进阶之路 xff01 Python开发 点击右侧关注 xff0c 探讨技术话题 xff01 作者 xff1a hq nuan 来
  • ubuntu 通过 apt-get 安装软件失败时的解决方案

    最近在 vmware上的ubuntu系统下安装 软件时出现安装失败情况 xff0c 在网上搜了一通 xff0c 终于找到了解决方案 遇到的问题和解决方案如下 xff1a 一 apt get install vim二 apt get upda
  • JAVA自学之路 三:要动手

    原创 尚学堂科技 马士兵老师 JAVA自学之路 三 要动手 转载请注明出处 http www bjsxt com zixue zixuezhilu 3 html 无论如何 xff0c 请坚持不懈的动手实验 xff01 学习Java要动手 x
  • Eigen库的安装

    运行命令 xff1a sudo apt get install libeigen3 dev 假设默认安装到 usr local include里 可在终端中输入locate eigen3查看位置 xff0c 若实际中默认安装到了 usr i
  • 搭建自己的简易服务器(公网)

    大部分时候做嵌入式开发的 xff0c 如果是wifi 可以工作在局域网 xff0c 至于物联网设备 xff0c 插手机卡的那种就需要公网ip 测试起来相对比较麻烦 xff0c 电信宽带用户有的可以映射使用 xff0c 但是ip会改变 xff
  • CPP服务器08--http请求响应实现

    http服务设计 对于静态页面服务器来说 xff0c 其工作流程如下 xff1a 接收客户端消息 解析出http请求报文 业务逻辑 xff0c 拼装响应报文 发送给客户端结果 http连接类 设计目标 xff1a 将客户端唯一文件描述符封装
  • Linux C Socket 编程

    以下内容转载自 https www cnblogs com PikapBai p 13964866 html 闪念基因2020 11 20 12 01 20 本文作者 xff1a 她爱喝水 本文链接 xff1a https www cnbl
  • Linux中ROS风格的物理PWM引脚控制,C++代码

    背景 xff1a 拿到一个舵机 xff0c 一个安装了linux和ROS的 小黑盒子 以及一个干干净净啥也不会的脑子 xff0c 然后我从零开始学的 xff0c 总算找到了个能操作舵机的程序 现在只是能跑的状态 xff0c 提供一种思路 x