You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Rosserial从Jetson Nano向Arduino Uno发送字符串以实现舵机控制?

Jetson Nano(ROS Melodic)与Arduino Uno字符串通信实现方案

1. 先在Jetson上搭好rosserial环境

  • 安装rosserial相关包:
    sudo apt-get install ros-melodic-rosserial-arduino ros-melodic-rosserial
  • 把ROS的Arduino库同步到Arduino IDE的库目录:
    rosrun rosserial_arduino make_libraries.py ~/Arduino/libraries
    (如果你的Arduino库目录不是~/Arduino/libraries,换成自己的实际路径)

2. 编写Arduino端的ROS订阅代码

打开Arduino IDE新建sketch,粘贴以下代码(要控制舵机的话,取消对应注释即可):

#include <ros.h>
#include <std_msgs/String.h>
// 控制舵机需取消下面两行注释
// #include <Servo.h>
// Servo servo;

ros::NodeHandle nh;

// 收到Jetson发来的字符串后触发的回调函数
void handleReceivedString(const std_msgs::String& msg) {
  // 解析字符串为角度值(假设字符串是纯数字格式,比如"120")
  int targetAngle = atoi(msg.data);
  // 控制舵机转动,取消注释并调整引脚
  // servo.write(targetAngle);
  Serial.println(msg.data); // 串口打印调试用
}

// 订阅名为"angle_command"的话题,需和Jetson端发布的话题一致
ros::Subscriber<std_msgs::String> sub("angle_command", &handleReceivedString);

void setup() {
  nh.initNode();
  nh.subscribe(sub);
  // 舵机初始化,取消注释并调整引脚
  // servo.attach(9);
  Serial.begin(57600); // 波特率要和Jetson端设置一致
}

void loop() {
  nh.spinOnce();
  delay(10);
}

写完后将代码上传到Arduino Uno。

3. 编写Jetson端的ROS发布代码

  • 先创建ROS功能包(如果没有现成的包):
    catkin_create_pkg serial_comm std_msgs roscpp
  • 进入功能包的src目录,新建string_publisher.cpp文件,内容如下:
#include <ros/ros.h>
#include <std_msgs/String.h>

int main(int argc, char **argv) {
  ros::init(argc, argv, "string_publisher");
  ros::NodeHandle nh;

  // 发布名为"angle_command"的话题,需和Arduino端订阅的话题一致
  ros::Publisher cmd_pub = nh.advertise<std_msgs::String>("angle_command", 10);

  ros::Rate loop_rate(10); // 10Hz的发布频率,可按需调整

  while (ros::ok()) {
    std_msgs::String msg;
    // 替换成你自己计算得到的字符串
    // 比如从视觉算法、运动规划模块获取角度后转成字符串
    msg.data = "90"; // 示例:发送90度转动指令
    cmd_pub.publish(msg);

    ros::spinOnce();
    loop_rate.sleep();
  }

  return 0;
}
  • 修改功能包的CMakeLists.txt,添加编译规则:
add_executable(string_publisher src/string_publisher.cpp)
target_link_libraries(string_publisher ${catkin_LIBRARIES})
  • 编译整个工作空间:
    cd ~/catkin_ws && catkin_make

4. 启动整套通信流程

  • 第一步,启动ROS核心:roscore
  • 第二步,启动rosserial串口节点(注意串口名,通常是/dev/ttyACM0或/dev/ttyUSB0,波特率和代码设置一致):
    先给串口权限:sudo chmod 777 /dev/ttyACM0
    再启动节点:rosrun rosserial_python serial_node.py /dev/ttyACM0 _baud:=57600
  • 第三步,启动Jetson的发布节点:rosrun serial_comm string_publisher

5. 调试验证

  • 用rostopic echo /angle_command查看Jetson发布的字符串是否正确
  • 打开Arduino IDE的串口监视器,确认收到的内容和发送的一致
  • 如果舵机不动,检查:舵机接线是否正确、是否接了外部电源(Arduino的5V可能带不动舵机)、角度值是否在0-180范围内

内容的提问来源于stack exchange,提问作者jino joy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:25:52