博客地址:https://www.cnblogs.com/zylyehuo/

成果图

STEP1 创建工作空间

mkdir -p car_ws/src
cd car_ws
catkin_make

STEP2 在vscode中准备需要的文件夹

右键src,点击Create Catkin Package

再跳出的输入框中:

先输入包名:car

再输入依赖工具:urdf xacro

在car目录下依次创建 config、launch、meshes、urdf文件夹

在 car/urdf 文件夹下再创建 urdf、xacro文件夹

结构如下图所示

STEP3 car/urdf/urdf

创建 test.urdf 文件

car/urdf/urdf/test.urdf

<robot name="mycar">
<!-- set base_footprint -->
<link name="base_footprint">
<visual>
<geometry>
<sphere radius="0.001" />
</geometry>
</visual>
</link> <!-- add base -->
<link name="base_link">
<visual>
<geometry>
<cylinder radius="0.1" length="0.08" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="baselink_color">
<color rgba="1.0 0.5 0.2 0.8" />
</material>
</visual>
</link> <joint name="link2footprint" type="fixed">
<parent link="base_footprint" />
<child link="base_link"/>
<origin xyz="0 0 0.055" rpy= "0 0 0"/>
</joint> <!-- add qudong wheel -->
<link name="left_wheel">
<visual>
<geometry>
<cylinder radius="0.0325" length="0.015" />
</geometry>
<origin xyz="0 0 0" rpy="1.5708 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link> <joint name="left2link" type="continuous">
<parent link="base_link" />
<child link="left_wheel" />
<origin xyz="0 0.1 -0.0225" rpy="0 0 0" />
<axis xyz="0 1 0" />
</joint> <link name="right_wheel">
<visual>
<geometry>
<cylinder radius="0.0325" length="0.015" />
</geometry>
<origin xyz="0 0 0" rpy="1.5708 0 0" />
<material name="black">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link> <joint name="right2link" type="continuous">
<parent link="base_link" />
<child link="right_wheel" />
<origin xyz="0 -0.1 -0.0225" rpy="0 0 0" />
<axis xyz="0 1 0" />
</joint> <!-- add wanxiang wheel -->
<link name="front_wheel">
<visual>
<geometry>
<sphere radius="0.0075" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="wheel_color">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link> <joint name="front2link" type="continuous">
<parent link="base_link" />
<child link="front_wheel" />
<origin xyz="0.08 0 -0.0475" />
<axis xyz="0 1 0" />
</joint> <link name="back_wheel">
<visual>
<geometry>
<sphere radius="0.0075" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="wheel_color">
<color rgba="0.0 0.0 0.0 1.0" />
</material>
</visual>
</link> <joint name="back2link" type="continuous">
<parent link="base_link" />
<child link="back_wheel" />
<origin xyz="-0.08 0 -0.0475" />
<axis xyz="0 1 0" />
</joint> </robot>

STEP4 car/urdf/xacro

创建 car.urdf.xacro

car/urdf/xacro/car.urdf.xacro

<robot name="car" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="car_base.urdf.xacro" />
<xacro:include filename="car_camera.urdf.xacro" />
<xacro:include filename="car_laser.urdf.xacro" />
</robot>

STEP5 car/launch

创建 control.launch

car/launch/control.launch

<launch>
<param name="robot_description" command="$(find xacro)/xacro $(find car)/urdf/xacro/car.urdf.xacro" /> <node pkg="rviz" type="rviz" name="rviz" args="-d $(find car)/config/test.rviz" />
<node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" />
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" output="screen" /> <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen">
<rosparam file="$(find car)/config/control.yaml" command="load" />
<param name="sim" value="true" />
</node> </launch>

STEP6 car/config

依次创建 control.yaml test.rviz

car/config/control.yaml

controllers: {
base_controller: {
type: diff_controller, base_frame_id: base_footprint, base_width: 0.2, ticks_meter: 2000, Kp: 12,
Kd: 12,
Ki: 0,
Ko: 50, accel_limit: 1.0
}
}

car/config/test.rviz

可以先在 rviz 中运行代码,然后 将模型保存到 car/config 路径下,取名为 test.rviz

