Gazebo环境下基于ROS的阿克曼小车键盘控制

本文涉及的产品
资源编排,不限时长
简介: 键盘控制Gazebo中的小车行驶

Gazebo环境下基于ROS的阿克曼小车键盘控制

1.  创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息

2.  进入Docker镜像

新建内容打开火狐浏览器。

通过RAM用户名密码登录页面,输入子用户密码登录账号。

登陆后选择左侧产品与服务中的云服务器ECS。

在所有云服务器中通过左下角地域找到正确的服务器并点击远程连接。

选择通过VNC远程连接。

选择重置VNC密码并设置新的密码后登录。

设置好进入各选项后进入Ubuntu桌面。

右键打开终端,输入命令sudo docker run -it --rm -p 6080:80 aliyun_demo运行镜像aliyun_demo。

运行成功后打开浏览器,在地址一栏输入127.0.0.1:6080进入镜像系统。

3.  代码部分

键盘控制程序使用的是raceworld1场景,由raceworld1.launch文件启动。找到/root/aliyun_demo/src/raceworld/launch文件夹中的raceworld1.launch文件并打开。

在launch文件内加载了多个控制器,其中left_rear_wheel_velocity_controller,   right_rear_wheel_velocity_controller,left_front_wheel_velocity_controller,right_front_wheel_velocity_controller,left_steering_hinge_position_controller和right_steering_hinge_position_controller接收ROS消息,分别控制了左右后轮速度,左右前轮速度和转向角度。

<node name="controller_manager" pkg="controller_manager" type="spawner" 
       respawn="false" output="screen"  
       args="left_rear_wheel_velocity_controller       right_rear_wheel_velocity_controller
             left_front_wheel_velocity_controller      right_front_wheel_velocity_controller
             left_steering_hinge_position_controller   right_steering_hinge_position_controller
             joint_state_controller"/>

在加载控制器代码的下面,加载了一个名为servo_comannds1.py的代码文件。

<node pkg="raceworld" type="servo_commands1.py" name="servo_commands" output="screen" >

打开/root/aliyun_demo/src/raceworld/scripts文件夹中的servo_comannds1.py文件我们可以看到,代码中新建了一个名为servo_comannds的节点,他订阅并接收/deepracer1/ackermann_cmd_mux/output消息。

def servo_commands():
    global flag_move
    rospy.init_node('servo_commands', anonymous=True)
    # robot_name = rospy.get_param('~robot_name')
    rospy.Subscriber("/deepracer1/ackermann_cmd_mux/output", AckermannDriveStamped, set_throttle_steer)
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
if __name__ == '__main__':
    try:
        servo_commands()
    except rospy.ROSInterruptException:
        pass

在接收到消息后,经过适当的转换,将速度和转向信息发布给之前所述六个控制器。

def set_throttle_steer(data):
    global flag_move
    pub_vel_left_rear_wheel = rospy.Publisher("/deepracer1/left_rear_wheel_velocity_controller/command", Float64, queue_size=1)
    pub_vel_right_rear_wheel = rospy.Publisher("/deepracer1/right_rear_wheel_velocity_controller/command", Float64, queue_size=1)
    pub_vel_left_front_wheel = rospy.Publisher("/deepracer1/left_front_wheel_velocity_controller/command", Float64, queue_size=1)
    pub_vel_right_front_wheel = rospy.Publisher("/deepracer1/right_front_wheel_velocity_controller/command", Float64, queue_size=1)
    pub_pos_left_steering_hinge = rospy.Publisher("/deepracer1/left_steering_hinge_position_controller/command", Float64, queue_size=1)
    pub_pos_right_steering_hinge = rospy.Publisher("/deepracer1/right_steering_hinge_position_controller/command", Float64, queue_size=1)
    throttle = data.drive.speed*28
    print("Throttle:",throttle)
    steer = data.drive.steering_angle
    print("Steer:",steer)
    pub_vel_left_rear_wheel.publish(throttle)
    pub_vel_right_rear_wheel.publish(throttle)
    pub_vel_left_front_wheel.publish(throttle)
    pub_vel_right_front_wheel.publish(throttle)
    pub_pos_left_steering_hinge.publish(steer)
    pub_pos_right_steering_hinge.publish(steer)
    print("Message From servo_commands1.py Published\n")

