找回密码
 注册
关于网站域名变更的通知
查看: 363|回复: 1
打印 上一主题 下一主题

硬件平台搭建及arduino控制

[复制链接]
  • TA的每日心情
    开心
    2020-7-31 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2020-8-11 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    引言
    想做一个自动驾驶的demo,用于算法的验证和展示。
    目前完成了车辆平台的搭建和电机控制,后续会陆续更新其他部分:路径规划、激光slam建图与定位,语义地图的构建,控制算法等等。

    硬件平台搭建:
    计算平台
    • Jetson TX2
    • arduino-uno9 p( l& l; }: {$ |7 g8 c% r3 Q
    车载平台
    • RC-car
      2 G; D: ~( ?% a
    传感器
    • velodyne-16
    • Razor-9dof-imu
      9 I. m6 O  ?* h- V! G) q
    整个基本框架是Jetson TX2做上层感知,定位,路径规划的处理,arduino负责底层的电机控制。目标总体框架如下所示:

    arduino电机控制
    电机控制代码如下所示:
    #include <Servo.h>#include <ros.h>#include <geometry_msgs/Twist.h>class Car {public:    void initControler();    void ARMControler();    void writeToControler(int, int);    float limitMotor(int);    float limitServo(int);  private:    const int MOTOR_PIN = 10;    const int SERVO_PIN = 9;    const int MOTOR_MAX = 2000;    const int MOTOR_MIN = 1600;    const int MOTOR_STOP = 1300;    const int STEER_MIN = 1100;    const int STEER_MAX = 1900;    const int STEER_CENTER = 1500;    const int noAction = 0;    Servo motor;    Servo steering;};Car car;int motor_speed;int steer;volatile unsigned long dt;volatile unsigned long t0;ros::NodeHandle nh;geometry_msgs::Twist vel_angular_back;void controlCallback(const geometry_msgs::Twist& ecu) {    car.writeToControler(ecu.linear.x, ecu.angular.z);    vel_angular_back.linear.x = ecu.linear.x;    vel_angular_back.angular.z = ecu.angular.z;}ros::Publisher ecu_back("ecu_back", &vel_angular_back);ros::Subscriber<geometry_msgs::Twist> sub_control("control", controlCallback);/** * ARDUINO INITIALIZATION */void setup() {    car.initControler();    car.armControler();    t0 = millis();        nh.getHardware()->setBaud(57600);    nh.initNode();        nh.advertise(ecu_back);    nh.subscribe(sub_control);}/** * ARDUINO MAIN lOOP */void loop() {    dt = millis() - t0;            ecu_back.publish(&vel_angular_back);        if (dt > 50) {        t0 = millis();        // to do    }        nh.spinOnce();}/** * CAR CLASS IMPLEMENTATION */void Car::initControler() {    motor.attach(MOTOR_PIN);    steering.attach(SERVO_PIN);}void Car::armControler() {    motor.writeMicroseconds(1500);    steering.writeMicroseconds(STEER_CENTER);    delay(3000);}float Car::limitMotor(int x) {    if (x == noAction) {        return MOTOR_STOP;    }    if (x > MOTOR_MAX) {        x = MOTOR_MAX;    } else if (x < MOTOR_MIN) {        x = MOTOR_MIN;    }    return x;}float Car::limitServo(int x) {    if (x == noAction) {        return STEER_CENTER;    }    if (x > STEER_MAX) {        x = STEER_MAX;    } else if (x < STEER_MIN) {        x = STEER_MIN;    }    return x;}void Car::writeToControler(int motor_speed, int steer) {    int motorCMD, servoCMD;    motorCMD = car.limitMotor(motor_speed);    servoCMD = car.limitServo(steer);    //motorCMD = motor_speed;    //servoCMD = steer;    motor.writeMicroseconds(motorCMD);    steering.writeMicroseconds(servoCMD);}8 k$ T- f5 Y& h; i+ c' M# [! O
    为了完成arduino电机控制与TX2的通讯,需要在TX2上面搭建一些环境:
    1 安装arduino
    sudo apt-get install arduino) q! I  |# ~) x
    2 安装rosserial-arduino
    用途:用于arduino的ROS通讯桥接
    二进制方式安装在ROS工作站(推荐)
    sudo apt-get install ros-indigo-rosserial-arduinosudo apt-get install ros-indigo-rosserialrospack profile- o! b9 P* ]& M, P% J
    源码方式安装在ROS工作站
    cd <ws>/srcgit clone https://github.com/ros-drivers/rosserial.gitcd <ws>catkin_make
    ' o) o" S; Y- e4 _9 V( V, u' O
    3 安装ros_lib到Arduino IDE开发环境
    上面的安装会得到ros_lib,它需要复制到Arduino的开发环境,以启用Arduino与ROS通讯。
    linux系统下,生成ros_lib到Linux下的Arduino库目录sketchbook/libraries(一般在用户的home目录下)
    cd <sketchbook>/librariesrm -RF ros_lib #如之前有,可以先删除rosrun rosserial_arduino make_libraries.py ., C  @. U2 D4 \
    然后,可以打开arduino IDE,找到file-examples-ros_lib是否存在,如果这一不没安装好的话,会找不到ros.h的头文件
    4 运行ROS-arduino
    写好arduino的代码之后,就可以试着运行看看
    运行roscore
    roscore
    6 W  _4 O2 m4 _- g8 e0 T% C" M5 S
    新终端运行,/dev/ttyUSB0为Arduino设备,设备可能是/dev/ttyUSB0,也可能是/dev/ttyACM0,需要自己确认
    rosrun rosserial_python serial_node.py /dev/ttyUSB0rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0 //这个也可以" e( [1 D2 E: N5 F# ^1 t& t, ]- @& w
    然后就可以在ROS中发布转向速度的话题消息,arduino节点接收消息后,完成电机控制。

    6 R% U: {) w5 V. x$ D

    该用户从未签到

    2#
    发表于 2020-8-11 11:06 | 只看该作者
    上面的安装会得到ros_lib,它需要复制到Arduino的开发环境,以启用Arduino与ROS通讯。 linux系统下,生成ros_lib到Linux下的Arduino库目录sketchbook/libraries(一般在用户的home目录下) cd <sketchbook>/librariesrm -RF ros_lib #如之前有,可以先删除rosrun rosserial_arduino make_libraries.py . 然后,可以打开arduino IDE,找到file-examples-ros_lib是否存在,如果这一不没安装好的话,会找不到ros.h的头文件
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-9 17:09 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表