最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天快看点丨自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)

来源:博客园

自动旋转ROS小车(rviz+urdf+xacro)(附加python操作键盘控制小车运动)

成果图

    STEP1 创建工作空间

    mkdir -p car_ws/srccd car_wscatkin_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

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

          STEP4 car/urdf/xacro

          创建 car.urdf.xacro

            car/urdf/xacro/car.urdf.xacro

                        

            STEP5 car/launch

            创建 control.launch

              car/launch/control.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: trueToolbars:  toolButtonStyle: 2Visualization 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:       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:       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
                                          

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

                              car_ws/src/mbot_teleop/scripts/mbot_teleop.py
                              #!/usr/bin/env python# -*- coding: utf-8 -*-import rospyfrom geometry_msgs.msg import Twistimport sys, select, termios, ttymsg = """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 stopanything else : stop smoothlyCTRL-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 keyspeed = .2turn = 1def 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_wssource ./devel/setup.bash roslaunch mbot_teleop mbot_teleop.launch

                              出现下图即证明运行成功

                                关键词: