农业机器人底盘使用手册概括与代码详解
一、全文概括
该手册是基于 ROS 系统(机器人操作系统)的农业机器人底盘使用指南,涵盖 13 大核心功能模块,适配 Jetson 系列开发板,主要用于农业场景中的移动控制、环境感知、特定作业(灌溉 / 授粉)等操作。核心信息与功能如下:
- 基础配置:提供 SSH/VNC 连接、热点网络等登录信息,是所有操作的前提;
- 核心控制:含键盘手动控制、车道线自动循迹、YOLO 目标识别联动控制,覆盖 “手动 - 半自动 - 全自动” 三种运动模式;
- 环境感知:支持雷达测距、摄像头图像采集与 WEB 预览,为自主决策提供数据;
- 硬件拓展:包含 5 自由度机械臂的控制(预设动作、自定义动作),以及智能灌溉、智能授粉两大农业场景 demo;
- 辅助工具:提供风扇启动(保障硬件散热)、资源监视器(查看 CPU/GPU 状态)等运维工具。
整体逻辑:以 ROS 话题通信为核心(如/cmd_vel控制底盘运动),通过 Launch 文件一键启动多节点,配合参数文件灵活配置,实现 “感知 - 决策 - 执行” 的完整机器人作业流程。
二、核心代码 / 指令通俗易懂详解
以下按功能模块,拆解关键指令、配置文件和代码,用 “作用 + 步骤 + 原理” 的方式解释,零基础也能理解。
(一)基础连接与环境准备
核心信息(必须记牢)
| 用途 | 信息 |
|---|---|
| SSH 登录 | 用户名:epaicar,密码:ncut1234 |
| 网络连接 | 热点:Talos_AiCAR,密码:ncut1234,主机 IP:192.168.20.100 |
| VNC 连接 | 密码:ncut1234(远程桌面控制用) |
作用:通过电脑 / 手机连接机器人主机,远程操作机器人(无需直接接显示器)。
(二)底盘运动控制(最核心模块)
1. 键盘手动控制(入门必备)
关键指令(分 2 步,需打开 2 个终端)
bash
运行
# 终端1:启动底盘底层驱动(ROS与硬件通信的桥梁)
roslaunch eprobot_start AIcar_joy.launch
# 终端2:启动键盘控制节点
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
代码 / 指令详解
- 第一步指令作用:
roslaunch是 ROS 的 “一键启动工具”,AIcar_joy.launch文件会自动启动 2 个核心功能:- ROS 与底盘控制器的串口通信节点(源码:
~/talos_ws/src/eprobot_start/script/ai_racecar.py); - 监听
/cmd_vel话题(机器人运动指令的 “信号通道”),将指令转换成硬件能识别的串口数据。
- ROS 与底盘控制器的串口通信节点(源码:
- 第二步指令作用:启动键盘控制程序,你按键盘上的方向键(如↑前进、←左转),程序会自动向
/cmd_vel话题发布运动指令,底层驱动接收后控制底盘动起来。
手动发布运动指令(进阶:不用键盘,直接用指令控制)
bash
运行
rostopic pub /cmd_vel geometry_msgs/Twist "linear:
x: 0.4 # 直行速度(正数前进,负数后退,范围0-1,越大越快)
y: 0.0 # 横向速度(农业机器人一般不用,固定0)
z: 0.0 # 垂直速度(忽略,底盘不会上下动)
angular:
x: 0.0 # 横滚角(忽略)
y: 0.0 # 俯仰角(忽略)
z: 2.0" # 转弯速度(正数左转,负数右转,范围0-3,越大转得越急)
- 原理:
rostopic pub是 ROS 中 “手动发布话题” 的指令,geometry_msgs/Twist是运动指令的数据格式(固定模板),只需改linear.x(直行)和angular.z(转弯)即可。
2. 车道线自动循迹
关键指令(分 2 步)
bash
运行
# 第一步:启动车道线识别(输出偏移量)
roslaunch velpub detect_line.launch
# 第二步:启动自动循迹控制(根据偏移量调整方向)
roslaunch velpub AIcar_move.launch
代码详解
-
第一步:车道线识别(
detect_line.py核心逻辑)python
运行
# 源码路径:~/talos_ws/src/velpub/scripts/detect_line.py cv2.imwrite("result/start.jpg",frame) # 可选:保存摄像头原图(调试用) # 核心功能:用UNet神经网络识别图像中的车道线 # 计算小车中心与车道线中心的偏移量(比如偏移+5代表偏右,-3代表偏左) offset = calculate_offset(frame) # 自定义函数:计算偏移量 print("偏移量:", offset) # 终端实时打印 # 保存偏移量和识别结果(给循迹程序用) with open("result/note.txt", "w") as f: f.write(str(offset)) cv2.imwrite("result/mask.jpg", mask) # 保存车道线识别后的图像(看识别效果)- 作用:通过摄像头采集图像,用 AI 模型识别车道线,输出小车相对于车道线的偏移量,并存到
note.txt文件中。 - 调试技巧:取消
cv2.imwrite("result/start.jpg",frame)的注释,可查看摄像头角度是否对准车道线。
- 作用:通过摄像头采集图像,用 AI 模型识别车道线,输出小车相对于车道线的偏移量,并存到
-
第二步:自动循迹(
AIcar_move.launch配置)该文件是配置文件(无需写代码,直接改参数),核心参数:xml
<param name="linear_x" value="0.3" /> <!-- 直行速度(建议0.3,太快容易冲出车道) --> <param name="steer_coeff" value="0.5" /> <!-- 转向系数(越大,对偏移的反应越灵敏) --> <param name="max_angular_z" value="1.5" /> <!-- 最大转弯速度(防止急转弯) -->- 原理:循迹程序读取
note.txt中的偏移量,比如偏移 + 5(偏右),就发布angular.z=-1.0(左转),偏移 - 3(偏左)就发布angular.z=0.8(右转),实现 “自动纠偏”。
- 原理:循迹程序读取
(三)环境感知(雷达 + 摄像头)
1. 雷达测试(测距用)
关键指令
bash
运行
# 启动雷达驱动(激光雷达LD06)
roslaunch ldlidar_stl_ros ld06.launch
# 打开RViz可视化雷达点云(看周围障碍物)
rviz
# 运行Python脚本,打印两侧距离
python get_scan_data.py # 路径:~/talos_ws/src/agrc_base_arm/script
代码详解(get_scan_data.py核心逻辑)
python
运行
import rospy
from sensor_msgs.msg import LaserScan
def scan_callback(data):
# data.ranges是雷达所有方向的距离数据(列表,长度360,对应0-360度)
left_distance = data.ranges[90] # 90度方向(小车左侧)的距离
right_distance = data.ranges[270] # 270度方向(小车右侧)的距离
print("左侧距离:{:.2f}m,右侧距离:{:.2f}m".format(left_distance, right_distance))
if __name__ == "__main__":
rospy.init_node("scan_data_node") # 初始化ROS节点
rospy.Subscriber("/scan", LaserScan, scan_callback) # 订阅雷达话题"/scan"
rospy.spin() # 持续运行,等待雷达数据
- 作用:雷达实时扫描周围环境,
/scan话题发布所有方向的距离数据,脚本订阅该话题后,提取左侧(90 度)和右侧(270 度)的距离,打印到终端(用于避障或精准停靠)。
2. 摄像头 WEB 预览(实时看图像)
关键指令(分 2 步)
bash
运行
# 第一步:启动摄像头驱动
roslaunch usb_cam usb_cam-test.launch
# 第二步:启动WEB服务器
rosrun web_video_server web_video_server
访问方式
- 机器人主机上打开浏览器:
http://localhost:8080/ - 手机 / 电脑(连同一热点):
http://192.168.20.100:8080/
更换外接摄像头(如果自带相机不好用)
- 查外接摄像头设备号:
bash
运行
ll /dev/video* # 插入USB摄像头前后各执行一次,新增的就是(比如/dev/video1) - 修改配置文件:路径:
~/talos_ws/src/usb_cam/launch/usb_cam-test.launch找到这行,把video0改成video1:xml
<param name="device" value="/dev/video1" /> <!-- 摄像头设备号 -->
(四)YOLO 目标检测(识别农作物 / 障碍物)
关键指令
bash
运行
# 进入YOLO部署目录
cd /opt/nvidia/deepstream/deepstream-6.0/sources/DeepStream-Yolo
# 启动YOLO识别(基于DeepStream加速,适合Jetson硬件)
deepstream-app -c deepstream_app_config.txt
配置文件修改(关键)
- 打开图像显示:修改
deepstream_app_config.txtini
[sink0] enable=1 # 1=显示图像,0=不显示 type=2 # 2=窗口显示 [osd] enable=1 # 1=显示识别框和标签,0=不显示 - 更换摄像头:修改
[source0]部分ini
camera-v4l2-dev-node=1 # 改成你的摄像头设备号(比如1对应/dev/video1) - 识别结果保存:程序自动把识别到的目标(比如 “花”“草”“障碍物”)存到
yolosign.txt文件中,路径:plaintext
/opt/nvidia/deepstream/deepstream-6.0/sources/DeepStream-Yolo/nvdsinfer_custom_impl_Yolo/yolosign.txt
联动控制(根据识别结果让小车动作)
bash
运行
# 启动联动控制节点
roslaunch velpub get_yolo_rst.launch
- 核心逻辑(
velpub.py):python
运行
# 订阅车道线循迹的速度指令(/cmd_vel_1) rospy.Subscriber("/cmd_vel_1", Twist, cmd_vel_callback) # 读取YOLO识别结果(yolosign.txt) with open("yolosign.txt", "r") as f: target = f.read().strip() # 比如读到"flower"(花)或"obstacle"(障碍物) # 根据目标调整运动指令 if target == "obstacle": # 遇到障碍物,停止前进 cmd_vel.linear.x = 0.0 cmd_vel.angular.z = 0.0 elif target == "flower": # 识别到花,减速并转向靠近 cmd_vel.linear.x = 0.2 cmd_vel.angular.z = -0.8 # 右转靠近 # 发布最终的运动指令(/cmd_vel) pub.publish(cmd_vel) - 作用:把 YOLO 识别结果和车道线循迹结合,实现 “识别到障碍物就停,识别到目标就靠近” 的智能控制。
(五)机械臂控制(农业作业核心执行机构)
关键前提(必须做!)
- 开机前:把机械臂大臂的 “对准位” 和云台的 “对准位” 靠在一起(防止舵机复位卡死);
- 查串口:连接机械臂 USB 线后,执行
ll /dev/ttyUSB*,确认机械臂串口(默认/dev/ttyUSB2); - 改权限(避免串口无法通信):
bash
运行
sudo chmod 777 /dev/ttyUSB2 # 给串口读写权限
核心指令
bash
运行
# 启动机械臂驱动(自动回到初始位置)
roslaunch agrc_base_arm agrc_base_arm.launch
控制方式(3 种,从简单到复杂)
1. 话题发布预设动作(最常用)
bash
运行
# 发布指令:让机械臂执行“初始位姿”(data=1)
rostopic pub /arm_cmd std_msgs/Int32 "data: 1"
- 动作对应表(改
data后的数字即可):功能 data 值 初始位姿(待机) 1 动作组 1(比如 “伸臂”) 2 动作组 2(比如 “抓取”) 3 ... ... 获取各轴角度和扭矩 20 关闭关节锁死(可手动掰) 99 打开关节锁死(固定位置) 100
2. 键盘手动控制
| 按键 | 功能 |
|---|---|
| y | 打印各轴角度和扭矩 |
| r | 关闭关节锁死(手动调整) |
| t | 打开关节锁死(固定位置) |
3. 自定义动作(添加新动作组)
步骤:
- 按
r:关闭关节锁死,手动把机械臂掰到目标位置(比如 “授粉姿势”); - 按
t:锁死关节,固定位置; - 按
y:终端打印 5 个关节的位置信息(比如P1=180, P2=90...); - 改参数文件(
~/talos_ws/src/agrc_base_arm/config/base_arm.yaml):yaml
action_groups: 17: # 新动作组编号(16之后的数字) - P1: 180 # 关节1位置(刚才打印的数值) P2: 90 # 关节2位置 P3: 60 # 关节3位置 P4: 120 # 关节4位置 P5: 180 # 关节5位置(夹爪) speed: 200 # 运动速度 - 保存后,重新启动机械臂驱动,发布
data=17即可执行新动作。
(六)智能灌溉 Demo(农业场景实战)
核心流程(硬件安装 + 软件运行)
1. 硬件安装要点
- 水泵接线:进水口接带过滤头的管道(放水瓶里),出水口接喷嘴(固定在机械臂夹爪);
- 供电:水泵用单独 12V 锂电池(防短路),水泵控制器 USB 插到底盘的 USB-HUB;
- 查水泵串口:执行
ll /dev/ttyUSB*,水泵控制器一般是/dev/ttyUSB3(最后插入的设备)。
2. 关键指令(按顺序启动 4 个终端)
bash
运行
# 终端1:启动底盘驱动
roslaunch eprobot_start AIcar_joy.launch
# 终端2:启动机械臂驱动
roslaunch agrc_base_arm agrc_base_arm.launch
# 终端3:启动雷达(精准停靠用)
roslaunch ldlidar_stl_ros ld06.launch
# 终端4:启动灌溉Demo
roslaunch agrc_base_arm compitation_irrigate_demo.launch
3. 参数配置(compitation_irrigate_demo.yaml)
无需改代码,改配置文件即可调整效果:
yaml
linear_x: 0.3 # 小车直行速度(慢一点,精准停靠)
anglular_z: 1.0 # 转向速度
pump_serial: /dev/ttyUSB3 # 水泵串口(必须和实际一致)
pump_on_time: 2.0 # 单次灌溉时间(2秒,根据需要调整)
pump_off_time: 1.0 # 灌溉后关闭延时(1秒)
# 行进时间配置:[前进时间(秒),停留时间(秒)]
go_along_time:
- [2.5, 5.0] # 方案1:前进2.5秒,停留5秒(给灌溉留时间)
- [3.0, 4.5] # 方案2:前进3秒,停留4.5秒
# A区任务:10次行进+停留,每次用go_along_time中的第n个方案
task_A_go_along: [0,0,1,1,0,0,1,1,0,0] # 0=方案1,1=方案2
4. 核心代码逻辑(compitation_irrigate_demo.py)
python
运行
# 读取参数文件
config = rospy.get_param("/compitation_irrigate_demo")
linear_x = config["linear_x"]
pump_on_time = config["pump_on_time"]
# 雷达数据回调(精准停靠)
def scan_callback(data):
left_dist = data.ranges[90]
right_dist = data.ranges[270]
print("两侧距离:", left_dist, right_dist)
# 若检测到花盆(距离小于0.5米),停止前进
if left_dist < 0.5 and right_dist < 0.5:
stop_car() # 停止小车
# 灌溉动作
def irrigate():
# 控制机械臂转到灌溉姿势(发布动作组指令)
rospy.Publisher("/arm_cmd", Int32, queue_size=10).publish(5) # 动作组5=灌溉姿势
# 打开水泵
pump_serial.write(b"ON") # 向水泵控制器发“开”指令
rospy.sleep(pump_on_time) # 保持开启pump_on_time秒
# 关闭水泵
pump_serial.write(b"OFF")
rospy.sleep(config["pump_off_time"])
# 主流程
def main():
for i in range(len(task_A_go_along)):
# 按方案前进
go_time, wait_time = go_along_time[task_A_go_along[i]]
move_car(linear_x, 0.0, go_time) # 直行go_time秒
rospy.sleep(wait_time) # 停留
irrigate() # 执行灌溉
# A区完成后,去B区...
- 作用:小车按预设方案在 A 区、B 区移动,通过雷达检测花盆位置,停靠后控制机械臂调整姿势,开启水泵灌溉,完成后继续前进。
(七)智能授粉 Demo(类似灌溉,简化版)
核心差异
- 硬件:无需水泵,只需把水笔固定在机械臂夹爪(模拟授粉);
- 软件:动作组不同(授粉动作 vs 灌溉动作),参数文件中停留时间可缩短(授粉比灌溉快)。
关键指令(最后一步换 Demo)
bash
运行
# 终端4:启动授粉Demo(其他3步和灌溉一样)
roslaunch agrc_base_arm compitation_pollination_demo.launch
(八)辅助工具(保障机器人稳定运行)
1. 开启风扇(Jetson 散热必备)
Jetson 开发板运行 AI 模型时会发热,需手动开启风扇:
bash
运行
# 1. 创建并编辑启动文件
sudo touch /etc/rc.local
sudo gedit /etc/rc.local
# 2. 在文件中输入以下内容(复制粘贴即可)
#!/bin/bash # 必须有,告诉系统这是bash脚本
sleep 10 # 开机10秒后执行(等系统启动完成)
sudo /usr/bin/jetson_clocks # 开启Jetson性能模式
sudo sh -c 'echo 200 > /sys/devices/pwm-fan/target_pwm' # 风扇转速(200是中等转速,范围0-255)
# 3. 给文件加执行权限
sudo chmod 755 /etc/rc.local
- 作用:开机自动启动风扇,防止因过热导致机器人死机。
2. 资源监视器(查看硬件状态)
bash
运行
jtop # 直接在终端输入
- 功能:实时显示 CPU、GPU、内存、风扇转速、温度等信息,比如:
- 若 GPU 使用率 100%,说明 AI 模型(YOLO / 车道线识别)在正常运行;
- 若温度超过 85℃,需调大风扇转速(把 200 改成 255)。
三、核心总结
- ROS 核心逻辑:所有控制都通过 “话题” 通信(如
/cmd_vel控制运动,/scan传输雷达数据),Launch 文件负责一键启动多节点,参数文件负责灵活配置; - 操作优先级:先连接网络→启动底层驱动(底盘 / 机械臂)→启动感知模块(雷达 / 摄像头)→启动上层控制(循迹 / YOLO / 作业 Demo);
- 调试技巧:遇到问题先看终端报错→检查硬件接线(串口 / 电源)→确认参数文件(串口号、速度)→查看识别 / 测距结果(mask.jpg、终端打印)。
按手册步骤操作,即可实现农业机器人的自主移动、环境感知和农业作业,如需自定义功能(如新增作物识别、调整动作),可基于现有代码修改参数或添加逻辑。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)