Panels:
- Class: rviz/Displays
Help Height: 78
Name: Displays
Property Tree Widget:
Expanded:
- /Global Options1
- /Status1
- /RobotModel1
- /TF1
- /Odometry1
- /Odometry1/Shape1
Splitter Ratio: 0.5
Tree Height: 670
- Class: rviz/Selection
Name: Selection
- Class: rviz/Tool Properties
Expanded:
- /2D Pose Estimate1
- /2D Nav Goal1
- /Publish Point1
Name: Tool Properties
Splitter Ratio: 0.5886790156364441
- Class: rviz/Views
Expanded:
- /Current View1
Name: Views
Splitter Ratio: 0.5
- Class: rviz/Time
Experimental: false
Name: Time
SyncMode: 0
SyncSource: ""
Preferences:
PromptSaveOnExit: true
Toolbars:
toolButtonStyle: 2
Visualization Manager:
Class: ""
Displays:
- Alpha: 0.5
Cell Size: 1
Class: rviz/Grid
Color: 160; 160; 164
Enabled: true
Line Style:
Line Width: 0.029999999329447746
Value: Lines
Name: Grid
Normal Cell Count: 0
Offset:
X: 0
Y: 0
Z: 0
Plane: XY
Plane Cell Count: 10
Reference Frame: <Fixed Frame>
Value: true
- Alpha: 1
Class: rviz/RobotModel
Collision Enabled: false
Enabled: true
Links:
All Links Enabled: true
Expand Joint Details: false
Expand Link Details: false
Expand Tree: false
Link Tree Style: Links in Alphabetic Order
back_wheel:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
base_footprint:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
base_link:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
camera:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
front_wheel:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
laser:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
left_wheel:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
right_wheel:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
support:
Alpha: 1
Show Axes: false
Show Trail: false
Value: true
Name: RobotModel
Robot Description: robot_description
TF Prefix: ""
Update Interval: 0
Value: true
Visual Enabled: true
- Class: rviz/TF
Enabled: false
Frame Timeout: 15
Frames:
All Enabled: true
Marker Scale: 1
Name: TF
Show Arrows: true
Show Axes: true
Show Names: true
Tree:
{}
Update Interval: 0
Value: false
- Angle Tolerance: 0.10000000149011612
Class: rviz/Odometry
Covariance:
Orientation:
Alpha: 0.5
Color: 255; 255; 127
Color Style: Unique
Frame: Local
Offset: 1
Scale: 1
Value: true
Position:
Alpha: 0.30000001192092896
Color: 204; 51; 204
Scale: 1
Value: true
Value: true
Enabled: true
Keep: 10
Name: Odometry
Position Tolerance: 0.10000000149011612
Shape:
Alpha: 1
Axes Length: 1
Axes Radius: 0.10000000149011612
Color: 255; 25; 0
Head Length: 0.30000001192092896
Head Radius: 0.05000000074505806
Shaft Length: 1
Shaft Radius: 0.009999999776482582
Value: Arrow
Topic: /odom
Unreliable: false
Value: true
Enabled: true
Global Options:
Background Color: 48; 48; 48
Default Light: true
Fixed Frame: odom
Frame Rate: 30
Name: root
Tools:
- Class: rviz/Interact
Hide Inactive Objects: true
- Class: rviz/MoveCamera
- Class: rviz/Select
- Class: rviz/FocusCamera
- Class: rviz/Measure
- Class: rviz/SetInitialPose
Theta std deviation: 0.2617993950843811
Topic: /initialpose
X std deviation: 0.5
Y std deviation: 0.5
- Class: rviz/SetGoal
Topic: /move_base_simple/goal
- Class: rviz/PublishPoint
Single click: true
Topic: /clicked_point
Value: true
Views:
Current:
Class: rviz/Orbit
Distance: 6.243990898132324
Enable Stereo Rendering:
Stereo Eye Separation: 0.05999999865889549
Stereo Focal Distance: 1
Swap Stereo Eyes: false
Value: false
Focal Point:
X: -0.6781591773033142
Y: 0.7335925102233887
Z: -0.1656564623117447
Focal Shape Fixed Size: true
Focal Shape Size: 0.05000000074505806
Invert Z Axis: false
Name: Current View
Near Clip Distance: 0.009999999776482582
Pitch: 0.3703985810279846
Target Frame: <Fixed Frame>
Value: Orbit (rviz)
Yaw: 0.8403980731964111
Saved: ~
Window Geometry:
Displays:
collapsed: false
Height: 967
Hide Left Dock: false
Hide Right Dock: false
QMainWindow State: 000000ff00000000fd00000004000000000000015600000329fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000329000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000329fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d00000329000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e100000197000000030000062d0000003efc0100000002fb0000000800540069006d006501000000000000062d000002eb00fffffffb0000000800540069006d00650100000000000004500000000000000000000003bc0000032900000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
Selection:
collapsed: false
Time:
collapsed: false
Tool Properties:
collapsed: false
Views:
collapsed: false
Width: 1581
X: 67
Y: 27

STEP7 运行

启动 roscore