键盘控制程序需要运行/root/aliyun_demo/src/raceworld/scripts文件夹中的key_op.py文件。

首先需要获取按键输入。

def getKey():
    tty.setraw(sys.stdin.fileno())
    select.select([sys.stdin], [], [], 0)
    key = sys.stdin.read(1)
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key
settings = termios.tcgetattr(sys.stdin)
def pub_cmd():
    index = 1
    rospy.init_node("pub_cmd")
    pub = rospy.Publisher("/deepracer"+str(index)+"/ackermann_cmd_mux/output", AckermannDriveStamped, queue_size=10)
    akm = AckermannDriveStamped()
    while 1:
        x=0
        a=0
        key = getKey()

然后分别根据按键设置对应的速度以及转角。W为前进,S为后退,A为左前进,D为右前进,X为停止行驶,O为退出程序。

if key == 'w':
    print("Front")
    x=0.3
    a=0
elif key == 's':
    print("Back")
    x=-0.3
    a=0
elif key == 'a':
    print("Front Left")
    x=0.3
    a=2
elif key == 'd':
    print("Front Right")
    x=0.3
    a=-0.7
elif key == 'x':
    print("Stop")
    x=0
    a=0
elif key == 'o':
    print("Exit")
    break
else:
    continue

新建一个AckermannDriveStamped类型的消息并设置好相应数据后,将其作为/deepracer1/ackermann_cmd_mux/output消息发布,之后经由servo_comannd1.py中所设置的节点转换后发布给控制器,以此实现键盘对小车的控制。

akm.drive.speed = x
print("Speed:",akm.drive.speed)
akm.drive.steering_angle = a
print("Steering_Angle:",akm.drive.steering_angle)
pub.publish(akm)
print("Message From key_op.py Published\n")

4.  实验操作

打开终端,输入如图所示命令开启raceworld1 Gazebo场景。

cd aliyun_demo
source devel/setup.bash
roslaunch raceworld raceworld1.launch

随后新建另一个终端并输入如图所示命令运行键盘控制程序。

cd aliyun_demo
source devel/setup.bash
rosrun raceworld key_op.py

当按下对应的按键时,小车就会开始移动。并且在两个终端中可以看到消息的发布与接收。

这时新建终端,并输入命令rostopic list,我们可以在其中找到/deepracer1/ackermann_cmd_mux/output主题。

输入rostopic info /deepracer1/ackermann_cmd_mux/output我们可以查看该主题的发布者与接收者。

同样,如果我们查看/deepracer1/left_rear_wheel_velocity_controller/command主题信息的话将会看到发布者是servo_comannds1.py中所创建的servo_commands节点,订阅者是/gazebo。

实验地址:https://developer.aliyun.com/adc/scenario/a0cd78582e2a462a8d294d9450213018

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
1月前
|
弹性计算 JSON 关系型数据库
使用ROS模板基于ECS和RDS创建WordPress环境
使用ROS模板基于ECS和RDS创建WordPress环境
|
3月前
|
Ubuntu Shell C++
在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
在Ubuntu18.04上安装ros2的环境,ros2的常用命令:播放包、录制包等
166 1
|
4月前
|
Ubuntu 机器人 Shell
ubuntu20.04创建ros环境、创建rospackage
至此,我们已经详细讲解了在Ubuntu 20.04上创建ROS环境及ROS包的步骤。这为进一步的机器人软件开发奠定了坚实的基础。
185 1
|
4月前
|
Ubuntu 机器人 Shell
ubuntu20.04创建ros环境、创建rospackage
至此,我们已经详细讲解了在Ubuntu 20.04上创建ROS环境及ROS包的步骤。这为进一步的机器人软件开发奠定了坚实的基础。
61 1
|
4月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
1月前
|
Ubuntu 机器人 Linux
|
5天前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
|
10天前
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
【11月更文挑战第4天】ROS2的学习过程和应用,介绍DDS系统的框架和知识。
|
6月前
|
传感器 人工智能 算法
ROS机器人操作系统
ROS机器人操作系统
174 1
|
1月前
|
传感器 数据可视化 机器人
【ROS速成】半小时入门机器人ROS系统简明教程之可视化系统(三)
半小时入门机器人ROS系统简明教程之可视化系统

推荐镜像

更多