目标跟踪
手动控制小车
-
将小车放置在运动场地。
-
以root用户远程登录小车的开发者套件。
-
进入获取代码中的样例代码目录下的“/python”文件夹路径,安装相关依赖后启动运行脚本。
cd /home/HwHiAiUser/E2ESamples/src/E2E-Sample/Car/pythonpip3 install -r requirements.txtpython3 main.py回显如下:
(base) root@davinci-mini:/home/HwHiAiUser/E2ESamples/src/E2E-Sample/Car/python# python main.py[EVENT] PROFILING(5821,python):2023-03-27-02:24:50.860.329 [msprof_callback_impl.cpp:236] >>> (tid:5821) Started to register profiling ctrl callback.2023-03-27 02:24:52 [MainProcess:5821][INFO]: start2023-03-27 02:24:52 [Process-2:5841][INFO]: update_controller_speed: True2023-03-27 02:24:52 [Process-2:5841][INFO]: self.speed: 02023-03-27 02:24:52 [Process-2:5841][INFO]: [0, 0, 0, 0, 90, 65, -12345]2023-03-27 02:24:52 [Process-2:5841][INFO]: action SetServo execute SUCC2023-03-27 02:24:52 [Process-2:5841][INFO]: Manual loop start:::note 说明 运行python3 main.py报错请参见运行智能车主入口程序main.py时出现‘ttyUSB0’或'ttyUSB1'相关错误导致程序无法启动解决。 :::
-
通过键盘输入键位手动控制小车移动,如表1所示。
表1 键位映射表
键位 动作 w 前进 a 左转 s 后退 d 右转 q 逆时针旋转 e 顺时针旋转 ↑ 加速(小车运动状态与静止状态均可以调整) ↓ 减速(小车运动状态与静止状态均可以调整) c 捕获当前摄像头的图片 space 暂时停车 :::note 说明 由于TT减速电机成本较低,若此处手动控制小车出现轮子转向相反,或四个轮子转速不同导致小车不走直线的情况。
- 参照FAQ中的E2E样例开发问题。
- 参考“/Car/src/actions/base_action.py”文件代码中的注释修改“/Car/src/actions/base_action.py”的'self.motor_rating'参数,四个参数依次对应图1中的1、2、3、4号电机,修改参数的比例大小即可修改对应电机的转速,添加负号即可使对应电机反转,进行微调即可使小车恢复正常。 :::
父主题: 快速体验
自动驾驶与泊车
-
将小车放置在运动场地。
-
以root用户远程登录小车的开发者套件。
-
进入获取代码中的样例代码目录,启动运行脚本。
cd /home/HwHiAiUser/E2ESamples/src/E2E-Sample/Car/pythonpython3 main.py --mode=easy回显如下:
(base) root@davinci-mini:/home/HwHiAiUser/E2ESamples/src/E2E-Sample/Car/python# python main.py --mode=easy[EVENT] PROFILING(5821,python):2023-03-27-02:24:50.860.329 [msprof_callback_impl.cpp:236] >>> (tid:5821) Started to register profiling ctrl callback.2023-03-27 02:24:52 [MainProcess:5821][INFO]: start2023-03-27 02:24:52 [Process-2:5841][INFO]: update_controller_speed: True2023-03-27 02:24:52 [Process-2:5841][INFO]: self.speed: 02023-03-27 02:24:52 [Process-2:5841][INFO]: [0, 0, 0, 0, 90, 65, -12345]2023-03-27 02:24:52 [Process-2:5841][INFO]: action SetServo execute SUCC2023-03-27 02:24:52 [Process-2:5841][INFO]: Manual loop start:::note 说明 运行python3 main.py报错请参见运行智能车主入口程序main.py时出现‘ttyUSB0’或'ttyUSB1'相关错误导致程序无法启动解决。 :::
-
在命令行中输入Helper,加载转弯及停车辅助模型。无需等待,继续在命令行中输入LF,加载直线矫正模型。
-
小车开始自动驾驶,待行驶至停车标识处会自动进行泊车。
父主题: 快速体验
目标跟踪
:::note 说明 运行场地尽量为夜间且照明充足的室内,避免由太阳光放射带来的曝光影响。 :::
-
将小车放置在运动场地,并将手动控制的另一辆小车放置在智能小车前方位于摄像头画面的中下方位置。
-
以root用户远程登录小车的开发者套件。
-
进入获取代码中的样例代码目录,启动运行脚本。
cd /home/HwHiAiUser/+Samples/src/E2E-Sample/Car/pythonpython3 main.py -mode=cmd回显如下:
(base) root@davinci-mini:/home/HwHiAiUser/E2ESamples/src/E2E-Sample/Car/python# python main.py -mode=cmd[EVENT] PROFILING(5821,python):2023-03-27-02:24:50.860.329 [msprof_callback_impl.cpp:236] >>> (tid:5821) Started to register profiling ctrl callback.2023-03-27 02:24:52 [MainProcess:5821][INFO]: start2023-03-27 02:24:52 [Process-2:5841][INFO]: update_controller_speed: True2023-03-27 02:24:52 [Process-2:5841][INFO]: self.speed: 02023-03-27 02:24:52 [Process-2:5841][INFO]: [0, 0, 0, 0, 90, 65, -12345]2023-03-27 02:24:52 [Process-2:5841][INFO]: action SetServo execute SUCC2023-03-27 02:24:52 [Process-2:5841][INFO]: Manual loop start:::note 说明 运行python3 main.py报错请参见运行智能车主入口程序main.py时出现‘ttyUSB0’或'ttyUSB1'相关错误导致程序无法启动解决。 :::
-
在命令行中输入Tracking,进入追踪模式。
-
开始控制前方小车移动,智能小车会追踪前方小车的移动轨迹和速度进行目标跟踪移动。
父主题: 快速体验
主要代码文件介绍
表1 文件介绍
| 文件(夹)名称 | 说明 |
|---|---|
| python/main.py | 小车demo运行入口文件。 |
| python/requirements.txt | 智能小车样例代码运行所需依赖。 |
| python/src/actions | 小车基础与复杂运动代码。 |
| python/src/utils | 工具类python文件包含OpenCV、acl工具等。 |
| python/src/scenes | 小车预设场景相关代码。 |
| python/src/model | 推理模型相关代码。 |
| python/src/weight | 模型权重文件。 |
父主题: 代码实现
智能小车控制逻辑入口
“main.py”是小车控制代码的主入口,定义了小车控制模式及对应模式的后续调用实现。
首先导入一系列与参数有关的模块,以及启动摄像头的关键模块。
import os
from argparse import ArgumentParser
from multiprocessing import Process, Queue
from src.scenes import Manual, scene_initiator
from src.utils import getkey, log, CameraBroadcaster, CAMERA_INFO
定义出可选参数更改小车的控制模式,可选命令行cmd控制,手动控制,声音控制(正在规划中)以及测试等。
def parse_args():
parser = ArgumentParser()
parser.add_argument('--mode', type=str, required=False, default='manual',
choices=['cmd', 'voice', 'manual', 'test'])
return parser.parse_args()
遵循简单性的原则,在程序的主入口需判断模式的设定后,进入到对应模式的实现中,包含摄像头端口的调用及行驶过程中各类消息队列的处理。
if __name__ == '__main__':
args = parse_args()
log.info('start')
msg_queue = Queue(maxsize=1)
camera = CameraBroadcaster(CAMERA_INFO)
shared_memory_name = camera.memory_name
camera_process = Process(target=camera.run)
camera_process.start()
if args.mode == 'manual':
task = Manual(shared_memory_name, CAMERA_INFO, msg_queue)
process = Process(target=task.loop)
process.start()
try:
while True:
key = getkey()
if key == 'esc':
process.join()
camera.stop_sign.value = True
camera_process.join()
break
else:
msg_queue.put(key)
except (KeyboardInterrupt, SystemExit):
camera.stop_sign.value = True
camera_process.join()
os.system('stty sane')
log.info('stopping.')
elif args.mode == 'cmd':
process_list = []
record_map = {}
try:
log.info(f'start reading cmd')
while True:
command = input().strip()
if command == 'stop':
for p in process_list:
p.kill()
log.info(f'start put stop sign')
camera.stop_sign.value = True
camera_process.join()
break
elif command == 'clear':
for p in process_list:
p.kill()
process_list.clear()
log.info(f'clear succ')
continue
elif command == 'Manual':
log.error(f'Does not support switching from cmd mode to manual mode')
continue
log.info(f'building scene {command}')
scene = scene_initiator(command)
log.info(f'{scene}')
if scene is not None:
scene_obj = scene(shared_memory_name, CAMERA_INFO, msg_queue)
process = Process(target=scene_obj.loop)
process.start()
process_list.append(process)
except (KeyboardInterrupt, SystemExit):
camera.stop_sign.value = True
camera_process.join()
for process in process_list:
process.kill()
log.info('stopping.')
elif args.mode == 'voice':
raise NotImplementedError('voice control is not currently supported.')
elif args.mode == 'test':
test_list = []
test1 = Manual(shared_memory_name, CAMERA_INFO, msg_queue)
test_list.append(Process(target=test1.loop))
test2 = scene_initiator('Tracking')(shared_memory_name, CAMERA_INFO, msg_queue)
test_list.append(Process(target=test2.loop))
test3 = scene_initiator('Tracking')(shared_memory_name, CAMERA_INFO, msg_queue)
test_list.append(Process(target=test3.loop))
for process in test_list:
process.start()
try:
while True:
key = getkey()
if key == 'esc':
for process in test_list:
process.kill()
camera.stop_sign.value = True
camera_process.join()
break
else:
msg_queue.put(key)
except (KeyboardInterrupt, SystemExit):
camera.stop_sign.value = True
camera_process.join()
os.system('stty sane')
log.info('stopping.')
父主题: 代码实现
在线提单