建议在vscode外终端启动(也可在vscode中启动)

设置环境变量,启动rviz

在vscode中新建终端

注意要进入 car_ws 路径下

依次执行以下命令

出现如下画面即代表创建成功

第一次创建时可检查一下左栏选项是否一致

第一种启动方式:终端设置线速度、角速度

在vscode外新建终端

输入以下指令

注意 linear中x、angular中z行的修改

修改完成后点击回车即可

出现下图(rviz中的小车开始自动旋转)即代表创建成功

第二种启动方式:

在 car_ws/src 路径下创建一个新的工作空间,取名为 mbot_teleop

在 mbot_teleop 文件夹下依次创建 launch、scripts 文件夹

在launch文件夹下新建 mbot_teleop.launch 文件

car_ws/src/mbot_teleop/launch/mbot_teleop.launch
<launch>
<node name="mbot_teleop" pkg="mbot_teleop" type="mbot_teleop.py" output="screen">
<param name="scale_linear" value="0.1" type="double"/>
<param name="scale_angular" value="0.4" type="double"/>
</node>
</launch>

在scripts文件夹下新建 mbot_teleop.py 文件

car_ws/src/mbot_teleop/scripts/mbot_teleop.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- import rospy
from geometry_msgs.msg import Twist
import sys, select, termios, tty msg = """
Control mbot!
---------------------------
Moving around:
u i o
j k l
m , . q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
space key, k : force stop
anything else : stop smoothly CTRL-C to quit
""" moveBindings = {
'w':(1,0),
'o':(1,-1),
'a':(0,1),
'd':(0,-1),
'u':(1,1),
's':(-1,0),
'.':(-1,1),
'm':(-1,-1),
} speedBindings={
'q':(1.1,1.1),
'z':(.9,.9),
'w':(1.1,1),
'x':(.9,1),
'e':(1,1.1),
'c':(1,.9),
} def getKey():
tty.setraw(sys.stdin.fileno())
rlist, _, _ = select.select([sys.stdin], [], [], 0.1)
if rlist:
key = sys.stdin.read(1)
else:
key = '' termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
return key speed = .2
turn = 1 def vels(speed,turn):
return "currently:\tspeed %s\tturn %s " % (speed,turn) if __name__=="__main__":
settings = termios.tcgetattr(sys.stdin) rospy.init_node('mbot_teleop')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=5) x = 0
th = 0
status = 0
count = 0
acc = 0.1
target_speed = 0
target_turn = 0
control_speed = 0
control_turn = 0
try:
print msg
print vels(speed,turn)
while(1):
key = getKey()
# 运动控制方向键(1:正方向,-1负方向)
if key in moveBindings.keys():
x = moveBindings[key][0]
th = moveBindings[key][1]
count = 0
# 速度修改键
elif key in speedBindings.keys():
speed = speed * speedBindings[key][0] # 线速度增加0.1倍
turn = turn * speedBindings[key][1] # 角速度增加0.1倍
count = 0 print vels(speed,turn)
if (status == 14):
print msg
status = (status + 1) % 15
# 停止键
elif key == ' ' or key == 'k' :
x = 0
th = 0
control_speed = 0
control_turn = 0
else:
count = count + 1
if count > 4:
x = 0
th = 0
if (key == '\x03'):
break # 目标速度=速度值*方向值
target_speed = speed * x
target_turn = turn * th # 速度限位,防止速度增减过快
if target_speed > control_speed:
control_speed = min( target_speed, control_speed + 0.02 )
elif target_speed < control_speed:
control_speed = max( target_speed, control_speed - 0.02 )
else:
control_speed = target_speed if target_turn > control_turn:
control_turn = min( target_turn, control_turn + 0.1 )
elif target_turn < control_turn:
control_turn = max( target_turn, control_turn - 0.1 )
else:
control_turn = target_turn # 创建并发布twist消息
twist = Twist()
twist.linear.x = control_speed;
twist.linear.y = 0;
twist.linear.z = 0
twist.angular.x = 0;
twist.angular.y = 0;
twist.angular.z = control_turn
pub.publish(twist) except:
print e finally:
twist = Twist()
twist.linear.x = 0; twist.linear.y = 0; twist.linear.z = 0
twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = 0
pub.publish(twist) termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)

打开新的终端,依次输入以下命令:

cd car_ws
source ./devel/setup.bash
roslaunch mbot_teleop mbot_teleop.launch

出现下图即证明运行成功

