之前已经尝试使用USB摄像头替换地平线机器人平台Apps应用实例里面的mipi摄像头。学习了一段时间ROS2之后终于让我的车与旭日派连接起来,实现人体跟随的效果。
一.准备工作
1.旭日X3派已烧录好地平线提供的Ubuntu20.0.4或Linux系统镜像。
2.旭日X3派已成功安装TogetherROS。
3.旭日X3派已安装USB摄像头当然使用F37 sensor更好。
4.USB转TTL一个
5.和旭日X3派在同一网段(有线或者连接同一无线网,IP地址前三段需保持一致)的PC,
PC端需要安装的环境包括:Ubuntu 20.0.4系统
ROS2 Foxy桌面版
Gazebo和Turtlebot3相关的功能包
二.对官方的launch文件作一些更改(如果使用USB摄像头则需要更改,如果使用F37 sensor则不需要更改)
可能格式有点问题,可以对照着自己的launch文件格式进行更改
1发布图片的节点
Node(
package='hobot_usb_cam',
executable='hobot_usb_cam',
output='screen',
name='hobot_usb_cam',
parameters=[
#{"out_format": "nv12"},
{"frame_id": "default_usb_cam"},
{"image_width": 640},
{"image_height": 480},
{"io_method": "mmap"},
{"zero_copy": False},
{"pixel_format": "mjpeg"},
{"video_device": "/dev/video8"}#更改为自己设备的位置
],
arguments=['--ros-args', '--log-level', 'error']
),
2jpeg图片编码发布节点
Node(
package='hobot_codec',
executable='hobot_codec_republish',
output='screen',
parameters=[
{"channel": 1},
{"in_mode": "ros"},
{"in_format": "jpeg"},
{"out_mode": "shared_mem"},
{"out_format": "nv12"},
{"sub_topic": "/image"},
{"pub_topic": "/hbmem_img"}
],
arguments=['--ros-args', '--log-level', 'error']
),
3web展示节点
Node(
package='websocket',
executable='websocket',
output='screen',
parameters=[
{"image_topic": "/image"},
{"image_type": "mjpeg"},
{"smart_topic": "/hobot_mono2d_body_detection"}
],
arguments=['--ros-args', '--log-level', 'error']
),
4人体跟随节点
Node(
package='body_tracking',
executable='body_tracking',
output='screen',
parameters=[
{"ai_msg_sub_topic_name": "/hobot_mono2d_body_detection"},
{"activate_wakeup_gesture": 0},#是否启用唤醒手势 1启用,0不启用 ok唤醒手势 palm取消跟随手势
{"img_width": 640},#输入图像的宽
{"img_height": 480},#输入图像的高与上面图像发布节点一致 如果与上面不一致可能在web上的识别框和身体节点没问题,但是人体跟随有问题
{"track_serial_lost_num_thr": 30},
{"move_step": 0.5},#平移运动的步长 单位 米
{"rotate_step": 0.5},#旋转运动的步长 单位 弧度
{"activate_robot_move_thr": 5}
],
arguments=['--ros-args', '--log-level', 'info']
)
更改完上面的节点即可启动旭日派的人体跟随实例
旭日派启动
# 配置TogetherROS环境
source /opt/tros/setup.bash
# 从TogetherROS的安装路径中拷贝出运行示例需要的配置文件。
cp -r /opt/tros/lib/mono2d_body_detection/config/ .
#启动launch文件
ros2 launch body_tracking hobot_body_tracking_without_gesture.launch.py
PC启动仿真环境
source /opt/ros/foxy/setup.bash
export TURTLEBOT3_MODEL=burger
ros2 launch turtlebot3_gazebo empty_world.launch.py
三.创建节点接收Twist类型消息并通过串口发送控制信息给小车
import serial
from geometry_msgs.msg import Twist
import rclpy
from rclpy.node import Node
uart_dev="/dev/ttyUSB0" #串口设备usb转ttl
baudrate=115200 #波特率
ser = serial.Serial(uart_dev,int(baudrate),timeout =1)
class CmdNode(Node):
def __init__(self,name):
super().__init__(name)
self.sub_cmd = self.create_subscription(Twist,"cmd_vel",self.recv_cmd_callback,6)
def recv_cmd_callback(self,cmd):
self.cmd_speed=cmd._linear._x #获取平移运动的步长
self.cmd_angular=cmd._angular._z #获取旋转运动的步长
if(self.cmd_angular!=0):
if(self.cmd_angular>0):
ser.write(b'3')#右转
else:
ser.write(b"2")#左传
else:
if(self.cmd_speed>0):
ser.write(b'1')#前进
else:
ser.write(b'0')#停止
def main(args=None):
rclpy.init(args=args) #初始化库
sub_node = CmdNode("sub") #新建节点对象
rclpy.spin(sub_node) #spin循环节点
rclpy.shutdown #关闭客户端
车子需要接受ASCII码的0,1,2,3来控制车子的移动。车子接收一次命令后的步长不能过大。不然会来回摆头。
由于官方的串口还没仔细学习所以这里使用了一个USB转TTL。应该照着把设备名该了效果是一样的。