如何通过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
相关产品推荐
相关产品推荐