自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)的更多相关文章

  1. <ROS> 机器人描述--URDF和XACRO

    文章转自 https://blog.csdn.net/sunbibei/article/details/52297524 特此鸣谢原创作者的辛勤付出 1 URDF 文件 1.1 link和joint ...

  2. RVIZ实现模拟控制小车

    RVIZ是一个强大的可视化工具,可以看到机器人的传感器和内部状态. 1.安装rbx1功能包Rbx1是国外一本关于ros的书中的配套源码,包含了机器人的基本仿真.导航.路径规划.图像处理.语音识别等等. ...

  3. IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

    转自 http://blog.csdn.net/zzfsuiye/article/details/8251060 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInte ...

  4. iOS系统自带的 UIAlertView 自动旋转的实现

    这里主要解析 UIAlertView 的几个关键功能的实现: 随着设备屏幕的旋转而旋转: Alert弹出框,使用UIWindow来实现,就是说,不用依赖于当前显示在最前面的UIView. 实现源码参考 ...

  5. IOS某个ViewController禁止自动旋转

    IOS屏幕自动旋转,强制横竖屏方法: - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientat ...

  6. Unity3d物体模型(实现旋转缩放平移自动旋转)

    基本功能实现:物体通过鼠标左键上下移动,中间键缩放.右键旋转,30秒没操作,物体自动旋转 实例代码: using UnityEngine; using System.Collections; publ ...

  7. 安装好ubuntu 18.10之后,屏幕一直在自动旋转,怎么办?

    sudo apt-get install okular dia gimp Gparted sudo add-apt-repository universesudo apt install gnome- ...

  8. Unity3D研究院之设置自动旋转屏幕默认旋转方向

    如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的. Default Orien ...

  9. Androidの解决自动旋转导致activity重启问题

    记录一下,经常在新建项目的时候就会发生这个问题,正好上次有个群友也问道了这个问题.就是设备屏幕打开自动旋转会导致activity重启,这样会消耗很多资源. 比如在加载listview数据会重新请求数据 ...

  10. 【转】Unity3D研究院之设置自动旋转屏幕默认旋转方向

    http://www.xuanyusong.com/archives/2871 如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求 ...

随机推荐

  1. vue3-openlayers基础知识简介

    vue3-openlayers基础知识简介 OpenLayers 3 Primer openlayers6:入门基础(一) openlayers 入门教程 一.基础概念介绍 地图(Map) OpenL ...

  2. 化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得

    本人使用WPF开发了一款OFD阅读器,显示字体是阅读器中最重要的功能.处理字体显示有多种方案,几易其稿,最终选用Freetype方案.本文对WPF中如何使用Freetype做简单描述. OFD中有两种 ...

  3. Mac安装MySQL详细教程

    1.MySQL安装包下载 还没下载的话请前往官网下载 我们可以看到这里有两个不同架构的dmg的安装包,如果不知道自己电脑是ARM还是X86的话可以打开终端输入:uname -a 或者 uname -a ...

  4. pytest基础

    pytest断言 1. == 直接对两端的值进行判断是否一致 1==1 2.assert in 判断值是否在正确范围   def test_jia(self): a='hello' b='a' ass ...

  5. NAT、DANT、SNAT的区别

    NAT NAT(Network Address Translation,网络地址转换)是将IP 数据包头中的IP 地址转换为另一个IP 地址的过程.在实际应用中,NAT 主要用于实现私有网络访问公共网 ...

  6. ARM单片机知识点

    1.STM32编译信息 代码占用FLASH 大小为:Code + RO-data, 7420字节(5054+2366),所用的RAM 大小为:RW-data + ZI-data, 8576(372+8 ...

  7. 天翼云弹性高性能计算Portal简介

    本文分享自天翼云开发者社区<天翼云弹性高性能计算Portal简介>,作者:小燕同学 1.平台概述 天翼云官网已上线公有云弹性高性能计算(EHPC)产品,公有云EHPC产品主要由管理员控制, ...

  8. Kali 安装并配置 Nessus

    Kali 安装并配置 Nessus 安装 Nessus 创建nessus文件夹 sudo mkdir /opt/nessus 下载 Nessus ( https://www.tenable.com/d ...

  9. Linux目录管理命令

    1. pwd :显示当前所在目录的路径 1.1 语法格式 pwd #直接按回车键 1.2 实践案例 案例:查看当前所在目录路径 [root@yyds ~]# pwd /root --->显示的是 ...

  10. [BZOJ4665] 小w的喜糖 题解

    我们先假设同种糖间存在差异. 设 \(f_{i,j}\) 表示前 \(i\) 种糖至少有 \(j\) 人拿到的糖和原来一样,\(c_i\) 表示拿第 \(i\) 种糖的人的个数,则有: \[f_{i, ...